PCA/SVD--怎样确定topNfeat(特征值数目/奇异值数目)

Posted halo_vagabond

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PCA/SVD--怎样确定topNfeat(特征值数目/奇异值数目)相关的知识,希望对你有一定的参考价值。

Coding by Chang, 2017/04/30

1.主成分分析(PCA)

1.1 PCA数学模型

  最大可分性出发(参考《机器学习》周志华):样本点在超平面上的投影能尽可能分开。

  即应该使投影后样本点的方差最大化:

    maxtr(WTXXTW)     s.t. WTW=I

  这个目标函数可以通过对协方差矩阵XXT做特征值分解求得转换矩阵W.

  降维原理:在W对应的开始r个主成分之后,方差就会迅速下降。这意味着数据集X中只有r个重要特征。

1.2 实践中确定topNfeat数目方法:

  在选择开始几个主成分后,方差就会迅速下降,可以通过计算方差百分比来确定topNfeat的具体数目。

  方差百分比=sum(the selected eigvals)/sum(all eigVals)

  修改pca主函数为如下

 1 def pca(dataMat,topNfea=9999999):
 2     meanVals=mean(dataMat,axis=0)            
 3     meanRemoved=dataMat-meanVals
 4     covMat=cov(meanRemoved,rowvar=0)      
 5     eigVals,eigVects=linalg.eig(mat(covMat)) 
 6     eigValInd=argsort(eigVals)
 7     eigValInd=eigValInd[:-(topNfea+1):-1]
 8     ###
 9         #确定topNfea数目
10     sumOfEigVals=sum(eigVals)
11     total=0.0
12     for j in range(topNfea):
13         total+=eigVals[eigValInd[j]]
14         percent=total/sumOfEigVals
15         if percent>0.98:
16              print \'the number of eigVals: %d, var: %f\' %(j,percent)
17              print \'the best number of topNfeat:\' ,j
18              break
19         print \'the number of %d has occupied %f\' %(j,percent)
20     #
21         #取前20个特征值画方差变化图
22      fig = plt.figure()
23      ax=fig.add_subplot(111)
24      percentFeat=eigVals[eigValInd][0:20]/sumOfEigVals
25      x=arange(20)
26      ax.plot(x,percentFeat,\'o-\',c=\'r\')
27      plt.xlabel(\'the number of princple feature\')
28      plt.ylabel(\'var percent(%)\')
29      plt.grid()
30      plt.show()
31         ###
32         #取j+1个对应的特征向量,组成转换矩阵redEigVects
33     redEigVects=eigVects[:,eigValInd[:j]]        lowDDataMat=meanRemoved*redEigVects      
34     reconMat=(lowDDataMat*redEigVects.T)+meanVals    
35     return lowDDataMat,reconMat              #返回降维矩阵和重构矩阵

  得到结果图:

 

2.奇异值分解(SVD)

2.1 SVD数学模型为:

    Xm×n=Um×mΣm×nVTn×n

  Σ矩阵的对角元素称为“奇异值”。

  Σ矩阵的两个特点:只有对角元素,其他元素为0;对角元素从大到小排列;

  降维原理:在r个奇异值之后,其他的奇异值都置为0. 这意味着数据集X中只有r个重要特征。

2.2 利用python实现SVD

  依赖库:python内部线性代数工具箱 numpy.linalg

  实现方法:linalg.svd()

  

  注意:Σ是对角矩阵,但是它“只返回对角元素”,节省空间。

3.特征值与奇异值之间的关系

  奇异值就是矩阵X*XT特征值的平方根。

未完待续。。。

以上是关于PCA/SVD--怎样确定topNfeat(特征值数目/奇异值数目)的主要内容,如果未能解决你的问题,请参考以下文章

聚类 高维聚类 聚类评估标准

机器学习 --- 降维(Dimensionality Reduction)

原创:矩阵论学习心得

PRINCE2特征

不知道怎样计算权重?告诉你8种确定权重方法

收藏 | 机器学习模型与算法最全分类汇总!