下面寫下用pca對數據進行降維處理的過程:
Python源代碼如下:
1 from numpy import *; 2 def loadDataSet(fileName,delim='\t'): 3 # 打開文件 4 fr=open(fileName); 5 """ 6 >>> line0=fr.readlines(); 7 >>> type(line0) 8 <class 'list'> 9 >>> line0[0] 10 '10.235186\t11.321997\n' 11 """ 12 stringArr=[line.strip().split(delim) for line in fr.readlines()]; 13 # map函數作用於給定序列的每一個元素,並用一個列表來提供返回值 14 datArr=[list(map(lambda x:float(x),line)) for line in stringArr]; 15 dataMat=mat(datArr); 16 return dataMat; 17 18 def pcaFun(dataMat,topNfeat=9999999): 19 # 計算每列的平均值axis=0,計算每行的平均值axis=1 20 meanVals=mean(dataMat,axis=0); 21 # 去平均值,shape(dataMat)=(1000, 2),shape(meanVals)=(1, 2) 22 meanRemoved=dataMat-meanVals;# 可以直接對兩個維度不同的矩陣進行運算 23 # 計算協方差矩陣shape(covMat)=(2, 2) 24 covMat=cov(meanRemoved,rowvar=0); 25 # 計算協方差矩陣的特征值和特征向量 26 eigVals,eigVects=linalg.eig(mat(covMat)); 27 # 對特征值按升序排序 28 eigValInd=argsort(eigVals); 29 # 對特征值進行逆序排序 30 eigValInd=eigValInd[:-(topNfeat+1):-1]; 31 # 計算最大特征值對應的特征向量 32 redEigVects=eigVects[:,eigValInd]; 33 # 計算降維之后的數據集 34 lowDDataMat=meanRemoved*redEigVects; 35 # 重構原始數據 36 reconMat=(lowDDataMat*redEigVects.T)+meanVals; 37 return lowDDataMat,reconMat; 38 39 import matplotlib.pyplot as plt; 40 # 繪圖,繪出原始數據和降維后的數據 41 def plotData(dataMat,reconMat): 42 # import matplotlib; 43 # import matplotlib.pyplot as plt; 44 fig=plt.figure(); 45 ax=fig.add_subplot(111); 46 ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',s=90); 47 ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='o',s=50,c='red'); 48 plt.show();
上面代碼中lowDDataMat為降維后的數據集,reconMat為重構的數據集;繪出原始數據和降維后的數據圖如下: