对于一元线性函数:
y(x,w)=w0+w1x y ( x , w ) = w _ { 0 } + w _ { 1 } x y(x,w)=w0+w1x

定义其平方损失函数为:
f=∑i=1n(yi−(w0+w1xi))2 f = \sum _ { i = 1 } ^ { n } \left( y _ { i } - \left( w _ { 0 } + w _ { 1 } x _ { i } \right) \right) ^ { 2 } f=i=1n(yi(w0+w1xi))2

接下来,求平方损失函数 1 阶偏导数:
∂f∂w0=−2∑i=1n(yi−(w0+w1xi)) \frac { \partial f } { \partial w _ { 0 } } = - 2 \sum _ { i = 1 } ^ { n } \left( y _ { i } - \left( w _ { 0 } + w _ { 1 } x _ { i } \right) \right) w0f=2i=1n(yi(w0+w1xi))

∂f∂w1=−2∑i=1nxi(yi−(w0+w1xi)) \frac { \partial f } { \partial w _ { 1 } } = -2 \sum _ { i = 1 } ^ { n } x _ { i } \left( y _ { i } - \left( w _ { 0 } + w _ { 1 } x _ { i } \right) \right) w1f=2i=1nxi(yi(w0+w1xi))
当使用最小二乘法时,我们令 ∂f∂w0=0\frac{\partial f}{\partial w_{0}}=0w0f=0 以及 ∂f∂w1=0\frac{\partial f}{\partial w_{1}}=0w1f=0,但是梯度下降法求解参数:
w0=w0−lr∗∂f∂w0 w _ { 0 } = w _ { 0 } - l r * \frac { \partial f } { \partial w _ { 0 } } w0=w0lrw0f

w1=w1−lr∗∂f∂w1 w _ { 1 } = w _ { 1 } - l r * \frac { \partial f } { \partial w _ { 1 } } w1=w1lrw1f

其中lr为学习率。

python实现:

def ols_gradient_descent(x, y, lr, num_iter):
    """
    参数:
    x -- 自变量数组
    y -- 因变量数组
    lr -- 学习率
    num_iter -- 迭代次数

    返回:
    w1 -- 线性方程系数
    w0 -- 线性方程截距项
    """
    w1=0#随机值
    w0=0
    for i in range(num_iter):#迭代
        y_=w0+w1*x
        w1 -= lr*(-2*sum(x*(y-y_)))
        w0 -= lr*(-2*sum(y-y_))
    return w1, w0

运行测试:

w1_, w0_ = ols_gradient_descent(x, y, lr=0.00001, num_iter=100)
round(w1_,3), round(w0_,3)

输出:(1.264, 0.038)

即为:
y=1.264∗x+0.038 y=1.264∗x+0.038 y=1.264x+0.038
线性回归方法之所以使用普通最小二乘法来求解,是因为我们可以很方便地求出损失函数的最小值。但是,机器学习中的很多问题,往往会面对非常复杂的损失函数,这些损失函数一般无法直接求得最小值,只能使用迭代方法来求取局部或全局极小值。这也就是我们学习梯度下降等迭代方法的原因。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐