下面写下用pca对数据进行降维处理的过程:
Python源代码如下:
1 from numpy import *; 2 def loadDataSet(fileName,delim=' '): 3 # 打开文件 4 fr=open(fileName); 5 """ 6 >>> line0=fr.readlines(); 7 >>> type(line0) 8 <class 'list'> 9 >>> line0[0] 10 '10.235186 11.321997 ' 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为重构的数据集;绘出原始数据和降维后的数据图如下: