您的位置:首页 > 编程语言 > Python开发

python 实现PCA

2015-08-24 09:57 831 查看
1.PCA原理介绍

主成分分析(英语Principal
components analysis
PCA)是一种分析、简化数据集的技术。主成分分析经常用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特征。这是通过保留低阶主成分,忽略高阶主成分做到的。这样低阶成分往往能够保留住数据的最重要方面。PCA的核心是处理数据,将需要处理的数据转换到矩阵,一般来只要能够转换为合适矩阵的数据,在计算量非常大的时候都可以通过PCA进行降维,进而达到简化和提速的目的。具体的数据推倒过程,下边这边文章介绍的很好:http://blog.csdn.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降维后的数据:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: