PCA原理及实现

来源:互联网 发布:淘宝双十一成交额实时 编辑:程序博客网 时间:2024/06/05 09:02

1、数学原理

步骤:
1.用X表示原有数据;
2.零均值化;
3.求协方差矩阵;
4.求特征值和特征向量;
5.根据相应的特征值把特征向量从大到小排序,从组成的矩阵选取K行代表降维的基(K维);
6.降维的基和原有数据X相乘,即为降维后的数据Y

2、MATLAB实现

3、python实现

#pcaimport numpy as npdataMat= np.loadtxt(open(r'G:\训练小样本2.csv',"rb"),delimiter=",",skiprows=0)  #零均值化def zeroMean(dataMat):            meanVal=np.mean(dataMat,axis=0)     #按列求均值,即求各个特征的均值      newData=dataMat-meanVal      return newData,meanVal  def pca(dataMat,n):      #求协方差矩阵    newData,meanVal=zeroMean(dataMat)      covMat=np.cov(newData,rowvar=0)    #求协方差矩阵,return ndarray;若rowvar非0,一列代表一个样本,为0,一行代表一个样本      #求特征值、特征矩阵     eigVals,eigVects=np.linalg.eig(np.mat(covMat))#求特征值和特征向量,特征向量是按列放的,即一列代表一个特征向量      # print(eigVals)    # print(eigVects)    #保留主要的成分[即保留值比较大的前n个特征]    eigValIndice=np.argsort(eigVals)            #对特征值从小到大排序      # print(eigValIndice)    n_eigValIndice=eigValIndice[-1:-(n+1):-1]   #最大的n个特征值的下标      # print(n_eigValIndice)    n_eigVect=eigVects[:,n_eigValIndice]        #最大的n个特征值对应的特征向量      print(n_eigVect)    lowDDataMat=newData*n_eigVect               #低维特征空间的数据      reconMat=(lowDDataMat*n_eigVect.T)+meanVal  #重构数据      # print(lowDDataMat)    # print(reconMat)    return lowDDataMat,reconMat  # [newData,meanVal]=zeroMean(dataMat)[a,b]=pca(dataMat,2)# print(a)# print(b)# print(newData)# print(meanVal)

代码解释:

1.newData=dataMat-meanVal ,返回零均值化结果

2.eigVals,eigVects=np.linalg.eig(np.mat(covMat)),返回矩阵的特征值、特征向量

#特征值[  4.27623823e+01   4.39882621e+00   1.00919422e+00   1.79586824e-03   1.29584233e-03]#特征向量[[ -2.49078536e-01   9.59959063e-01   1.28022644e-01  -6.97723720e-03   -2.95702270e-05] [  1.33074844e-02   3.12351351e-02  -1.56277491e-01   9.53854600e-01    2.54137809e-01] [ -8.09197847e-03  -4.41528939e-03   3.14396428e-02   2.62359608e-01   -9.64413817e-01] [  4.91864942e-02   1.41753127e-01  -9.75180514e-01  -1.45780429e-01   -7.25104921e-02] [ -9.67108061e-01  -2.39561098e-01  -8.49827190e-02   5.31259008e-03    7.88617062e-03]]

3.eigValIndice=np.argsort(eigVals)特征值从小到大排序

[4 3 2 1 0]

4、n_eigValIndice=eigValIndice[-1:-(n+1):-1]最大n个特征的索引值(下标)

[0 1]#2

5.n_eigVect=eigVects[:,n_eigValIndice],最大n个特征值的特征向量(取n列,避免了转置步骤)

[[-0.24907854  0.95995906] [ 0.01330748  0.03123514] [-0.00809198 -0.00441529] [ 0.04918649  0.14175313] [-0.96710806 -0.2395611 ]]

6.reconMat=(lowDDataMat*n_eigVect.T)+meanVal #重构数据


参考:
1. PCA的数学原理;
2. python实现PCA