【问题标题】:Python scikit learn pca.explained_variance_ratio_ cutoffPython scikit 学习 pca.explained_variance_ratio_cutoff
【发布时间】:2015-09-30 03:00:12
【问题描述】:

在选择主成分的数量 (k) 时,我们选择 k 作为最小值,以便保留例如 99% 的方差。

但是,在 Python Scikit 学习中,我不是 100% 确定 pca.explained_variance_ratio_ = 0.99 等于“保留了 99% 的方差”?有人能解惑吗?谢谢。

  • Python Scikit 学习 PCA 手册在这里

http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA

【问题讨论】:

    标签: python scikit-learn pca


    【解决方案1】:

    是的,你几乎是对的。 pca.explained_variance_ratio_ 参数返回每个维度解释的方差向量。因此pca.explained_variance_ratio_[i] 给出了仅由第 i+1 维解释的方差。

    你可能想做pca.explained_variance_ratio_.cumsum()。这将返回一个向量 x,这样 x[i] 返回由前 i+1 个维度解释的累积方差。

    import numpy as np
    from sklearn.decomposition import PCA
    
    np.random.seed(0)
    my_matrix = np.random.randn(20, 5)
    
    my_model = PCA(n_components=5)
    my_model.fit_transform(my_matrix)
    
    print my_model.explained_variance_
    print my_model.explained_variance_ratio_
    print my_model.explained_variance_ratio_.cumsum()
    

    [ 1.50756565  1.29374452  0.97042041  0.61712667  0.31529082]
    [ 0.32047581  0.27502207  0.20629036  0.13118776  0.067024  ]
    [ 0.32047581  0.59549787  0.80178824  0.932976    1.        ]
    

    所以在我的随机玩具数据中,如果我选择k=4,我会保留 93.3% 的方差。

    【讨论】:

    • 非常感谢!很好的解释!有时 Python 手册的文档/解释很差。我完全开悟了!
    • 还有一个问题:当我们做 PCA(n_components=1) 时,scikit learn “PCA”命令执行“从归一化数据计算协方差矩阵”和“使用单值分解 (SVD)计算特征向量“?在 Python scikit learn PCA 模块中,我看不到任何地方可以选择其他方法来计算特征向量。
    • 很好的答案!这真的帮助了我
    • 我认为复制结果的第一个成员中缺少一些“*e-int”。这可能会令人困惑。否则,这很棒! +1
    • @AChervony,不确定你的意思。
    【解决方案2】:

    虽然这个问题已经超过 2 年,但我想提供一个更新。 我也想做同样的事情,看起来 sklearn 现在提供了开箱即用的功能。

    docs中所述

    如果 0

    所以现在需要的代码是

    my_model = PCA(n_components=0.99, svd_solver='full')
    my_model.fit_transform(my_matrix)
    

    【讨论】:

      【解决方案3】:

      这对我有用,在 PCA 部分输入更少。 为方便起见,添加了其余部分。只有“数据”需要在更早的阶段进行定义。

      import sklearn as sl
      from sklearn.preprocessing import StandardScaler as ss
      from sklearn.decomposition import PCA 
      
      st = ss().fit_transform(data)
      pca = PCA(0.80)
      pc = pca.fit_transform(st) # << to retain the components in an object
      pc
      
      #pca.explained_variance_ratio_
      print ( "Components = ", pca.n_components_ , ";\nTotal explained variance = ",
            round(pca.explained_variance_ratio_.sum(),5)  )
      

      【讨论】:

        猜你喜欢
        • 2015-12-22
        • 2016-05-23
        • 2023-04-10
        • 1970-01-01
        • 2018-10-21
        • 2016-12-20
        • 2017-04-26
        • 2016-07-16
        • 2017-12-11
        相关资源
        最近更新 更多