【机器学习】梯度下降法求解线性回归参数

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

定义其平方损失函数为:
f = ∑ i = 1 n ( y i − ( w 0 + w 1 x i ) ) 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 ∂ w 0 = − 2 ∑ i = 1 n ( y i − ( w 0 + w 1 x i ) ) \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 ∂ w 1 = − 2 ∑ i = 1 n x i ( y i − ( w 0 + w 1 x i ) ) \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 ∂ w 0 = 0 \frac{\partial f}{\partial w_{0}}=0 w0f=0 以及 ∂ f ∂ w 1 = 0 \frac{\partial f}{\partial w_{1}}=0 w1f=0,但是梯度下降法求解参数:
w 0 = w 0 − l r ∗ ∂ f ∂ w 0 w _ { 0 } = w _ { 0 } - l r * \frac { \partial f } { \partial w _ { 0 } } w0=w0lrw0f

w 1 = w 1 − l r ∗ ∂ f ∂ w 1 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
线性回归方法之所以使用普通最小二乘法来求解,是因为我们可以很方便地求出损失函数的最小值。但是,机器学习中的很多问题,往往会面对非常复杂的损失函数,这些损失函数一般无法直接求得最小值,只能使用迭代方法来求取局部或全局极小值。这也就是我们学习梯度下降等迭代方法的原因。

posted @ 2020-09-16 10:46  ccql  阅读(4)  评论(0编辑  收藏  举报  来源