一、线性回归
关于线性回归的详细介绍可以参见我的上一篇博文《线性回归:最小二乘法优化》。在《线性回归:最小二乘法优化》中已经说明了线性回归模型建立的关键在于求解:
(
w
∗
,
b
∗
)
=
arg min
∑
i
=
1
m
(
f
(
x
i
)
−
y
i
)
2
(w^*, b^*)=\argmin\sum^{m}_{i=1}{{(f(x_i)-y_i)^2}}
(w∗,b∗)=argmini=1∑m(f(xi)−yi)2
这里再介绍另一种求解算法:梯度下降法。
二、梯度下降法的数学原理
假设有以下问题:
w
=
arg min
f
(
w
)
w=\argmin f(w)
w=argminf(w)
通过泰勒一阶展开则有:
f
(
w
)
=
f
(
w
0
)
+
(
w
−
w
0
)
∇
f
(
w
0
)
f(w)=f(w_0)+(w-w_0)∇f(w_0)
f(w)=f(w0)+(w−w0)∇f(w0)
图示如下:
这里的
w
−
w
0
w-w_0
w−w0表示了移动的步长和方向,那么可以有
w
−
w
0
=
η
γ
w-w_0=\eta\gamma
w−w0=ηγ,
η
\eta
η为实数,表示移动的步长,
γ
\gamma
γ为一个单位向量,表示步长移动的方向。
f
(
w
0
)
+
(
w
−
w
0
)
∇
f
(
w
0
)
f(w_0)+(w-w_0)∇f(w_0)
f(w0)+(w−w0)∇f(w0)则是
f
(
w
)
f(w)
f(w)在
w
w
w处的邻近估计,此处要求
η
\eta
η较小,否则将导致估计的精确度降低。
梯度下降算法的目的是让优化函数
f
(
w
)
f(w)
f(w)尽快到达全局最小值,所以便有了第一个条件:
c
o
n
d
i
t
i
o
n
1
:
f
(
w
)
−
f
(
w
0
)
=
η
γ
∇
f
(
w
0
)
≤
0
condition1:f(w)-f(w_0)=\eta\gamma∇f(w_0)≤0
condition1:f(w)−f(w0)=ηγ∇f(w0)≤0
由于
η
\eta
η是一个大于0的常数,所以可以暂不考虑。那么就需要满足
η
γ
∇
f
(
w
0
)
≤
0
\eta\gamma∇f(w_0)≤0
ηγ∇f(w0)≤0并且尽可能小。又有:
γ
∇
f
(
w
0
)
=
∣
γ
∣
∣
∇
f
(
w
0
)
∣
cos
α
\gamma∇f(w_0)=|\gamma||∇f(w_0)|\cos \alpha
γ∇f(w0)=∣γ∣∣∇f(w0)∣cosα
所以想要使
η
γ
∇
f
(
w
0
)
≤
0
\eta\gamma∇f(w_0)≤0
ηγ∇f(w0)≤0并且尽可能小则需要满足条件:
c
o
n
d
i
t
i
o
n
2
:
cos
α
=
−
1
condition2:\cos \alpha=-1
condition2:cosα=−1
换句话说,也就是要求单位向量
γ
\gamma
γ和
∇
f
(
w
0
)
∇f(w_0)
∇f(w0)方向完全相反,所以便可以得到以下结论:
c
o
n
d
i
t
i
o
n
3
:
γ
=
−
∇
f
(
w
0
)
∣
∇
f
(
w
0
)
∣
condition3:\gamma=\frac{-∇f(w_0)}{|∇f(w_0)|}
condition3:γ=∣∇f(w0)∣−∇f(w0)
将
c
o
n
d
i
t
i
o
n
3
condition3
condition3带入
w
−
w
0
=
η
γ
w-w_0=\eta\gamma
w−w0=ηγ,则有:
c
o
n
d
i
t
i
o
n
4
:
w
−
w
0
=
η
−
∇
f
(
w
0
)
∣
∇
f
(
w
0
)
∣
condition4:w-w_0=\eta\frac{-∇f(w_0)}{|∇f(w_0)|}
condition4:w−w0=η∣∇f(w0)∣−∇f(w0)
由于
η
\eta
η和
∣
∇
f
(
w
0
)
∣
|∇f(w_0)|
∣∇f(w0)∣都是大于0的实数,所以可以合并为新的
η
∗
=
η
∣
∇
f
(
w
0
)
∣
\eta^*=\frac{\eta}{|∇f(w_0)|}
η∗=∣∇f(w0)∣η,再对等式进行移项便可以得到:
c
o
n
d
i
t
i
o
n
5
:
w
=
w
0
−
η
∇
f
(
w
0
)
condition5:w=w_0-\eta∇f(w_0)
condition5:w=w0−η∇f(w0)
c
o
n
d
i
t
i
o
n
5
condition5
condition5便是梯度下降算法中
f
(
w
)
f(w)
f(w)的参数
w
w
w的更新公式。同时这也解释了为什么需要以梯度的反方向来更新权重。
三、梯度下降法优化
下面就用梯度下降算法来对线性回归模型进行优化。这里将线性回归模型的代价函数E写为如下形式(方便运算):
E
=
1
2
m
∑
i
=
1
m
(
f
(
x
i
)
−
y
i
)
2
E=\frac{1}{2m}\sum^{m}_{i=1}{(f(x_i)-y_i)^2}
E=2m1i=1∑m(f(xi)−yi)2
对其求导:
∂
E
∂
w
=
1
m
∑
i
=
1
m
(
w
x
i
−
y
i
)
∂
(
w
x
i
−
y
i
)
∂
w
=
1
m
∑
i
=
1
m
(
w
x
i
−
y
i
)
x
i
\frac{\partial E}{\partial w}=\frac{1}{m}\sum^{m}_{i=1}{(wx_i-y_i)\frac{\partial (wx_i-y_i)}{\partial w}}=\frac{1}{m}\sum^{m}_{i=1}{(wx_i-y_i)x_i}
∂w∂E=m1i=1∑m(wxi−yi)∂w∂(wxi−yi)=m1i=1∑m(wxi−yi)xi
由前面的
c
o
n
d
i
t
i
o
n
5
condition5
condition5可以得到权重的更新公式:
w
∗
=
w
+
Δ
w
w^*=w+\Delta w
w∗=w+Δw,此处的
Δ
w
=
−
η
∇
f
(
w
0
)
\Delta w=-\eta∇f(w_0)
Δw=−η∇f(w0)。所以最终可以得到权重的更新公式为:
w
∗
=
w
+
η
m
∑
i
=
1
m
(
y
i
−
w
x
i
)
x
i
w^*=w+\frac{\eta}{m}\sum^{m}_{i=1}{(y_i-wx_i)x_i}
w∗=w+mηi=1∑m(yi−wxi)xi
四、Python实现
由之前推导出的更新公式可以实现出以下拟合算法:
def _gradient_descent(self, X, y):
for i in range(max_iter):
delta = y - self._linear_func(X)
self.W[0] += self.eta * sum(delta) / X.shape[0] # 第一列全部为1
self.W[1:] += self.eta * (delta @ X) / X.shape[0]
导入波士顿数据集进行测试:
if __name__ == "__main__":
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
boston = datasets.load_boston()
X = boston.data
y = boston.target
scaler = MinMaxScaler().fit(X)
X = scaler.transform(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.7, test_size=0.3)
lr = LinearRegression().fit(X_train, y_train)
y_pred = lr.predict(X_test)
from sklearn.metrics import mean_squared_error
print(mean_squared_error(y_test, y_pred))
plt.figure()
plt.plot(range(len(y_test)), y_test)
plt.plot(range(len(y_pred)), y_pred)
plt.legend(["test", "pred"])
plt.show()
均方误差:
代价曲线:
拟合曲线: