【问题标题】:PCA analysis using python scikit-learn - type error使用 python scikit-learn 进行 PCA 分析 - 类型错误
【发布时间】:2017-12-24 18:20:20
【问题描述】:

我正在尝试复制找到 here 的 PCA 示例,但是在尝试运行 pca_summary() 时出现以下错误,非常感谢任何想法。谢谢!

   raise TypeError("data argument can't be an iterator")
TypeError: data argument can't be an iterator

【问题讨论】:

  • 你用的是什么版本的 Python?
  • 我使用的是 3.6.0
  • 我可以使用 python 3.6 重现错误。似乎 pca_summary 函数内部的这一行:summary = pd.DataFrame(zip(a, b, c), index=names, columns=columns) 导致了 python 3.6 中的问题。
  • 那是因为zip 在 python 2.7 上返回一个列表,但在 python 3.6 上返回一个生成器。将其更改为 list(zip(a,b,c))。

标签: python pandas scikit-learn pca


【解决方案1】:

这是zip引起的常见问题。

这是因为zip 在 python 3 中发生了变化,它现在返回一个迭代器。

see also here

pca_summary 函数中这样做:

def pca_summary(pca, standardised_data, out=True):
    names = ["PC"+str(i) for i in range(1, len(pca.explained_variance_ratio_)+1)]
    a = list(np.std(pca.transform(standardised_data), axis=0))
    b = list(pca.explained_variance_ratio_)
    c = [np.sum(pca.explained_variance_ratio_[:i]) for i in range(1, len(pca.explained_variance_ratio_)+1)]
    columns = pd.MultiIndex.from_tuples([("sdev", "Standard deviation"), ("varprop", "Proportion of Variance"), ("cumprop", "Cumulative Proportion")])
    summary = pd.DataFrame(list(zip(a, b, c)), index=names, columns=columns)
    if out:
        print("Importance of components:")
        display(summary)
    return summary

所以直接替换

summary = pd.DataFrame(zip(a, b, c), index=names, columns=columns)

summary = pd.DataFrame(list(zip(a, b, c)), index=names, columns=columns)

【讨论】:

    猜你喜欢
    • 2015-03-21
    • 2015-02-04
    • 2020-10-23
    • 2018-03-23
    • 2019-03-05
    • 1970-01-01
    • 2016-05-16
    • 2015-07-26
    • 2019-05-21
    相关资源
    最近更新 更多