使用Numpy的np.cov计算协方差矩阵结果与预期不符问题求解
问题解答
核心认知错误
你混淆了协方差和皮尔逊相关系数的定义,二者的数学关系如下:
- 协方差公式:
Cov(a,b) = ρ * σ_a * σ_b
其中ρ是a和b的皮尔逊相关系数,取值范围为[-1, 1],σ_a是a的标准差,σ_b是b的标准差 - 你之前的认知只有当
|ρ|=1(也就是两个变量完全线性相关)时才成立,你示例中a、b是随机生成的独立变量,相关系数远小于1,自然不会满足你预期的等式
验证说明
你可以在现有代码末尾补充如下代码验证结论:
# 计算皮尔逊相关系数 rho = R[0,1]/(np.std(a,ddof=1)*np.std(b,ddof=1)) print(f"皮尔逊相关系数ρ:{rho}") print(f"协方差计算验证:{rho * np.std(a,ddof=1)*np.std(b,ddof=1)}") print(f"cov矩阵取出的协方差:{R[0,1]}")
运行后可以看到二者数值完全一致,说明np.cov的计算结果符合协方差的数学定义。
补充拓展
协方差矩阵的对角线元素是各变量自身的方差,非对角线元素是两个变量的协方差,非对角线元素的绝对值一定小于等于对应对角线元素平方根的乘积,这是柯西-施瓦茨不等式在统计中的应用,你观测到的结果完全符合该不等式的约束。
内容的提问来源于stack exchange,提问作者Thomas Schmitt
相关产品推荐
相关产品推荐

