日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python行数最短的PCA实现方式

發(fā)布時(shí)間:2023/12/20 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python行数最短的PCA实现方式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。