修复IndexError: list index out of range错误及实现损失变化停止迭代
问题修复:线性回归迭代的IndexError错误
错误原因
第一次迭代时,self.errors列表仅添加了1个损失值,此时访问self.errors[-2]会触发IndexError: list index out of range——列表长度不足2,不存在倒数第二个元素。
另外原逻辑还有两处不合理:
- 未取变化率的绝对值,若损失下降(新损失<旧损失),差值为负会直接满足
<0.01的条件,提前退出,不符合“变化小于1%”的需求 - 相对变化率的计算通常以上一次损失为基准,而非当前损失,这样的结果更具参考性
修复后的代码
import numpy as np class MyLinReg(object): def __init__(self, activation_function): self.activation_function = activation_function def fit(self, X, y, alpha = 0.001, epochs = 10): self.theta = np.random.rand(X.shape[1] + 1) self.errors =[] n = X.shape[0] for _ in range(epochs): errors = 0 sum_1 = 0 sum_2 = 0 for xi, yi in zip(X, y): sum_1 += (self.predict(xi) - yi)*xi sum_2 += (self.predict(xi) - yi) errors += ((self.predict(xi) - yi)**2) self.theta[:-1] -= 2*alpha*sum_1/n self.theta[-1] -= 2*alpha*sum_2/n self.errors.append(errors/n) # 至少两次迭代后再判断损失变化 if len(self.errors) >= 2: # 计算基于上一次损失的相对变化率(取绝对值) loss_change = abs((self.errors[-1] - self.errors[-2]) / self.errors[-2]) if loss_change < 0.01: break return self def predict(self, X): weighted_sum = np.dot(X, self.theta[:-1]) + self.theta[-1] return self.activation_function(weighted_sum)
关键修改点
- 添加
len(self.errors) >= 2的判断,确保有足够的历史损失数据再计算变化率 - 对变化率取绝对值,避免因损失自然下降导致的误触发
- 将变化率计算的分母改为上一次的损失值
self.errors[-2],符合相对变化率的常规计算逻辑
内容的提问来源于stack exchange,提问作者user19266212
相关产品推荐
相关产品推荐

