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

Python手动实现皮尔逊相关矩阵报错ValueError如何解决

错误原因

  • 直接迭代DataFrame时默认返回的是列名字符串,list(map(int, df))实际是尝试把'GRE Score'这类列名转成整数,直接触发ValueError
  • 原代码存在多处逻辑错误:计算协方差时迭代的样本数误用了列数、标量类型的协方差结果错误使用二维索引取值、标准差未按对应列分别计算
  • 若数据集首列为序号类非数值列,未提前剔除也会导致类型转换报错

修正后代码

import pandas as pd
import statistics

# 读取数据集
df = pd.read_csv('C:/Users/User/Downloads/Admission_Predict.csv')
# 剔除序号列(根据数据集实际结构调整,若没有序号列可删除该行)
df = df.drop('Serial No.', axis=1)
# 打乱样本不影响相关系数计算,可保留
df = df.sample(frac=1)

n_samples = len(df)
n_features = df.shape[1]
# 提前计算每列的均值、总体标准差,避免重复计算
mean_vals = df.mean()
std_vals = [statistics.pstdev(df.iloc[:, col]) for col in range(n_features)]

corr_dict = {}
for j in range(n_features):
    corr_dict[j] = []
    for k in range(n_features):
        # 计算协方差
        cov_sum = 0
        for i in range(n_samples):
            cov_sum += (df.iloc[i, j] - mean_vals.iloc[j]) * (df.iloc[i, k] - mean_vals.iloc[k])
        cov_jk = cov_sum / n_samples
        # 计算皮尔逊相关系数
        pearson_jk = cov_jk / (std_vals[j] * std_vals[k])
        corr_dict[j].append(pearson_jk)

# 转成DataFrame并设置行列名
corr_df = pd.DataFrame(corr_dict)
corr_df.columns = df.columns
corr_df.index = df.columns

print(corr_df)
# 可对比pandas自带方法的输出验证一致性
# print(df.corr())

补充说明

  • 协方差和标准差计算时,样本/总体的分母参数会在相除时抵消,最终相关系数结果和pandas.corr()输出完全一致
  • 如果数据集本身没有非数值列,不需要额外做类型转换,pandas读入数值列时会自动识别为int/float类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:57:03