【机器学习】梯度下降法求解线性回归参数
对于一元线性函数:
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=1∑n(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)
∂w0∂f=−2i=1∑n(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)
∂w1∂f=−2i=1∑nxi(yi−(w0+w1xi))
当使用最小二乘法时,我们令
∂
f
∂
w
0
=
0
\frac{\partial f}{\partial w_{0}}=0
∂w0∂f=0 以及
∂
f
∂
w
1
=
0
\frac{\partial f}{\partial w_{1}}=0
∂w1∂f=0,但是梯度下降法求解参数:
w
0
=
w
0
−
l
r
∗
∂
f
∂
w
0
w _ { 0 } = w _ { 0 } - l r * \frac { \partial f } { \partial w _ { 0 } }
w0=w0−lr∗∂w0∂f
w 1 = w 1 − l r ∗ ∂ f ∂ w 1 w _ { 1 } = w _ { 1 } - l r * \frac { \partial f } { \partial w _ { 1 } } w1=w1−lr∗∂w1∂f
其中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.264∗x+0.038
线性回归方法之所以使用普通最小二乘法来求解,是因为我们可以很方便地求出损失函数的最小值。但是,机器学习中的很多问题,往往会面对非常复杂的损失函数,这些损失函数一般无法直接求得最小值,只能使用迭代方法来求取局部或全局极小值。这也就是我们学习梯度下降等迭代方法的原因。