手动实现协方差矩阵时报ValueError: invalid literal for int() with base 10如何解决
手动实现皮尔逊相关系数矩阵的错误修复方案
1. 错误根因分析
- 执行
list(map(int, df))报错的原因:直接迭代DataFrame对象默认返回的是列名字符串,而非行/列的数值内容,将字符串列名传入int()做转换自然会抛出进制转换错误。 - 执行
df.astype(int)后报错的原因:两种可能,一是未提前移除数据集里的非数值列/字符串类型的字段,二是数据集存在缺失值、空字符串这类无法直接转换为数值的异常值。你用到的Admission_Predict数据集自带Serial No.(序列号)字段属于非特征列,未提前剔除也会引发类型转换异常。
2. 正确实现步骤
第一步:数据预处理
先加载数据集,过滤非数值列,确保所有参与计算的字段都是数值类型:
import pandas as pd import numpy as np # 加载数据集 df = pd.read_csv("Admission_Predict.csv") # 方法1:手动剔除无关的序列号列,只保留数值特征列 df = df.drop(columns=["Serial No."]) # 方法2:不确定哪些列是数值列时,自动筛选所有数值类型的列 # df = df.select_dtypes(include=['number']) # 可选:处理缺失值避免后续计算异常 df = df.dropna()
第二步:手动实现对标pandas.corr()的皮尔逊相关系数矩阵
皮尔逊相关系数计算公式为两个变量的协方差除以二者标准差的乘积,实现代码如下:
def manual_pearson_corr(df): n_features = df.shape[1] # 初始化相关系数矩阵 corr_matrix = np.zeros((n_features, n_features)) # 统一提取数值为numpy矩阵,避免类型问题 data = df.values # 逐列计算两两特征的相关系数 for i in range(n_features): for j in range(n_features): x = data[:, i] y = data[:, j] # 计算两列均值 x_mean = x.mean() y_mean = y.mean() # 计算协方差 cov = np.sum((x - x_mean) * (y - y_mean)) / (len(x) - 1) # 计算两列标准差 x_std = np.sqrt(np.sum((x - x_mean)**2) / (len(x) - 1)) y_std = np.sqrt(np.sum((y - y_mean)**2) / (len(y) - 1)) # 计算相关系数,处理标准差为0的边界情况 corr_matrix[i, j] = cov / (x_std * y_std) if x_std * y_std != 0 else 0 # 封装为DataFrame,和pandas.corr()的输出格式完全对齐 return pd.DataFrame(corr_matrix, index=df.columns, columns=df.columns)
第三步:验证结果一致性
# 手动计算的相关系数矩阵 manual_corr = manual_pearson_corr(df) # pandas官方输出的相关系数矩阵 pd_corr = df.corr() # 对比结果,误差在1e-10以内则返回True,代表完全一致 print(np.allclose(manual_corr, pd_corr))
内容的提问来源于stack exchange,提问作者meloqq
相关产品推荐
相关产品推荐

