python中pca函數(shù) python PCA

python pca怎么得到主成份

一般步驟來(lái)實(shí)現(xiàn)PCA算法

成都創(chuàng)新互聯(lián)公司專注于企業(yè)網(wǎng)絡(luò)營(yíng)銷推廣、網(wǎng)站重做改版、貴南網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5場(chǎng)景定制、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為貴南等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

(1)零均值化

假如原始數(shù)據(jù)集為矩陣dataMat,dataMat中每一行代表一個(gè)樣本,每一列代表同一個(gè)特征。零均值化就是求每一列的平均值,然后該列上的所有數(shù)都減去這個(gè)均值。也就是說(shuō),這里零均值化是對(duì)每一個(gè)特征而言的,零均值化都,每個(gè)特征的均值變成0。實(shí)現(xiàn)代碼如下:

[python]?view plain?copy

def?zeroMean(dataMat):

meanVal=np.mean(dataMat,axis=0)?????#按列求均值,即求各個(gè)特征的均值

newData=dataMat-meanVal

return?newData,meanVal

函數(shù)中用numpy中的mean方法來(lái)求均值,axis=0表示按列求均值。

該函數(shù)返回兩個(gè)變量,newData是零均值化后的數(shù)據(jù),meanVal是每個(gè)特征的均值,是給后面重構(gòu)數(shù)據(jù)用的。

(2)求協(xié)方差矩陣

[python]?view plain?copy

newData,meanVal=zeroMean(dataMat)

covMat=np.cov(newData,rowvar=0)

numpy中的cov函數(shù)用于求協(xié)方差矩陣,參數(shù)rowvar很重要!若rowvar=0,說(shuō)明傳入的數(shù)據(jù)一行代表一個(gè)樣本,若非0,說(shuō)明傳入的數(shù)據(jù)一列代表一個(gè)樣本。因?yàn)閚ewData每一行代表一個(gè)樣本,所以將rowvar設(shè)置為0。

covMat即所求的協(xié)方差矩陣。

(3)求特征值、特征矩陣

調(diào)用numpy中的線性代數(shù)模塊linalg中的eig函數(shù),可以直接由covMat求得特征值和特征向量:

[python]?view plain?copy

eigVals,eigVects=np.linalg.eig(np.mat(covMat))

eigVals存放特征值,行向量。

eigVects存放特征向量,每一列帶別一個(gè)特征向量。

特征值和特征向量是一一對(duì)應(yīng)的

(4)保留主要的成分[即保留值比較大的前n個(gè)特征]

第三步得到了特征值向量eigVals,假設(shè)里面有m個(gè)特征值,我們可以對(duì)其排序,排在前面的n個(gè)特征值所對(duì)應(yīng)的特征向量就是我們要保留的,它們組成了新的特征空間的一組基n_eigVect。將零均值化后的數(shù)據(jù)乘以n_eigVect就可以得到降維后的數(shù)據(jù)。代碼如下:

[python]?view plain?copy

eigValIndice=np.argsort(eigVals)????????????#對(duì)特征值從小到大排序

n_eigValIndice=eigValIndice[-1:-(n+1):-1]???#最大的n個(gè)特征值的下標(biāo)

n_eigVect=eigVects[:,n_eigValIndice]????????#最大的n個(gè)特征值對(duì)應(yīng)的特征向量

lowDDataMat=newData*n_eigVect???????????????#低維特征空間的數(shù)據(jù)

reconMat=(lowDDataMat*n_eigVect.T)+meanVal??#重構(gòu)數(shù)據(jù)

return?lowDDataMat,reconMat

代碼中有幾點(diǎn)要說(shuō)明一下,首先argsort對(duì)特征值是從小到大排序的,那么最大的n個(gè)特征值就排在后面,所以eigValIndice[-1:-(n+1):-1]就取出這個(gè)n個(gè)特征值對(duì)應(yīng)的下標(biāo)?!緋ython里面,list[a:b:c]代表從下標(biāo)a開(kāi)始到b,步長(zhǎng)為c?!?/p>

python 有直接求pca的函數(shù)么

[coef,SCORE,latent] = princomp(A); latentsum = sum(latent); for i = 1:col%A的總列數(shù) if sum(latent(1:i))/latentsum threshold%閾值 eg:0.95 tranM = coef(:,1:i); break; end end B = A* tranM;

python怎么數(shù)據(jù)進(jìn)行pca

基本步驟:

對(duì)數(shù)據(jù)進(jìn)行歸一化處理(代碼中并非這么做的,而是直接減去均值)

計(jì)算歸一化后的數(shù)據(jù)集的協(xié)方差矩陣

計(jì)算協(xié)方差矩陣的特征值和特征向量

保留最重要的k個(gè)特征(通常k要小于n),也可以自己制定,也可以選擇一個(gè)閾值,然后通過(guò)前k個(gè)特征值之和減去后面n-k個(gè)特征值之和大于這個(gè)閾值,則選擇這個(gè)k

找出k個(gè)特征值對(duì)應(yīng)的特征向量

將m * n的數(shù)據(jù)集乘以k個(gè)n維的特征向量的特征向量(n * k),得到最后降維的數(shù)據(jù)。

其實(shí)PCA的本質(zhì)就是對(duì)角化協(xié)方差矩陣。有必要解釋下為什么將特征值按從大到小排序后再選。首先,要明白特征值表示的是什么?在線性代數(shù)里面我們求過(guò)無(wú)數(shù)次了,那么它具體有什么意義呢?對(duì)一個(gè)n*n的對(duì)稱矩陣進(jìn)行分解,我們可以求出它的特征值和特征向量,就會(huì)產(chǎn)生n個(gè)n維的正交基,每個(gè)正交基會(huì)對(duì)應(yīng)一個(gè)特征值。然后把矩陣投影到這N個(gè)基上,此時(shí)特征值的模就表示矩陣在該基的投影長(zhǎng)度。

特征值越大,說(shuō)明矩陣在對(duì)應(yīng)的特征向量上的方差越大,樣本點(diǎn)越離散,越容易區(qū)分,信息量也就越多。因此,特征值最大的對(duì)應(yīng)的特征向量方向上所包含的信息量就越多,如果某幾個(gè)特征值很小,那么就說(shuō)明在該方向的信息量非常少,我們就可以刪除小特征值對(duì)應(yīng)方向的數(shù)據(jù),只保留大特征值方向?qū)?yīng)的數(shù)據(jù),這樣做以后數(shù)據(jù)量減小,但有用的信息量都保留下來(lái)了。PCA就是這個(gè)原理。

PCA(主成分分析)python實(shí)現(xiàn)

回顧了下PCA的步驟,并用python實(shí)現(xiàn)。深刻的發(fā)現(xiàn)當(dāng)年學(xué)的特征值、特征向量好強(qiáng)大。

PCA是一種無(wú)監(jiān)督的學(xué)習(xí)方式,是一種很常用的降維方法。在數(shù)據(jù)信息損失最小的情況下,將數(shù)據(jù)的特征數(shù)量由n,通過(guò)映射到另一個(gè)空間的方式,變?yōu)閗(kn)。

這里用一個(gè)2維的數(shù)據(jù)來(lái)說(shuō)明PCA,選擇2維的數(shù)據(jù)是因?yàn)?維的比較容易畫圖。

這是數(shù)據(jù):

畫個(gè)圖看看分布情況:

協(xié)方差的定義為:

假設(shè)n為數(shù)據(jù)的特征數(shù),那么協(xié)方差矩陣M, 為一個(gè)n n的矩陣,其中Mij為第i和第j個(gè)特征的協(xié)方差,對(duì)角線是各個(gè)特征的方差。

在我們的數(shù)據(jù)中,n=2,所以協(xié)方差矩陣是2 2的,

通過(guò)numpy我們可以很方便的得到:

得到cov的結(jié)果為:

array([[ 0.61655556, 0.61544444],

[ 0.61544444, 0.71655556]])

由于我們之前已經(jīng)做過(guò)normalization,因此對(duì)于我們來(lái)說(shuō),

這個(gè)矩陣就是 data*data的轉(zhuǎn)置矩陣。

得到結(jié)果:

matrix([[ 5.549, 5.539],

[ 5.539, 6.449]])

我們發(fā)現(xiàn),其實(shí)協(xié)方差矩陣和散度矩陣關(guān)系密切,散度矩陣 就是協(xié)方差矩陣乘以(總數(shù)據(jù)量-1)。因此他們的 特征根 和 特征向量 是一樣的。這里值得注意的一點(diǎn)就是,散度矩陣是 SVD奇異值分解 的一步,因此PCA和SVD是有很大聯(lián)系的,他們的關(guān)系這里就不詳細(xì)談了,以后有機(jī)會(huì)再寫下。

用numpy計(jì)算特征根和特征向量很簡(jiǎn)單,

但是他們代表的意義非常有意思,讓我們將特征向量加到我們?cè)瓉?lái)的圖里:

其中紅線就是特征向量。有幾點(diǎn)值得注意:

藍(lán)色的三角形就是經(jīng)過(guò)坐標(biāo)變換后得到的新點(diǎn),其實(shí)他就是紅色原點(diǎn)投影到紅線、藍(lán)線形成的。

得到特征值和特征向量之后,我們可以根據(jù) 特征值 的大小,從大到小的選擇K個(gè)特征值對(duì)應(yīng)的特征向量。

這個(gè)用python的實(shí)現(xiàn)也很簡(jiǎn)單:

從eig_pairs選取前k個(gè)特征向量就行。這里,我們只有兩個(gè)特征向量,選一個(gè)最大的。

主要將原來(lái)的數(shù)據(jù)乘以經(jīng)過(guò)篩選的特征向量組成的特征矩陣之后,就可以得到新的數(shù)據(jù)了。

output:

數(shù)據(jù)果然變成了一維的數(shù)據(jù)。

最后我們通過(guò)畫圖來(lái)理解下數(shù)據(jù)經(jīng)過(guò)PCA到底發(fā)生了什么。

綠色的五角星是PCA處理過(guò)后得到的一維數(shù)據(jù),為了能跟以前的圖對(duì)比,將他們的高度定位1.2,其實(shí)就是紅色圓點(diǎn)投影到藍(lán)色線之后形成的點(diǎn)。這就是PCA,通過(guò)選擇特征根向量,形成新的坐標(biāo)系,然后數(shù)據(jù)投影到這個(gè)新的坐標(biāo)系,在盡可能少的丟失信息的基礎(chǔ)上實(shí)現(xiàn)降維。

通過(guò)上述幾步的處理,我們簡(jiǎn)單的實(shí)現(xiàn)了PCA第一個(gè)2維數(shù)據(jù)的處理,但是原理就是這樣,我們可以很輕易的就依此實(shí)現(xiàn)多維的。

用sklearn的PCA與我們的pca做個(gè)比較:

得到結(jié)果:

用我們的pca試試

得到結(jié)果:

完全一致,完美~

值得一提的是,sklearn中PCA的實(shí)現(xiàn),用了部分SVD的結(jié)果,果然他們因緣匪淺。

網(wǎng)站題目:python中pca函數(shù) python PCA
標(biāo)題URL:http://muchs.cn/article48/dooohep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、關(guān)鍵詞優(yōu)化、App開(kāi)發(fā)、

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司