$$y = 44.256 + 0.718 * x$$
importmatplotlib.pyplotaspltplt.scatter(x,y)plt.plot(np.array([50,110]),np.array([50,110])*0.718+44.256,'r')

梯度下降法求解数学推导

介绍完最小二乘法,下面来说一说梯度下降法的求解过程,关于梯度下降法的原理和过程这里不再解释。梯度下降法作为迭代优化方法,需要提前定义好损失函数。这里选择均方误差 MSE 作为损失函数。
其中,$y_{i}$ 表示真实值,$\hat y_{i}$ 表示近似值,$n$ 则表示值的个数。近似值则通过当前已知计算,那么:
此时,我们求解参数和截距项对应的梯度:
那么,根据梯度就可以执行迭代更新,从而找到最优参数:

梯度下降法求解代码实现

相比于前面的最小二乘法实现过程,梯度下降法的 Python 实现会稍微麻烦一些。不过通过上面的公式,我们也能很快地完成代码编写:
defgradient_descent(x,y,lr,num_iter):w1=0# 初始参数为 0w0=0# 初始参数为 0foriinrange(num_iter):# 梯度下降迭代# 计算近似值y_hat=(w1*x)+w0# 计算参数对应梯度w1_gradient=-(2/len(x))*sum(x*(y-y_hat))w0_gradient=-(2/len(x))*sum(y-y_hat)# 根据梯度更新参数w1-=lr*w1_gradientw0-=lr*w0_gradientreturnw1,w0
同样,使用上面的示例数据完成参数计算:
w1,w0=gradient_descent(np.array(x),np.array(y),lr=0.00001,num_iter=100)w1,w0>>>(1.264673601681181,0.017892580143733863)
因为是迭代方法,所以需要设置学习率和最大迭代次数。你可能发现,这里得到的结果与最小二乘法不太一致,这是不同方法带来的普遍现象。同样绘制出拟合直线:
plt.scatter(x,y)plt.plot(np.array([50,110]),np.array([50,110])*w1+w0,'r')
肉眼可见,最终的拟合情况不如最小二乘法。当然,如果随机初始参数以及调整合适的迭代次数及学习率,优化迭代结果可能会更理想一些。

小结

本文系统地介绍了线性回归问题的两种不同的求解方法,分别是:最小二乘法和梯度下降法。同时,对3种求解过程进行了编程实现,希望对机器学习初学者带来启发。如何有相关疑问,欢迎交流探讨。