Python中缺少值的PCA

Posted

技术标签:

【中文标题】Python中缺少值的PCA【英文标题】:PCA with missing values in Python 【发布时间】:2015-06-07 20:49:27 【问题描述】:

我正在尝试对屏蔽阵列进行 PCA 分析。据我所知,如果原始二维矩阵有缺失值,matplotlib.mlab.PCA 将不起作用。有没有人建议在 Python 中使用缺失值进行 PCA?

谢谢。

【问题讨论】:

您可能会查找非线性迭代偏最小二乘法 (en.wikipedia.org/wiki/…)。我不知道是否有任何 Python 实现,但该算法在缺失值的情况下工作正常,所以如果你能找到一个实现(或自己编写!)你应该能够做到。 【参考方案1】:

插补数据会使结果产生偏差,从而可能使 PCA 估计值产生偏差。更好的方法是使用 PPCA 算法,它给出与 PCA 相同的结果,但在某些实现中可以更稳健地处理缺失数据。

我找到了两个库。你有

    在 PyPI 上打包 PPCA,称为PCA-magic on github 包 PyPPCA,在 PyPI 和 github 上具有相同的名称

由于这些软件包维护成本低,您可能希望自己实现它。上面的代码建立在 Tipping 和 Bishop 1999 年引用(而且写得很好!)论文中提出的理论之上。如果您需要有关如何正确实施 PPCA 的指导,可以在 Tippings home page 上找到它。

顺便说一句,sklearn implementation of PCA 实际上是基于 TippingBishop1999 的 PPCA 实现,但他们没有选择以处理缺失值的方式来实现它。

编辑: 上面的两个库都有问题,所以我自己不能直接使用它们。我分叉了 PyPPCA 并修复了它。 Available on github.

【讨论】:

对于那些希望在使用 PyPPCA 执行分解后为传入数据计算 PC 坐标的人,答案在 publication 的等式 12 中。 y = (ss*np.eye(大小) + C_o@C_o.T)@C_o@z_o。其中 z 是具有缺失值的新数据,而 _o 仅指“观察到的”行。现在我只需要弄清楚如何处理这些矩阵在我的情况下太大的错误。 哎呀,忘了开头的 np.linalg.inv 小心:PyPPCA 的输出与论文的维度发生了翻转(例如,论文中 C 是 dxD 但程序的输出是 Dxd)【参考方案2】:

我认为您可能需要在进行 PCA 之前对数据进行一些预处理。 您可以使用:

sklearn.impute.SimpleImputer

https://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html#sklearn.impute.SimpleImputer

使用此功能,您可以自动替换平均值、中位数或最常见值的缺失值。很难说哪个选项最好,这取决于许多因素,例如数据的外观。

顺便说一句,您还可以通过以下方式使用 PCA:

sklearn.decomposition.PCA

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

以及许多其他统计函数和机器学习技术。

【讨论】:

以上是关于Python中缺少值的PCA的主要内容,如果未能解决你的问题,请参考以下文章

从缺少值的 csv 文件中批量插入 (SQL)

将序列号转换为 SQL 中缺少值的单列

VBA从数组制作图表 - 缺少值的问题

Pandas:打印缺少值的列名

htaccess:从缺少值的查询字符串中删除 URL 参数?

AppleScript中缺少值的Javascript(用于在Safari中单击按钮)