zoukankan      html  css  js  c++  java
  • 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特征值的平方根。

    未完待续。。。

  • 相关阅读:
    Redux其实很简单(原理篇)
    基于Docker的UI自动化初探
    视觉设计师的进化
    浅谈容器监控和网易云计算基础服务实践
    微服务实践沙龙-上海站
    知物由学 | 见招拆招,Android应用破解及防护秘籍
    6本互联网技术畅销书免费送(数据分析、深度学习、编程语言)!
    Lily-一个埋点管理工具
    ArcGIS 10 许可配置
    How to Programmatically Add/Delete Custom Options in Magento?
  • 原文地址:https://www.cnblogs.com/cygalaxy/p/6789256.html
Copyright © 2011-2022 走看看