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的主要内容,如果未能解决你的问题,请参考以下文章