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

修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:25:26