源代碼:
1 #-*- coding: UTF-8 -*- 2 from numpy import * 3 import numpy 4 def pca(X,CRate): 5 #矩陣X每行是一個樣本 6 #對樣本矩陣進行中心化樣本矩陣 7 meanValue=mean(X,axis=0)#計算每列均值 8 X=X-meanValue#每個維度元素減去對應維度均值 9 #協方差矩陣 10 C=cov(X,rowvar=0) 11 #特征值,特征向量 12 eigvalue,eigvector=linalg.eig(mat(C))#特征值,特征向量 13 #根據貢獻率,來決定取多少個特征向量構成變換矩陣 14 sumEigValue=sum(eigvalue)#所有特征值之和 15 sortedeigvalue= numpy.sort(eigvalue)[::-1] #對特征值從大到小排序 16 for i in range(sortedeigvalue.size): 17 j=i+1 18 rate=sum(eigvalue[0:j])/sumEigValue 19 if rate>CRate: 20 break 21 #取前j個列向量構成變換矩陣 22 indexVec=numpy.argsort(-eigvalue) #對covEigenVal從大到小排序,返回索引 23 nLargestIndex=indexVec[:j] #取出最大的特征值的索引 24 T=eigvector[:,nLargestIndex] #取出最大的特征值對應的特征向量 25 newX=numpy.dot(X,T)#將X矩陣降維得到newX 26 return newX,T,meanValue#返回降維后矩陣newX,變換矩陣T,每列的均值構成的數組