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

如何用Python直接计算联合概率分布的协方差与相关系数

直接计算联合分布下的协方差Cov(X,Y)的Python实现

针对你给出的联合概率分布,这里提供两种无需手动逐个计算期望的实现方式:

方法1:用numpy做加权精确计算

基于协方差的定义公式Cov(X,Y) = E[XY] - E[X]E[Y],我们可以把变量取值和对应概率整理成数组,通过向量运算自动完成期望计算,无需手动累加:

import numpy as np

# 列出所有(X,Y)对应的取值和联合概率
x_vals = np.array([1, 1, 1, 4, 4, 4])
y_vals = np.array([1, 3, 5, 1, 3, 5])
joint_probs = np.array([0.1, 0.2, 0.3, 0.2, 0.05, 0.15])

# 自动计算各期望
E_X = np.sum(x_vals * joint_probs)
E_Y = np.sum(y_vals * joint_probs)
E_XY = np.sum(x_vals * y_vals * joint_probs)

# 计算协方差
cov_xy = E_XY - E_X * E_Y
print(f"Cov(X,Y) = {cov_xy}")

运行后会输出精确值:Cov(X,Y) = -0.3

方法2:生成模拟样本后调用numpy.cov计算

如果想直接调用库函数完成计算,可以先根据联合分布生成足够多的模拟样本,再用numpy.cov计算协方差:

import numpy as np

# 定义所有(X,Y)组合及对应的概率
xy_pairs = [(1, 1), (1, 3), (1, 5), (4, 1), (4, 3), (4, 5)]
probs = [0.1, 0.2, 0.3, 0.2, 0.05, 0.15]

# 生成100万条模拟样本(样本量越大结果越接近精确值)
sample_indices = np.random.choice(len(xy_pairs), size=1_000_000, p=probs)
x_samples = np.array([xy_pairs[i][0] for i in sample_indices])
y_samples = np.array([xy_pairs[i][1] for i in sample_indices])

# 计算总体协方差矩阵(ddof=0表示用总体方差计算,默认ddof=1是样本方差)
cov_matrix = np.cov(x_samples, y_samples, ddof=0)
cov_xy = cov_matrix[0][1]
print(f"Cov(X,Y) ≈ {cov_xy:.4f}")

运行后会输出接近精确值的结果,比如Cov(X,Y) ≈ -0.2998


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:28:33