本篇內(nèi)容主要講解“Numpy中怎么實(shí)現(xiàn)PCA”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Numpy中怎么實(shí)現(xiàn)PCA”吧!
創(chuàng)新互聯(lián)公司是專業(yè)的魯?shù)榫W(wǎng)站建設(shè)公司,魯?shù)榻訂?提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行魯?shù)榫W(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
Numpy中實(shí)現(xiàn)PCA
from numpy import * ''' 10.235186 11.321997 10.122339 11.810993 9.190236 8.904943 9.306371 9.847394 8.330131 8.340352 10.152785 10.123532 10.408540 10.821986 ... ... ''' def loadDataSet(fileName, delim='\t'): fr = open(fileName) stringArr = [line.strip().split(delim) for line in fr.readlines()] datArr = [map(float,line) for line in stringArr] return mat(datArr) def pca(dataMat, topNfeat=9999999): meanVals = mean(dataMat, axis=0) #計(jì)算列均值 print meanVals # [[ 9.06393644 9.09600218]] print '======' meanRemoved = dataMat - meanVals #remove mean # 每一列都減去均值 covMat = cov(meanRemoved, rowvar=0) # 計(jì)算新矩陣(減去均值)協(xié)方差 print covMat # [ [ 1.05198368 1.1246314 ] [ 1.1246314 2.21166499] ] #協(xié)方差 print '======' eigVals,eigVects = linalg.eig(mat(covMat)) #計(jì)算協(xié)方差矩陣的特征值和特征向量 print eigVals # [ 0.36651371 2.89713496] print '======' print eigVects # [ [-0.85389096 -0.52045195] [ 0.52045195 -0.85389096] ] print '======' eigValInd = argsort(eigVals) #按照特征值從大到小排序。選擇topN eigValInd = eigValInd[:-(topNfeat+1):-1] redEigVects = eigVects[:,eigValInd] print redEigVects print '======' #[ [-0.52045195] [-0.85389096] ] lowDDataMat = meanRemoved * redEigVects # N x 2 * 2 x 1 ==> N x 1 即把N x 2的矩陣轉(zhuǎn)化成N x 1 的矩陣,維度降到1 reconMat = (lowDDataMat * redEigVects.T) + meanVals return lowDDataMat, reconMat
均值: mean(X) = (x0 + x1 + ... + xn) / n
標(biāo)準(zhǔn)差:std = Math.sqrt([x0 - mean(x)]^2/(n-1),2)
方差:var=[x0 - mean(x)]^2/(n-1)
比如兩個(gè)集合[0,8,12,20]、[8,9,11,12] 均值都是10.但是兩個(gè)集合的差別很大。計(jì)算兩個(gè)標(biāo)準(zhǔn)差,前者是8.3和后者是1.8.
顯示后者比較集中。標(biāo)準(zhǔn)差描述了數(shù)據(jù)的“散布度”。之所以除以n-1而不是n。是因?yàn)槟苁刮覀円暂^小的樣本更好的逼近總體的標(biāo)準(zhǔn)差。即“無(wú)偏估計(jì)”
為什么需要協(xié)方差?
標(biāo)準(zhǔn)差和方差一般是用來(lái)描述一維的數(shù)據(jù)。但是現(xiàn)實(shí)生活中,我們常常遇到含有二維數(shù)據(jù)的數(shù)據(jù)集。最簡(jiǎn)單的是大家上學(xué)免不了的統(tǒng)計(jì)多個(gè)學(xué)科的考試成績(jī)。多維數(shù)據(jù)之間的關(guān)系。協(xié)方差就是這樣一種度量?jī)蓚€(gè)隨機(jī)變量關(guān)系的統(tǒng)計(jì)量
var(X) = {Math.pow(xi-mean(X),2)}/(n-1) = {xi-mean(X)}{xi-mean(X)}/(n-1)
仿照方差的定義:
cov(X,Y)= {xi-mean(X)}{yi-mean(Y)}/(n-1)
來(lái)度量各個(gè)維度偏離其均值的程度。
協(xié)方差結(jié)果的意義:
如果是正值,則說(shuō)明兩者是正相關(guān),如果結(jié)果是負(fù)值,則說(shuō)明兩者是負(fù)相關(guān)。如果是0,表示兩者沒(méi)有關(guān)聯(lián),相互獨(dú)立。
多維協(xié)方差:矩陣來(lái)表示
cov(x,x) cov(x,y) cov(x,z)
C=cov(y,x) cov(y,y) cov(y,z) ===> 可見(jiàn)協(xié)方差矩陣是一個(gè)對(duì)稱矩陣,而且對(duì)角線是各個(gè)維度的方差。 是3*3
cov(z,x) cov(z,y) cov(z,z)
到此,相信大家對(duì)“Numpy中怎么實(shí)現(xiàn)PCA”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!