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

