首页 > 解决方案 > 如何找到最大可能的协方差矩阵,或具有非缺失成对协方差的最大列集

问题描述

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

但是我想知道最大的一组列,其中该组中的所有列对都有重叠的观察值(至少 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 这可能是一个非常困难的问题。似乎可能有更有效的动态编程解决方案,因为检查所有不同的列组合看起来令人望而却步。

标签: pythonpandasalgorithmstatisticsdynamic-programming

解决方案


不幸的是,这个问题相当于找到一个最大集团,这是一个已知的难题。如果您通过合并具有完全相同观察模式的节点集来预处理可比性图,则针对该问题的标准算法将更好地工作。也许还有其他启发式方法可以适用于您的图表。

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


推荐阅读