梯度下降似乎没有收敛
我正在使用Python从头开始进行梯度下降(无sklearn),以在Boston Housing数据集上实现线性回归(房间数与中位数成本)。
Scikit Learn的LinearRegression为我提供了以下与数据完美契合的斜率/截距。 斜率= [9.10210898] 拦截= -34.67062077643854
但是,梯度下降甚至还没有接近。
import numpy as np
import matplotlib.pyplot as plt
l_rate = 0.0001 # Learning rate
steps = 100000 # number of iterations ( steps )
m = 0.0 # initial slope
b = 0.0 # initial intercept
n = len(x)
cost_array = np.empty([steps],dtype="float64")
# Start Gradient Descent
for step in range(steps) :
y_pred = m * x + b
# Derivative of the cost function w.r.t slope (m)
m_der = (-1/n) * sum( (y - y_pred) * x)
# Derivative of the cost function w.r.t intercept (b)
b_der = (-1/n) * sum( y - y_pred )
# move m
m = m - l_rate * m_der
b = b - l_rate * b_der
cost = (1/(2*n)) * np.sum(np.square(y - y_pred))
cost_array[step] = cost
我期望随着学习率的多种变化(例如介于0.1和0.0000001之间),解决方案应在5000次迭代中收敛。但是,只有在进行100K次迭代后,才能达到理想的斜率和截距值(由SKLearn的LinearRegression计算)。
很明显,我做错了。你能帮我解决我哪里出问题吗?