You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算NumPy二维数组中行X与列Y的协方差 可否直接调用np.cov()

import numpy as np
P = np.array(
    [
        [0.03607908, 0.03760034, 0.00503184, 0.0205082 , 0.01051408,
         0.03776221, 0.00131325, 0.03760817, 0.01770659],
        [0.03750162, 0.04317351, 0.03869997, 0.03069872, 0.02176718,
         0.04778769, 0.01021053, 0.00324185, 0.02475319],
        [0.03770951, 0.01053285, 0.01227089, 0.0339596 , 0.02296711,
         0.02187814, 0.01925662, 0.0196836 , 0.01996279],
        [0.02845139, 0.01209429, 0.02450163, 0.00874645, 0.03612603,
         0.02352593, 0.00300314, 0.00103487, 0.04071951],
        [0.00940187, 0.04633153, 0.01094094, 0.00172007, 0.00092633,
         0.02032679, 0.02536328, 0.03552956, 0.01107725]
    ]
)
结论

不能直接调用np.cov()完成这个计算,直接调用得到的结果完全不符合需求。

原因
  • np.cov()的设计目标是计算样本协方差,默认参数rowvar=True,逻辑是把输入数组的每一行视为一个独立随机变量,每一列视为对应变量的一次独立观测,且默认所有观测权重相等,对应均匀采样得到的样本数据集,输出结果是所有输入变量的协方差矩阵。哪怕把P误当做样本集传入,得到的也是5个行变量的5×5协方差矩阵,根本不是单个X和Y的协方差值。
  • 上述数组P不是样本观测集,是离散随机变量X、Y的联合概率质量矩阵:5行对应X的5个可能取值,9列对应Y的9个可能取值,矩阵元素P[i,j]是X取第i个值、Y取第j个值的联合概率,所有元素求和为1,和np.cov()要求的输入结构完全不匹配,直接调用算出的数值没有实际意义。
正确计算方式

需要按照离散随机变量协方差的定义计算,步骤为:先计算X、Y的边缘期望,再代入协方差公式Cov(X,Y) = E[(X-E[X])(Y-E[Y])] = sum_i sum_j (x_i - E_X)*(y_j - E_Y)*P[i,j]即可,参考代码如下:

# 若X实际取值不是行索引0-4、Y实际取值不是列索引0-8,替换为实际取值数组即可
x = np.arange(P.shape[0])
y = np.arange(P.shape[1])
x_grid, y_grid = np.meshgrid(x, y, indexing='ij')

# 计算边缘期望
E_X = np.sum(x_grid * P)
E_Y = np.sum(y_grid * P)

# 计算协方差
cov_XY = np.sum((x_grid - E_X) * (y_grid - E_Y) * P)

内容的提问来源于stack exchange,提问作者blacklion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:15:42