python - 如何找到最大可能的协方差矩阵,或具有非缺失成对协方差的最大列集
问题描述
我经常有很多观察结果缺失的数据。有时这意味着我有几对没有重叠观察的列,因此我无法计算两者之间的协方差。
但是我想知道最大的一组列,其中该组中的所有列对都有重叠的观察值(至少 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 这可能是一个非常困难的问题。似乎可能有更有效的动态编程解决方案,因为检查所有不同的列组合看起来令人望而却步。
解决方案
不幸的是,这个问题相当于找到一个最大集团,这是一个已知的难题。如果您通过合并具有完全相同观察模式的节点集来预处理可比性图,则针对该问题的标准算法将更好地工作。也许还有其他启发式方法可以适用于您的图表。
要采取不同的策略,也许您可以应用处理缺失数据的 SVD 算法。
推荐阅读
- css - 如何更改 Bootstrap 4 范围滑块颜色?
- docker - Docker compose 不适用于多个项目
- c++ - 如何声明一个未知大小的数组,然后输入直到我想要,然后获取数组的大小?
- java - 如何测试@Transactional 方法,其中两个表正在更新
- javascript - 用jquery隐藏divtag
- reactjs - React Native Invariant Violation:未找到名称 img 的视图配置
- php - 使用脚本标签内的刀片 @foreach 渲染 HTML
- python - 如何使用 Python 根据有关日期值的条件删除重复项?
- geolocation - 经纬度在 10 到 20 年内变化的频率
- sql-server - 调用 sys.sp_addextendedproperty 时出现错误“对象无效。不允许扩展属性”错误