【问题标题】:Python sklearn PCA.explained_variance_ratio_ doesn't sum to 1Python sklearn PCA.explained_variance_ratio_ 总和不等于 1
【发布时间】:2017-06-19 12:47:33
【问题描述】:

我正在使用 sklearn 的 PCA 模块。我正在使用以下代码来设置分析。

from sklearn.decomposition import PCA
pca = PCA(n_components=9)
p = pca.fit([row[:-1] for row in norm])

norm 这是我的规范化数据集,最后一列有唯一标识符,这就是我在最后一行删除它的原因。这个数据集中有 9 个特征,所以我希望 9 个组件不会有无法解释的差异。但是,当我致电 p.explained_variance_.cumsum() 时,我得到:

[ 0.06589563  0.08608778  0.09578116  0.10150195  0.10703567  0.11036608
  0.11241904  0.11422285  0.11591605]

我对 PCA 有误解吗?我以前使用过这个模块没有问题,但已经有一段时间了。我设置错了吗?我剥离了我的数据中的任何识别信息,以便在此处发布。以下是似乎在复制问题的数据子集。

[0.3888888888888889, 0.3888888888888889, 0.3888888888888889, 0.436943311456892, 0.7905900031193156, 0.5020468092219706, 0.8389717734280283, 0.7604923090797432, 0.8206054422776056, '0']
[0.3888888888888889, 0.3888888888888889, 0.2222222222222222, 0.4457200178477334, 0.8114779465247448, 0.506899600792241, 0.8368566485573798, 0.760617288778523, 0.8195489478905984, '1']
[0.2777777777777778, 0.2777777777777778, 0.05555555555555555, 0.4426231291814084, 0.7883413226205706, 0.5037172133121759, 0.8370362549229062, 0.7599752704033258, 0.8184218722901648, '2']
[0.1111111111111111, 0.1111111111111111, 0.16666666666666666, 0.4651807845446571, 0.7983379003654792, 0.5250604537887904, 0.8463875215362144, 0.7533582308429306, 0.8241548325954007, '3']
[0.5000000000000001, 0.5000000000000001, 0.3333333333333333, 0.4457200178477334, 0.7878040593905666, 0.506899600792241, 0.8368566485573798, 0.7605016058324149, 0.8195489478905984, '4']
[0.3888888888888889, 0.3888888888888889, 0.2222222222222222, 0.44943322185630036, 0.7843622888520198, 0.5055757644148106, 0.8351253941103399, 0.7604171267769607, 0.8185442945328569, '5']
[0.3888888888888889, 0.3888888888888889, 0.3333333333333333, 0.4424914587425397, 0.7877430312713435, 0.5029950110274568, 0.836692391332608, 0.760611529525946, 0.8198150075184326, '6']
[0.3333333333333333, 0.05555555555555555, 0.7777777777777778, 0.4389415113841421, 0.7878040593905666, 0.506899600792241, 0.8368566485573798, 0.7605016058324149, 0.8195489478905984, '7']
[0.4444444444444444, 0.4444444444444444, 0.4444444444444444, 0.42770705188736874, 0.7976039510596705, 0.5057230657076256, 0.8368566485573798, 0.7605016058324149, 0.8195489478905984, '8']
[0.2222222222222222, 0.2777777777777778, 0.5000000000000001, 0.43182322765312314, 0.7971732873351607, 0.5072390458086798, 0.84541364942531, 0.7613416598875292, 0.8239037851005895, '9']

【问题讨论】:

  • 这个问题在这里比在 CV 社区更适合。我想知道p = pca.fit([row[:-1] for row in norm])的目的是什么。
  • 我也在那里发帖,最终决定这是更好的位置,因为我认为问题的根源更多是我的代码而不是理论
  • 是的,没问题。我对表格不感兴趣,也不知道在哪里发布我的答案。也许您应该考虑删除您在任一社区中的帖子。我看到你发布了部分数据集,但我还没有机会使用它。
  • 是的,我打算删除 CV 帖子,我只是想暂时搁置一下,以便在我失去可能有用的回复之前,让任何回复过更新问题的人在这里回复!
  • 我无法用您刚刚发布的数据重现您的问题(见下文)。

标签: python scikit-learn pca


【解决方案1】:

这是一个包含碎石图的 iris 数据集示例:


尝试使用您刚刚发布的数据集重现您的问题:

d = matrix([[0.3888888888888889, 0.3888888888888889, 0.3888888888888889, 0.436943311456892, 0.7905900031193156, 0.5020468092219706, 0.8389717734280283, 0.7604923090797432, 0.8206054422776056, '0'],
[0.3888888888888889, 0.3888888888888889, 0.2222222222222222, 0.4457200178477334, 0.8114779465247448, 0.506899600792241, 0.8368566485573798, 0.760617288778523, 0.8195489478905984, '1'],
[0.2777777777777778, 0.2777777777777778, 0.05555555555555555, 0.4426231291814084, 0.7883413226205706, 0.5037172133121759, 0.8370362549229062, 0.7599752704033258, 0.8184218722901648, '2'],
[0.1111111111111111, 0.1111111111111111, 0.16666666666666666, 0.4651807845446571, 0.7983379003654792, 0.5250604537887904, 0.8463875215362144, 0.7533582308429306, 0.8241548325954007, '3'],
[0.5000000000000001, 0.5000000000000001, 0.3333333333333333, 0.4457200178477334, 0.7878040593905666, 0.506899600792241, 0.8368566485573798, 0.7605016058324149, 0.8195489478905984, '4'],
[0.3888888888888889, 0.3888888888888889, 0.2222222222222222, 0.44943322185630036, 0.7843622888520198, 0.5055757644148106, 0.8351253941103399, 0.7604171267769607, 0.8185442945328569, '5'],
[0.3888888888888889, 0.3888888888888889, 0.3333333333333333, 0.4424914587425397, 0.7877430312713435, 0.5029950110274568, 0.836692391332608, 0.760611529525946, 0.8198150075184326, '6'],
[0.3333333333333333, 0.05555555555555555, 0.7777777777777778, 0.4389415113841421, 0.7878040593905666, 0.506899600792241, 0.8368566485573798, 0.7605016058324149, 0.8195489478905984, '7'],
[0.4444444444444444, 0.4444444444444444, 0.4444444444444444, 0.42770705188736874, 0.7976039510596705, 0.5057230657076256, 0.8368566485573798, 0.7605016058324149, 0.8195489478905984, '8'],
[0.2222222222222222, 0.2777777777777778, 0.5000000000000001, 0.43182322765312314, 0.7971732873351607, 0.5072390458086798, 0.84541364942531, 0.7613416598875292, 0.8239037851005895, '9']])

【讨论】:

    【解决方案2】:

    关于 CV 堆栈交换的 Amoeba 最终给了我答案 - 这是一个简单的错字。我打电话给p.explained_variance_.cumsum(),但正确的方法调用是p.explained_variance_ratio_.cumsum()。当然,方差不必总和为 1!

    【讨论】:

    • 我很高兴你得到你的答案...对...这是解释的方差百分比...
    猜你喜欢
    • 2020-02-25
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多