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

从零实现numpy协方差矩阵时输出与np.cov结果不一致问题

协方差矩阵实现与np.cov结果不匹配问题排查

你的代码存在多处逻辑错误、变量调用错误和API认知错误,具体如下:

  • 未定义变量直接调用,结果变量被循环覆盖
    代码中的mat变量从未定义,属于无效调用;同时covariance是循环内的临时变量,每次迭代都会被新的计算结果覆盖,最终只会保留最后一次循环的一维结果,自然和np.cov输出的二维矩阵维度不匹配。
  • 协方差计算逻辑完全错误
    协方差的核心是两个变量去均值后的乘积的无偏估计,你写的mat0 = mat[i][j] - [means][0].reshape(M, -1)逻辑完全不符合协方差的定义,无意义的reshape操作也会导致计算维度错乱。
  • np.cov参数逻辑认知错误
    np.cov默认将每一行视为一个变量、每一列视为该变量的一个观测值,你直接传入df得到的是样本间协方差矩阵(N行N列),但你的手写代码是按照每列作为变量计算特征间协方差矩阵(M行M列),二者本身就不是同一个计算目标,结果自然不可能匹配。如果你希望np.cov输出和手写目标一致的特征间协方差矩阵,应该调用np.cov(df.T)。
  • 循环顺序逻辑错误
    你把协方差的计算嵌套在了计算单变量均值、标准差的循环内部,计算协方差时部分列的均值还未完成计算,直接用了未正确赋值的means数组元素,结果肯定存在偏差。正确的顺序是先算完所有列的均值,再遍历计算两两变量的协方差。
  • 缺少依赖导入
    代码中使用了math.sqrt但未导入math模块,运行时本应直接报错,你得到的输出大概率是之前运行缓存的历史变量值。

修正后的特征间协方差矩阵实现(对齐np.cov(df.T)结果)

import pandas as pd
import numpy as np
import math

df = pd.read_csv('C:/Users/User/Downloads/Admission_Predict.csv')
X = df.values
N, M = X.shape

means = np.zeros(M)
# 第一步:先计算所有列的均值
for i in range(M):
    means[i] = np.sum(X[:, i]) / N

# 第二步:计算协方差矩阵
cov_matrix = np.zeros((M, M))
for i in range(M):
    # 第i列去均值
    x_diff = X[:, i] - means[i]
    for j in range(M):
        # 第j列去均值
        y_diff = X[:, j] - means[j]
        # 协方差计算:乘积和除以N-1(无偏估计)
        cov_matrix[i][j] = np.sum(x_diff * y_diff) / (N - 1)

print(cov_matrix)
# 和官方结果对比验证
print(np.allclose(cov_matrix, np.cov(X.T)))

如果你需要对齐np.cov(df)的样本间协方差结果

只需要把上述代码中按列处理的逻辑修改为按行处理即可,核心是将每行作为一个变量,计算两两行之间的协方差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:36:04