PCA降維算法


PCA主成分分析算法,是一種線性降維,將高維坐標系映射到低維坐標系中。

如何選擇低維坐標系呢?

通過協方差矩陣的特征值和特征向量,特征向量代表坐標系,特征值代表映射到新坐標的長度。

算法步驟:

輸入:樣本集D={x1,x2,...,xm};

   低維空間維數k

第一步:將樣本集中心化。每一列的特征值減去當前列的均值

第二步:求協方差矩陣的特征值特征向量

    協方差矩陣:矩陣×矩陣的轉置;

      方法:np.dot(x, np.transpot(x))

    特征值和特征向量:協方差矩陣特征分解。

      方法一:np.linalg.eig()返回:特征值,一維數組,沒有排序;特征向量,二維數組,列表示特征向量

      方法二:np.linalg.svd(),返回:酉矩陣;奇異值,從大到小排序;酉矩陣

第三步:選取前k個特征值,對應的特征向量

    新樣本集:對應的特征向量×中心化數據

輸出:降維后樣本集。

k選擇問題:

  方差貢獻率:特征值與所有特征值總和的比值

  累計貢獻率:前k個特征值和與所有特征值總和的比值

  一般根據累計貢獻率選取k值。

代碼如下:

 1 import numpy as np
 2 
 3 
 4 def feature_Normalize(x):
 5     """
 6     歸一化數據
 7     (每個數據-當前列的均值)/當前列的標准差
 8     :param x: 樣本集
 9     :return: 歸一化后樣本集,均值,標准差
10     """
11     m, n = x.shape
12     mean = np.zeros((1, n))
13     std = np.zeros((1, n))
14     # 計算各列均值
15     mean = np.mean(x, axis=0)
16     # 計算各列標准差
17     std = np.std(x, axis=0)
18     # 對每個特征值歸一化
19     for i in range(n):
20             x[:, i] = (x[:, i] - mean[i]) / std[i]
21     return x, mean, std
22 
23 
24 def cal_eigenvalue(nor_x):
25     """
26     求樣本協方差矩陣的特征值和特征向量
27     :param nor_x: 歸一化后的樣本集
28     :return: 特征值,特征向量,排序索引號
29     """
30     m, n = nor_x.shape
31     # 協方差矩陣
32     sigma = np.dot(np.transpose(nor_x), nor_x)/(m - 1)
33     # 求協方差矩陣的特征值和特征向量,eig_vec[:,i]是對應於eig_val[i]的特征向量
34     eig_val, eig_vec = np.linalg.eig(sigma)
35     index = eig_val.argsort()
36     return eig_val, eig_vec, index
37 
38 
39 def pca(x, k):
40     """
41     提取前k個主成分
42     :param x: 樣本集
43     :param k: 前k個特征值
44     :return: 返回降維后樣本,累計貢獻度,主成分索引
45     """
46     # 歸一化
47     nor_x, mean, std = feature_Normalize(x)
48     # 求特征值和特征向量
49     eig_val, eig_vec, index = cal_eigenvalue(nor_x)
50     eig_index = index[:-(k+1):-1]
51     # 累計貢獻度
52     sum_con = sum(eig_val[eig_index])/sum(eig_val)
53     # 前k個特征值對應的特征向量
54     k_eig_vec = eig_vec[:, eig_index]
55     lowDData = np.dot(nor_x, k_eig_vec)
56     return lowDData, sum_con, eig_index

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM