python - 如何找到最大可能的协方差矩阵,或具有非缺失成对协方差的最大列集

标签 python pandas algorithm statistics dynamic-programming

我的数据经常缺少很多观察值。有时这意味着我有几对没有重叠观察值的列,因此我无法计算两者之间的协方差。

但我想知道最大的一组列,该集合中的所有列对都有重叠的观察值(至少 2 个,但你可以假设有一个就有很多),这样我就可以计算一个没有缺失值的协方差矩阵(所有成对协方差)。

例如,考虑以下 python 代码。

>>> import pandas as pd
>>> import numpy as np
>>> n = np.nan
>>> d = pd.DataFrame(
np.array(
[[1, n, 2, 4, 2, n, 6, n, 1, 1],
 [2, n, 3, 4, 4, n, 5, 4, 2, n],
 [1, 3, 4, 2, n, 2, 4, 2, n, 1],
 [1, 3, 4, 1, n, 1, 2, 1, n, 1]]),
        columns=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'])
>>> d
      a    b    c    d    e    f    g    h    i    j
0  1.0  NaN  2.0  4.0  2.0  NaN  6.0  NaN  1.0  1.0
1  2.0  NaN  3.0  4.0  4.0  NaN  5.0  4.0  2.0  NaN
2  1.0  3.0  4.0  2.0  NaN  2.0  4.0  2.0  NaN  1.0
3  1.0  3.0  4.0  1.0  NaN  1.0  2.0  1.0  NaN  1.0

我想创建一些函数来告诉我应该使用哪一组列来创建最大的协方差矩阵。我认为这种情况下的答案是 ['a', 'b', 'c', 'd', 'f', 'g', 'h', 'j']:

>>> d[['a', 'b', 'c', 'd', 'f', 'g', 'h', 'j']].cov() 
          a    b         c         d    f         g         h    j
a  0.250000  0.0 -0.083333  0.416667  0.0  0.250000  0.833333  0.0
b  0.000000  0.0  0.000000  0.000000  0.0  0.000000  0.000000  0.0
c -0.083333  0.0  0.916667 -1.250000  0.0 -1.416667 -0.833333  0.0
d  0.416667  0.0 -1.250000  2.250000  0.5  2.416667  2.333333  0.0
f  0.000000  0.0  0.000000  0.500000  0.5  1.000000  0.500000  0.0
g  0.250000  0.0 -1.416667  2.416667  1.0  2.916667  2.166667  0.0
h  0.833333  0.0 -0.833333  2.333333  0.5  2.166667  2.333333  0.0
j  0.000000  0.0  0.000000  0.000000  0.0  0.000000  0.000000  0.0

这只是一个玩具示例。实际上,数据集很大 n=1000 或 n=100000 或更多。并且列数 k=10 或 k=200。我认为对于大 k 这可能是一个非常困难的问题。似乎可能有更有效的动态编程解决方案,因为检查所有不同的列组合看起来令人望而却步。

最佳答案

不幸的是,这个问题相当于 finding a maximum clique ,这是一个已知的难题。如果您通过合并具有完全相同观察模式的节点集来预处理可比性图,那么该问题的标准算法会更好地工作。也许还有其他适用于您的图表的启发式方法。

要采取不同的策略,也许您可​​以应用 SVD 算法来处理缺失数据。

关于python - 如何找到最大可能的协方差矩阵,或具有非缺失成对协方差的最大列集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55007383/

相关文章:

python - 如何从 Bokeh 中的数据帧制作折线图?

动态更新 WTForms 选择字段的 JavaScript/Ajax

pandas - 使用 sklearn 或 pandas 进行一次热编码后,如何在混合数据集(数值 + 分类)上应用 KNN

c - 崩溃的 Pop() 函数

algorithm - 在树数据结构中查找所有叶节点的最高效方法

python - 保存麻烦的网页并导入回Python

python - 有Python、Ruby、Sql、Cobol、Perl、PL/SQL的静态分析工具吗?

python - 带有 NaN 键的字典到 pandas 系列

python - 通过重命名合并 pandas 分类系列

java - 为什么递归 MergeSort 比迭代 MergeSort 更快?