如何用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
相关产品推荐
相关产品推荐

