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(特征值数目/奇异值数目)的主要内容,如果未能解决你的问题,请参考以下文章