python 实现PCA(二)
1.PCA原理介绍
主成分分析(英语:Principal components analysis,PCA)是一种分析、简化数据集的技术。主成分分析经常用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特征。这是通过保留低阶主成分,忽略高阶主成分做到的。这样低阶成分往往能够保留住数据的最重要方面。PCA的核心是处理数据,将需要处理的数据转换到矩阵,一般来只要能够转换为合适矩阵的数据,在计算量非常大的时候都可以通过PCA进行降维,进而达到简化和提速的目的。具体的数据推倒过程,下边这边文章介绍的很好:http://blog.****.net/watkinsong/article/details/38536463
PCA涉及到比较多的数学知识,matlab、python之类语言都会自带有PCA计算的一些包,经过这样之后,可以方便我们的计算,但同时,当数据量非常大的时候,本身计算PCA的过程也需要耗费大量的内存,后来很多人基于数学理论提出了非常多的快速PCA的算法,扩展了PCA的应用。
2.python实现PCA
根据机器学习实战这本书的指导,利用python的numpy计算库的函数逐一实现PCA的计算过程,加深其理解,最后对获得的数据进行可视化。
- # coding=utf-8
- __author__ = 'Administrator'
- from numpy import *
- # 加载数据,返回mat型数据
- def loadDataSet(filename,delim='\t'):
- fr =open(filename)
- stringArr =[line.strip().split(delim) for line in fr.readlines()]
- datArr =[map(float,line) for line in stringArr]
- return mat(datArr)
- # 进行PCA计算
- def pca(dataMat,topNfeat=9999999):
- #求数据集的平均值,用数据减去其平均值
- meanVals =mean(dataMat,axis=0)
- meanRemoved =dataMat - meanVals
- #计算协方差矩阵
- covMat =cov(meanRemoved,rowvar =0)
- #得到协方差矩阵的特征值和特征向量
- eigvals,eigVects =linalg.eig(mat(covMat))
- #对特征值进行排序
- eigValInd =argsort(eigvals)
- #得到前N个特征值和对应的特征向量
- eigValInd =eigValInd[:-(topNfeat+1):-1]
- redEigVects =eigVects[:,eigValInd]
- #利用特征向量对去掉平均值的数据进行降维
- lowDDataMat =meanRemoved * redEigVects
- #得到最后的输出低维矩阵
- reconMat =(lowDDataMat * redEigVects.T) +meanVals
- return lowDDataMat,reconMat
- if __name__=='__main__':
- import matplotlib
- import matplotlib.pyplot as plt
- # 加载数据
- dataMat =loadDataSet('testSet.txt')
- # 进行pca,这里将数据转换为1维
- lowDat,reconMat =pca(dataMat,1)
- # 显示结果
- fig =plt.figure()
- ax =fig.add_subplot(111)
- ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',s=90)
- ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='o',s=50,c='red')
- plt.show()
程序运行结果如下,蓝色表示原始数据,红色为PCA降维后的数据: