共計 1919 個字符,預計需要花費 5 分鐘才能閱讀完成。
本篇內容主要講解“Numpy 中怎么實現 PCA”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“Numpy 中怎么實現 PCA”吧!
Numpy 中實現 PCA
from numpy import *
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) # 計算列均值
print meanVals # [[ 9.06393644 9.09600218]]
print ======
meanRemoved = dataMat - meanVals #remove mean # 每一列都減去均值
covMat = cov(meanRemoved, rowvar=0) # 計算新矩陣 (減去均值) 協方差
print covMat # [ [ 1.05198368 1.1246314 ]
[ 1.1246314 2.21166499]
]
# 協方差
print ======
eigVals,eigVects = linalg.eig(mat(covMat)) # 計算協方差矩陣的特征值和特征向量
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 的矩陣轉化成 N x 1 的矩陣,維度降到 1
reconMat = (lowDDataMat * redEigVects.T) + meanVals
return lowDDataMat, reconMat
均值: mean(X) = (x0 + x1 + … + xn) / n
標準差:std = Math.sqrt([x0 – mean(x)]^2/(n-1),2)
方差:var=[x0 – mean(x)]^2/(n-1)
比如兩個集合[0,8,12,20]、[8,9,11,12] 均值都是 10. 但是兩個集合的差別很大。計算兩個標準差,前者是 8.3 和后者是 1.8.
顯示后者比較集中。標準差描述了數據的“散布度”。之所以除以 n - 1 而不是 n。是因為能使我們以較小的樣本更好的逼近總體的標準差。即“無偏估計”
為什么需要協方差?
標準差和方差一般是用來描述一維的數據。但是現實生活中,我們常常遇到含有二維數據的數據集。最簡單的是大家上學免不了的統計多個學科的考試成績。多維數據之間的關系。協方差就是這樣一種度量兩個隨機變量關系的統計量
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)
來度量各個維度偏離其均值的程度。
協方差結果的意義:
如果是正值,則說明兩者是正相關,如果結果是負值,則說明兩者是負相關。如果是 0,表示兩者沒有關聯,相互獨立。
多維協方差:矩陣來表示
cov(x,x) cov(x,y) cov(x,z)
C=cov(y,x) cov(y,y) cov(y,z) === 可見協方差矩陣是一個對稱矩陣,而且對角線是各個維度的方差。是 3 *3
cov(z,x) cov(z,y) cov(z,z)
到此,相信大家對“Numpy 中怎么實現 PCA”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!