Python中处理带有缺失值的PCA

15
我正在尝试对一个掩码数组进行PCA分析。据我所知,如果原始的2D矩阵存在缺失值,则matplotlib.mlab.PCA无法工作。有没有人可以推荐在Python中处理带缺失值的PCA的方法?
谢谢。

1
你可以查阅非线性迭代偏最小二乘法(http://en.wikipedia.org/wiki/Non-linear_iterative_partial_least_squares)。我不知道是否有Python实现,但该算法对于缺失值的处理效果良好,因此如果你能找到一个实现(或自己编写),应该能够使用它。 - DavidW
2个回答

19

输入数据可能会使PCA估计结果发生偏差。更好的方法是使用PPCA算法,它可以在某些实现中更加稳健地处理缺失数据,并产生与PCA相同的结果。

我找到了两个库:

  1. PyPI上的PPCA包,在GitHub上被称为PCA-magic
  2. PyPI和github上都叫做PyPPCA的包

由于这些包的维护很少,您可能希望自己实现它。上面的代码基于Tipping和Bishop 1999年的论文介绍的理论构建而成。如果您想要正确实现PPCA,则可以在Tippings主页上获得指导。

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

编辑:以上两个库都存在问题,我不能直接使用它们。我分支了PyPPCA并修复了漏洞。可以在github上获得。


1
对于那些在使用PyPPCA进行分解后,想要计算传入数据的PC坐标的人来说,答案在论文的第12个方程中。y = (ss*np.eye(size) + C_o@C_o.T)@C_o@z_o。其中,z是具有缺失值的新数据,_o仅指“观察到”的行。现在我只需要弄清楚如何处理这些矩阵在我的情况下太大的错误。 - kjohnsen
哎呀,开头忘记加上 np.linalg.inv 了。 - kjohnsen
1
注意:PyPPCA的输出维度与论文中的相反(例如,在论文中C是dxD,但程序的输出是Dxd)。 - kjohnsen

11

我认为在进行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

还有许多其他的统计函数和机器学习技术。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接