Python手动实现协方差报IndexError: list index out of range错误如何解决
错误含义
IndexError: list index out of range 表示你尝试访问的数组/列表索引超出了它的实际长度,比如一个长度为2的列表,你尝试取下标2就会触发这个错误。
代码问题汇总
- 均值计算逻辑完全错误:你现在遍历的是数据集的行,且每次循环都重新初始化
mean_list为空,循环结束后mean_list仅存最后一行的均值,长度只有1。后续你用列索引j去取mean_list[j]时,只要j>=1就会超出下标范围,这是触发报错的直接原因。另外协方差计算要求的是每一列特征的均值,你现在按行求和计算均值的逻辑也不符合数学定义。 - 协方差计算的遍历范围错误:计算两个特征的协方差需要遍历所有样本(即所有行),你写的
range(mat.shape[1])是遍历列数,会导致行索引i的取值范围不符合要求,甚至额外触发行下标越界。 - 标准差计算逻辑无效:你计算的标准差既没有存储结果,协方差矩阵计算本身也不需要用到标准差,这部分代码属于冗余内容,如果你后续要做相关矩阵计算再保留即可。
- 没有构建协方差矩阵的逻辑:你只是打印了每个协方差值,没有存入预设的
cov列表中,最后无法得到完整的协方差矩阵。
修复后的代码
import pandas as pd df = pd.read_csv('C:/Users/User/Downloads/Admission_Predict.csv') df = df.sample(frac=1) mat = df.to_numpy() row_cnt = mat.shape[0] col_cnt = mat.shape[1] cov = [[0]*col_cnt for _ in range(col_cnt)] # 初始化协方差矩阵 # 按列计算每个特征的均值 mean_list = [] for j in range(col_cnt): col_sum = sum(mat[i][j] for i in range(row_cnt)) mean_list.append(col_sum / row_cnt) # 计算协方差矩阵 for j in range(col_cnt): for k in range(col_cnt): temp_sum = 0 for i in range(row_cnt): temp_sum += (mat[i][j] - mean_list[j]) * (mat[i][k] - mean_list[k]) cov[j][k] = temp_sum / (row_cnt - 1) print(f"cov[{j}][{k}] = {cov[j][k]}")
内容的提问来源于stack exchange,提问作者meloqq
相关产品推荐
相关产品推荐

