使用python利用pca对数据降维处理

下面写下用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为重构的数据集;绘出原始数据和降维后的数据图如下:

 

 

posted @ 2014-12-04 12:00  志者之梦  阅读(8631)  评论(1编辑  收藏  举报