python行数最短的PCA实现方式
PCA原理參考鏈接來自:
https://blog.csdn.net/guyuealian/article/details/68487833
原理二
先來原理:
PCA的算法過程,用一句話來說,就是“將所有樣本X減去樣本均值m,再乘以樣本的協(xié)方差矩陣C的單位化(也叫標(biāo)準(zhǔn)化)后的特征向量V,即為PCA主成分分析”,其計(jì)算過程如下:
? ??[1].將原始數(shù)據(jù)按行組成m行n列樣本矩陣X(每行一個(gè)樣本,每列為一維特征)
? ??[2].求出樣本X的協(xié)方差矩陣C和樣本均值m;(Matlab可使用cov()函數(shù)求樣本的協(xié)方差矩陣C,均值用mean函數(shù))
? ??[3].求出協(xié)方差矩陣的特征值D及對應(yīng)的特征向量V;(Matlab可使用eigs()函數(shù)求矩陣的特征值D和特征向量V)
? ??[4].將特征向量按對應(yīng)特征值大小從上到下按行排列成矩陣,取前k行組成矩陣P;(eigs()返回特征值構(gòu)成的向量本身就是從大到小排序的)
? ??[5].Y=(X-m)×P即為降維到k維后的數(shù)據(jù);
上代碼:
#-*- 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"------------------下面是協(xié)方差矩陣-----------------------"Y=np.cov(X.T)#這里必須轉(zhuǎn)置,理由見下方鏈接print Y#計(jì)算協(xié)方差矩陣print"-----------下面是特征值和特征向量------------------------------"#特征值a#這里總結(jié)下:#numpy計(jì)算特征值得到的類型是numpy.ndarray#numpy計(jì)算特征向量得到的類型是numpy.ndarrayeigenvalue,featurevector=np.linalg.eig(Y)print"-----------下面是特征值-----------------------------"idx = eigenvalue.argsort()[::-1] #獲得特征值排序后的順序,這個(gè)函數(shù)適用的前提是numpy.ndarray類型 print"+++++++++++++"print"type(eigenvalue)=",type(eigenvalue)print"type(featurevector)=",type(featurevector)eigenValues = eigenvalue[idx]print"特征值=\n",eigenValuesFeatureVectors = featurevector[:,idx]#featurevector是沒有排序的#FeatureVectors是在特征值排序后,根據(jù)特征值的排序順序進(jìn)行排序的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??
實(shí)驗(yàn)結(jié)果為:
[[-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代碼的運(yùn)行結(jié)果:
%% 樣本矩陣X,有8個(gè)樣本,每個(gè)樣本有4個(gè)特征,使用PCA降維提取k個(gè)主要特征(k<4) k=2; %將樣本降到k維參數(shù)設(shè)置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);%求樣本的協(xié)方差矩陣(散步矩陣除以(n-1)即為協(xié)方差矩陣)?? [V D]=eigs(covX)%求協(xié)方差矩陣的特征值D和特征向量V6?? meanX=mean(X)%樣本均值m?? %所有樣本X減去樣本均值m,再乘以協(xié)方差矩陣(散步矩陣)的特征向量V,即為樣本的主成份SCORE?? tempX=repmat(meanX,Row,1) ans1=X-tempX SCORE2=(X-tempX)*V%主成份:SCORE?? pcaData2=SCORE2(:,1:k)?
可知結(jié)果完全一致。
?
?
?
然后我們來測試下其他博客上的數(shù)據(jù)集,把測試代碼中修改如下:
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
運(yùn)行后可知與連接
https://blog.csdn.net/google19890102/article/details/27969459
的計(jì)算結(jié)果完全一致。
總結(jié)
以上是生活随笔為你收集整理的python行数最短的PCA实现方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: numpy求解矩阵的特征值和特征向量
- 下一篇: windows7下面sublime中使用