python pca怎么得到主成份

 我来答
育知同创教育
2017-11-06 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
展开全部

一般步骤来实现PCA算法

(1)零均值化

假如原始数据集为矩阵dataMat,dataMat中每一行代表一个样本,每一列代表同一个特征。零均值化就是求每一列的平均值,然后该列上的所有数都减去这个均值。也就是说,这里零均值化是对每一个特征而言的,零均值化都,每个特征的均值变成0。实现代码如下:

[python] view plain copy

  • def zeroMean(dataMat):        

  • meanVal=np.mean(dataMat,axis=0)     #按列求均值,即求各个特征的均值  

  • newData=dataMat-meanVal  

  • return newData,meanVal  

  • 函数中用numpy中的mean方法来求均值,axis=0表示按列求均值。

    该函数返回两个变量,newData是零均值化后的数据,meanVal是每个特征的均值,是给后面重构数据用的。

    (2)求协方差矩阵

    [python] view plain copy

  • newData,meanVal=zeroMean(dataMat)  

  • covMat=np.cov(newData,rowvar=0)  


  • numpy中的cov函数用于求协方差矩阵,参数rowvar很重要!若rowvar=0,说明传入的数据一行代表一个样本,若非0,说明传入的数据一列代表一个样本。因为newData每一行代表一个样本,所以将rowvar设置为0。

    covMat即所求的协方差矩阵。

    (3)求特征值、特征矩阵

    调用numpy中的线性代数模块linalg中的eig函数,可以直接由covMat求得特征值和特征向量:

    [python] view plain copy

  • eigVals,eigVects=np.linalg.eig(np.mat(covMat))  

  • eigVals存放特征值,行向量。

    eigVects存放特征向量,每一列带别一个特征向量。

    特征值和特征向量是一一对应的

    (4)保留主要的成分[即保留值比较大的前n个特征]

    第三步得到了特征值向量eigVals,假设里面有m个特征值,我们可以对其排序,排在前面的n个特征值所对应的特征向量就是我们要保留的,它们组成了新的特征空间的一组基n_eigVect。将零均值化后的数据乘以n_eigVect就可以得到降维后的数据。代码如下:

    [python] view plain copy

  • eigValIndice=np.argsort(eigVals)            #对特征值从小到大排序  

  • n_eigValIndice=eigValIndice[-1:-(n+1):-1]   #最大的n个特征值的下标  

  • n_eigVect=eigVects[:,n_eigValIndice]        #最大的n个特征值对应的特征向量  

  • lowDDataMat=newData*n_eigVect               #低维特征空间的数据  

  • reconMat=(lowDDataMat*n_eigVect.T)+meanVal  #重构数据  

  • return lowDDataMat,reconMat  


  • 代码中有几点要说明一下,首先argsort对特征值是从小到大排序的,那么最大的n个特征值就排在后面,所以eigValIndice[-1:-(n+1):-1]就取出这个n个特征值对应的下标。【python里面,list[a:b:c]代表从下标a开始到b,步长为c。】

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式