Machine learning 为什么我的线性回归批梯度下降不';不收敛?

Machine learning 为什么我的线性回归批梯度下降不';不收敛?,machine-learning,scikit-learn,linear-regression,convex-optimization,Machine Learning,Scikit Learn,Linear Regression,Convex Optimization,我想写一个类似于sklearn.linear\u model.LinearRegression的线性回归模型。首先,我使用sklearn.linear\u model.LinearRegression训练一个标准线性回归模型: 将numpy导入为np 将matplotlib.pyplot作为plt导入 从sklearn导入线性_模型 #训练数据 列x=np.array([1,2,3,4,5,6],dtype=np.float64)。重塑(6,1) 序列y=np.数组([1,2,3,3.25,3.

我想写一个类似于
sklearn.linear\u model.LinearRegression
的线性回归模型。首先,我使用
sklearn.linear\u model.LinearRegression
训练一个标准线性回归模型:

将numpy导入为np
将matplotlib.pyplot作为plt导入
从sklearn导入线性_模型
#训练数据
列x=np.array([1,2,3,4,5,6],dtype=np.float64)。重塑(6,1)
序列y=np.数组([1,2,3,3.25,3.5,3.8],数据类型=np.float64)
#测试数据
预测x=np.arange(0,7,0.1)
预测x=预测x.重塑(预测x.尺寸,1)
#简单回归
模型1=线性模型。线性回归()
模型1.装配(x列、y列);
打印model1.coef,model1.intercept_
#二次回归
模型2=线性模型。线性回归()
模型2.拟合(np.连接((列x,列x**2),轴=1,列y);
打印model2.coef,model2.intercept_
#五阶多项式回归
模型5=线性模型。线性回归()
模型5.配合(np.连接((x列,x列**2,x列**3,x列**4,x列**5),轴=1),y列);
打印model5.coef_,model5.intercept_
#预测
预测1=模型1.预测(预测x)
predict_y2=model2.predict(np.concatenate((predict_x,predict_x**2),axis=1))
predict_y5=model5.predict(np.连接((predict_x,predict_x**2,predict_x**3,predict_x**4,predict_x**5),axis=1))
#密谋
plt.图(figsize=(10,10))
plt.散射(x列,y列,颜色='黑色')
plt.plot(预测x,预测y1,颜色为“蓝色”,标签为“不合适”)
plt.plot(预测x,预测y2,颜色为绿色,标签为一般)
plt.plot(预测x,预测y5,颜色为红色,标签为过度拟合)
plt.轴([0,7,0,5])
plt.图例(loc=2)
plt.show()
然后,我得到了很好的结果:

[0.53571429]0.883333

[1.34821429-0.11607143]-0.2

[-8.52333333 7.0625-2.30833333 0.3375-0.01833333]4.45

之后,我实现了我的模型
mylinearression
。首先,我选择批量梯度下降和固定的迭代次数来测试我的代码是否正确

#中心数据
def中心矩阵(X):
断言(isinstance(X,np.ndarray))
X_偏移量=np.平均值(X,轴=0)
返回X-X_偏移,X_偏移
类MyLineArgression(对象):
定义初始化(自):
self.coef=无
self.intercept=无
自学习率=无
def配合(自、X、y):
n_样本,n_特征=X形状
n_样本u,=y形状
断言(n个样本==n个样本)
十、 X_偏移=中心矩阵(X)
y、 y_偏移=中心矩阵(y)
self.coef=np.ones((n\u特征,),dtype=np.float64)
自学习率=-0.0001
错误=无
#使用固定迭代次数
新罕布什尔州的纪元(500000):
y_hat=X.dot(self.coef_)
错误=y\u hat-y
如果误差不是无且和(误差**2)>和(误差**2):#如果平方误差增加,则学习率减半。
自学习率/=2。
持续
错误=错误_
coef=self.coef+self.learning\u rate*(X.T.dot(错误))
如果np.isfinite(coef).all():#如果发生溢出,则学习率减半。
self.coef=coef
其他:
自学习率/=2。
self.intercept=y\u offset-self.coef\uu.dot(X\u offset.T)
回归自我
def预测(自我,X):
n_样本,n_特征=X形状
断言(n_features==self.coef_.size)
返回X.dot(self.coef_)+self.intercept_
#简单回归
my_model1=MyLinearRegression()
my_model1.fit(x列、y列)
打印我的模型1.coef,我的模型1.intercept_
#二次回归
my_model2=MyLinearRegression()
my_model2.fit(np.连接((列x,列x**2),轴=1,列y);
打印我的模型2.coef,我的模型2.intercept_
#五阶多项式回归
my_model5=我的线性回归()
my_model5.fit(np.连接((x列,x列**2,x列**3,x列**4,x列**5),轴=1),y列);
打印我的模型5.coef,我的模型5.intercept_
#预测
my_predict_y1=my_model 1.predict(predict_x)
my_predict_y2=my_model2.predict(np.concatenate((predict_x,predict_x**2),axis=1))
my_predict_y5=my_model5.predict(np.连接((predict_x,predict_x**2,predict_x**3,predict_x**4,predict_x**5),axis=1))
#密谋
plt.图(figsize=(10,10))
plt.散射(x列,y列,颜色='黑色')
plt.plot(predict_x,my_predict_y1,color='blue',label='underfitting')
plt.plot(predict_x,my_predict_y2,color='green',label='fair')
plt.plot(predict_x,my_predict_y5,color='red',label='overfitting')
plt.轴([0,7,0,5])
plt.图例(loc=2)
plt.show()
然后,我得到了坏结果:

[0.53571433]0.883333191266

[1.34821275-0.11607122]-0.199997815791

[-1.95681250e+00-2.20847875e+01-1.48602362e+02-9.20144807e+02 -5.56577136e+03]11678151.1386


我可以在
my_model1
my_model2
上获得很好的结果,它们在
sklearn.linear\u model.LinearRegression
上接近。但是,无论我如何调整学习率和迭代次数,
mymodel5
都不会收敛。有人能帮忙吗?

这里需要功能缩放

见:


您为什么要在每一步更新您的学习率?如果学习率太大,GD可能会保持摆动而不收敛。如果它太小,它可能会慢到收敛。因此,我用一个较大的值初始化学习率,并随着误差的减小而减小。