从零实现多元线性回归梯度下降算法,训练集预测异常精准求助
多元线性回归梯度下降算法异常精准结果排查
问题描述
从零编写多元线性回归的梯度下降算法后,用自制随机训练数据集预测时,结果异常精准,几乎完全贴合训练集标签,更换数据后问题依旧。
算法代码
import numpy as np class gradientdescent: def fit(self,X,Y): lr=0.005 *learning rate* # 存在语法错误 b=0 M=np.array(1) M=np.arange(X.shape[1]) n=np.size(X,0) M.fill(1) # 初始化梯度参数 for i in range(10000): sum=0 sum1=0 for j in range(n): sum=sum+(np.dot(X[j],M)+b-Y[j])*X[j] sum1=sum1+(np.dot(X[j],M)+b-Y[j]) m_gradient=lr*sum/n b_gradient=lr*sum1/n M=M-m_gradient b=b-b_gradient self.b=b self.M=M self.n=n def predict(self,X): for i in range(self.n): print(np.dot(self.M,X[i])+self.b)
训练数据集
X=np.array([[1,2,3,4,5],[2,1,4,3,5],[1,3,2,5,4],[3,0,1,2,4],[0,1,2,4,3]]) Y=np.array([5,6,2,8,100])
预测结果
5.000000000080892 5.999999999956618 1.9999999999655422 8.000000000004814 99.99999999998795
问题根源
核心是过拟合+欠定系统:
- 训练样本数(5个)和特征数(5个)相等,相当于解一个5元一次方程组,存在无数组参数能完美满足所有训练样本的等式。梯度下降迭代10000次后,自然会收敛到其中一组参数,因此预测训练集时完全精准。
- 这种场景下模型没有泛化能力,换一组样本数等于特征数的数据,依然会出现完全拟合的情况,只有当样本数远大于特征数时,模型才会因无法完美拟合所有样本而产生合理误差。
代码中的具体问题
- 语法错误:
lr=0.005 *learning rate*注释方式错误,Python注释需用#,这行代码会触发运算错误。 - 冗余参数初始化:
M=np.array(1)→M=np.arange(X.shape[1])→M.fill(1)可简化为M = np.ones(X.shape[1])。 - 预测函数逻辑错误:
predict方法用self.n(训练集样本数)遍历输入X,若输入新测试集(样本数与训练集不同),会导致遍历不完整或索引越界,应遍历输入X的所有样本。
修正方案
- 调整数据集规模:增加训练样本数量,确保样本数至少是特征数的3-5倍,让模型无法完美拟合所有样本,体现泛化能力。
- 修复代码问题:
- 修正注释和参数初始化:
def fit(self,X,Y): lr = 0.005 # learning rate b = 0 n = np.size(X, 0) M = np.ones(X.shape[1]) # 直接初始化全1数组 # 后续训练逻辑不变 - 重构预测函数:
def predict(self, X): # 支持任意样本数的输入,返回所有预测结果 return np.dot(X, self.M) + self.b
- 修正注释和参数初始化:
- 加入正则化或早停:若样本数有限,可加入L2正则化约束参数大小,或训练时监控验证集损失,提前停止迭代,避免过度拟合。
内容的提问来源于stack exchange,提问作者Srivaths Gondi
相关产品推荐
相关产品推荐

