python行数最短的PCA实现方式
PCA原理參考鏈接來自:
https://blog.csdn.net/guyuealian/article/details/68487833
原理二
先來原理:
PCA的算法過程,用一句話來說,就是“將所有樣本X減去樣本均值m,再乘以樣本的協方差矩陣C的單位化(也叫標準化)后的特征向量V,即為PCA主成分分析”,其計算過程如下:
? ??[1].將原始數據按行組成m行n列樣本矩陣X(每行一個樣本,每列為一維特征)
? ??[2].求出樣本X的協方差矩陣C和樣本均值m;(Matlab可使用cov()函數求樣本的協方差矩陣C,均值用mean函數)
? ??[3].求出協方差矩陣的特征值D及對應的特征向量V;(Matlab可使用eigs()函數求矩陣的特征值D和特征向量V)
? ??[4].將特征向量按對應特征值大小從上到下按行排列成矩陣,取前k行組成矩陣P;(eigs()返回特征值構成的向量本身就是從大到小排序的)
? ??[5].Y=(X-m)×P即為降維到k維后的數據;
上代碼:
#-*- encoding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') import numpy as np from numpy import * def PCA_compute(X,k):X=matrix(X)print"-"*20print "X=",Xprint"------------------下面是協方差矩陣-----------------------"Y=np.cov(X.T)#這里必須轉置,理由見下方鏈接print Y#計算協方差矩陣print"-----------下面是特征值和特征向量------------------------------"#特征值a#這里總結下:#numpy計算特征值得到的類型是numpy.ndarray#numpy計算特征向量得到的類型是numpy.ndarrayeigenvalue,featurevector=np.linalg.eig(Y)print"-----------下面是特征值-----------------------------"idx = eigenvalue.argsort()[::-1] #獲得特征值排序后的順序,這個函數適用的前提是numpy.ndarray類型 print"+++++++++++++"print"type(eigenvalue)=",type(eigenvalue)print"type(featurevector)=",type(featurevector)eigenValues = eigenvalue[idx]print"特征值=\n",eigenValuesFeatureVectors = featurevector[:,idx]#featurevector是沒有排序的#FeatureVectors是在特征值排序后,根據特征值的排序順序進行排序的print"featureVectors=\n",FeatureVectorsprint"-----------下面是平均矩陣(原始矩陣的每列的均值)----------------------------"averageMatrix=np.mean(X, axis=0)#表示沿著y軸取平均# axis=1# ----------------># col1 col2 col3# || row1# axis=0|| row2# || row3# \/print"averageMatrix=",averageMatrixaverageMatrix=averageMatrix.tolist()averageMatrix=averageMatrix[0]MeanMatrix=[]print"len(X[0])=",len(X)for index in range(len(X)):MeanMatrix.append(averageMatrix)MeanMatrix=mat(MeanMatrix)print"MeanMatrix=\n",MeanMatrixprint"-------------------接下來是主成分--------------------------"print mat(featurevector)tempX=mat(X)-mat(MeanMatrix)print tempXprint"FeatureVectors=",FeatureVectorsScore=(mat(X)-mat(MeanMatrix))*mat(FeatureVectors)return Score[:,0:k].copy() if __name__ == '__main__':X=[ [1,2,1,1],[3,3,1,2],[3,5,4,3],[5,4,5,4],[5,6,1,5],[6,5,2,6],[8,7,1,2],[9,8,3,7]]k=2answer=PCA_compute(X,k)print answer??
實驗結果為:
[[-5.79467821 ?0.60705487]
?[-3.38863423 ?0.87952394]
?[-1.61549833 -1.56652328]
?[-0.15133075 -2.50507639]
?[ 0.99576675 ?0.56654487]
?[ 1.7515016 ?-0.65460481]
?[ 2.21615035 ?3.13807448]
?[ 5.98672282 -0.46499368]]
對比matlab代碼的運行結果:
%% 樣本矩陣X,有8個樣本,每個樣本有4個特征,使用PCA降維提取k個主要特征(k<4) k=2; %將樣本降到k維參數設置X=[1 2 1 1;3 3 1 2; 3 5 4 3; 5 4 5 4;5 6 1 5; 6 5 2 6;8 7 1 2;9 8 3 7];[Row Col]=size(X);%注意,matlab中得到的特征向量也是按列來讀取的。 covX=cov(X);%求樣本的協方差矩陣(散步矩陣除以(n-1)即為協方差矩陣)?? [V D]=eigs(covX)%求協方差矩陣的特征值D和特征向量V6?? meanX=mean(X)%樣本均值m?? %所有樣本X減去樣本均值m,再乘以協方差矩陣(散步矩陣)的特征向量V,即為樣本的主成份SCORE?? tempX=repmat(meanX,Row,1) ans1=X-tempX SCORE2=(X-tempX)*V%主成份:SCORE?? pcaData2=SCORE2(:,1:k)?
可知結果完全一致。
?
?
?
然后我們來測試下其他博客上的數據集,把測試代碼中修改如下:
if __name__ == '__main__':
? ? # X=[ [1,2,1,1],
? ? # [3,3,1,2],
? ? # [3,5,4,3],
? ? # [5,4,5,4],
? ? # [5,6,1,5],
? ? # [6,5,2,6],
? ? # [8,7,1,2],
? ? # [9,8,3,7]]
? ? # k=2
? ? X=[[10.2352,11.3220],
? ? [10.1223,11.8110],
? ? [9.1902,8.9049],
? ? [9.3064,9.8474],
? ? [8.3301,8.3404],
? ? [10.1528,10.1235],
? ? [10.4085,10.8220],
? ? [9.0036,10.0392],
? ? [9.5349,10.0970],
? ? [9.4982,10.8254]]
? ? k=1
? ? answer=PCA_compute(X,k)
? ? print answer
運行后可知與連接
https://blog.csdn.net/google19890102/article/details/27969459
的計算結果完全一致。
總結
以上是生活随笔為你收集整理的python行数最短的PCA实现方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: numpy求解矩阵的特征值和特征向量
- 下一篇: windows7下面sublime中使用