从零实现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
相关产品推荐
相关产品推荐

