pca演算法python實現
⑴ python pca怎麼得到主成份
一般步驟來實現PCA演算法
(1)零均值化
假如原始數據集為矩陣dataMat,dataMat中每一行代表一個樣本,每一列代表同一個特徵。零均值化就是求每一列的平均值,然後該列上的所有數都減去這個均值。也就是說,這里零均值化是對每一個特徵而言的,零均值化都,每個特徵的均值變成0。實現代碼如下:
[python]view plain
defzeroMean(dataMat):
meanVal=np.mean(dataMat,axis=0)#按列求均值,即求各個特徵的均值
newData=dataMat-meanVal
returnnewData,meanVal
newData,meanVal=zeroMean(dataMat)
covMat=np.cov(newData,rowvar=0)
eigVals,eigVects=np.linalg.eig(np.mat(covMat))
eigValIndice=np.argsort(eigVals)#對特徵值從小到大排序
n_eigValIndice=eigValIndice[-1:-(n+1):-1]#最大的n個特徵值的下標
n_eigVect=eigVects[:,n_eigValIndice]#最大的n個特徵值對應的特徵向量
lowDDataMat=newData*n_eigVect#低維特徵空間的數據
reconMat=(lowDDataMat*n_eigVect.T)+meanVal#重構數據
returnlowDDataMat,reconMat
函數中用numpy中的mean方法來求均值,axis=0表示按列求均值。
該函數返回兩個變數,newData是零均值化後的數據,meanVal是每個特徵的均值,是給後面重構數據用的。
(2)求協方差矩陣
[python]view plain
numpy中的cov函數用於求協方差矩陣,參數rowvar很重要!若rowvar=0,說明傳入的數據一行代表一個樣本,若非0,說明傳入的數據一列代表一個樣本。因為newData每一行代表一個樣本,所以將rowvar設置為0。
covMat即所求的協方差矩陣。
(3)求特徵值、特徵矩陣
調用numpy中的線性代數模塊linalg中的eig函數,可以直接由covMat求得特徵值和特徵向量:
[python]view plain
eigVals存放特徵值,行向量。
eigVects存放特徵向量,每一列帶別一個特徵向量。
特徵值和特徵向量是一一對應的
(4)保留主要的成分[即保留值比較大的前n個特徵]
第三步得到了特徵值向量eigVals,假設裡面有m個特徵值,我們可以對其排序,排在前面的n個特徵值所對應的特徵向量就是我們要保留的,它們組成了新的特徵空間的一組基n_eigVect。將零均值化後的數據乘以n_eigVect就可以得到降維後的數據。代碼如下:
[python]view plain
代碼中有幾點要說明一下,首先argsort對特徵值是從小到大排序的,那麼最大的n個特徵值就排在後面,所以eigValIndice[-1:-(n+1):-1]就取出這個n個特徵值對應的下標。【python裡面,list[a:b:c]代表從下標a開始到b,步長為c。】
⑵ PCA(主成分分析)python實現
回顧了下PCA的步驟,並用python實現。深刻的發現當年學的特徵值、特徵向量好強大。
PCA是一種無監督的學習方式,是一種很常用的降維方法。在數據信息損失最小的情況下,將數據的特徵數量由n,通過映射到另一個空間的方式,變為k(k<n)。
這里用一個2維的數據來說明PCA,選擇2維的數據是因為2維的比較容易畫圖。
這是數據:
畫個圖看看分布情況:
協方差的定義為:
假設n為數據的特徵數,那麼協方差矩陣M, 為一個n n的矩陣,其中Mij為第i和第j個特徵的協方差,對角線是各個特徵的方差。
在我們的數據中,n=2,所以協方差矩陣是2 2的,
通過numpy我們可以很方便的得到:
得到cov的結果為:
array([[ 0.61655556, 0.61544444],
[ 0.61544444, 0.71655556]])
由於我們之前已經做過normalization,因此對於我們來說,
這個矩陣就是 data*data的轉置矩陣。
得到結果:
matrix([[ 5.549, 5.539],
[ 5.539, 6.449]])
我們發現,其實協方差矩陣和散度矩陣關系密切,散度矩陣 就是協方差矩陣乘以(總數據量-1)。因此他們的 特徵根 和 特徵向量 是一樣的。這里值得注意的一點就是,散度矩陣是 SVD奇異值分解 的一步,因此PCA和SVD是有很大聯系的,他們的關系這里就不詳細談了,以後有機會再寫下。
用numpy計算特徵根和特徵向量很簡單,
但是他們代表的意義非常有意思,讓我們將特徵向量加到我們原來的圖里:
其中紅線就是特徵向量。有幾點值得注意:
藍色的三角形就是經過坐標變換後得到的新點,其實他就是紅色原點投影到紅線、藍線形成的。
得到特徵值和特徵向量之後,我們可以根據 特徵值 的大小,從大到小的選擇K個特徵值對應的特徵向量。
這個用python的實現也很簡單:
從eig_pairs選取前k個特徵向量就行。這里,我們只有兩個特徵向量,選一個最大的。
主要將原來的數據乘以經過篩選的特徵向量組成的特徵矩陣之後,就可以得到新的數據了。
output:
數據果然變成了一維的數據。
最後我們通過畫圖來理解下數據經過PCA到底發生了什麼。
綠色的五角星是PCA處理過後得到的一維數據,為了能跟以前的圖對比,將他們的高度定位1.2,其實就是紅色圓點投影到藍色線之後形成的點。這就是PCA,通過選擇特徵根向量,形成新的坐標系,然後數據投影到這個新的坐標系,在盡可能少的丟失信息的基礎上實現降維。
通過上述幾步的處理,我們簡單的實現了PCA第一個2維數據的處理,但是原理就是這樣,我們可以很輕易的就依此實現多維的。
用sklearn的PCA與我們的pca做個比較:
得到結果:
用我們的pca試試
得到結果:
完全一致,完美~
值得一提的是,sklearn中PCA的實現,用了部分SVD的結果,果然他們因緣匪淺。
⑶ PCA闄嶇淮綆楁硶鈥斺斿師鐞嗕笌瀹炵幇
鏈哄櫒瀛︿範鍩虹綆楁硶python浠g爜瀹炵幇鍙鍙傝冿細machine_learning_algorithms銆
1銆佺畝浠
PCA錛圥rincipal Component Analysis錛夋槸涓縐嶅父鐢ㄧ殑鏁版嵁鍒嗘瀽鏂規硶銆侾CA閫氳繃綰挎у彉鎹㈠皢鍘熷嬫暟鎹鍙樻崲涓轟竴緇勫悇緇村害綰挎ф棤鍏崇殑琛ㄧず錛屽彲鐢ㄤ簬鎻愬彇鏁版嵁鐨勪富瑕佺壒寰佸垎閲忥紝甯哥敤浜庨珮緇存暟鎹鐨勯檷緇淬
4涓浜涘筆CA鐨勮ょ煡
PCA鏈璐ㄤ笂鏄灝嗘柟宸鏈澶х殑鏂瑰悜浣滀負涓昏佺壒寰侊紝騫朵笖鍦ㄥ悇涓姝d氦鏂瑰悜涓婂皢鏁版嵁鈥滅葷浉鍏斥濓紝涔熷氨鏄璁╁畠浠鍦ㄤ笉鍚屾d氦鏂瑰悜涓婃病鏈夌浉鍏蟲с
鍥犳わ紝PCA涔熷瓨鍦ㄤ竴浜涢檺鍒訛紝渚嬪傚畠鍙浠ュ緢濂界殑瑙i櫎綰挎х浉鍏籌紝浣嗘槸瀵逛簬楂橀樁鐩稿叧鎬у氨娌℃湁鍔炴硶浜嗭紝瀵逛簬瀛樺湪楂橀樁鐩稿叧鎬х殑鏁版嵁錛屽彲浠ヨ冭檻Kernel PCA錛岄氳繃Kernel鍑芥暟灝嗛潪綰挎х浉鍏寵漿涓虹嚎鎬х浉鍏熾鍙﹀栵紝PCA鍋囪炬暟鎹鍚勪富鐗瑰緛鏄鍒嗗竷鍦ㄦd氦鏂瑰悜涓婏紝濡傛灉鍦ㄩ潪姝d氦鏂瑰悜涓婂瓨鍦ㄥ嚑涓鏂瑰樊杈冨ぇ鐨勬柟鍚戱紝PCA鐨勬晥鏋滃氨澶ф墦鎶樻墸浜嗐
鏈鍚庨渶瑕佽存槑鐨勬槸錛孭CA鏄涓縐嶆棤鍙傛暟鎶鏈錛屼篃灝辨槸璇撮潰瀵瑰悓鏍風殑鏁版嵁錛屽傛灉涓嶈冭檻娓呮礂錛岃皝鏉ュ仛緇撴灉閮戒竴鏍鳳紝娌℃湁涓昏傚弬鏁扮殑浠嬪叆錛屾墍浠PCA渚誇簬閫氱敤瀹炵幇錛屼絾鏄鏈韜鏃犳硶涓鎬у寲鐨勪紭鍖栥