机器学习算法之线性回归
1线性回归(linear regression)的概念
1.线性回归是一种回归分析技术,回归分析本质上就是一个函数估计的问题,就是找出因变量和自变量之间的因果关系。
2.回归分析的因变量应该是连续变量,若因变量为离散变量,则问题转化为分类问题。
3.回归分析是一个有监督学习的问题。
1.1线性模型
给定样本
x
⃗
\vec{x}
x,我们用列向量表示该样本
x
⃗
\vec{x}
x =
(
x
(
1
)
,
x
(
2
)
,
…
,
x
(
n
)
)
T
(x^{(1)},x^{(2)},\dots,x^{(n)})^T
(x(1),x(2),…,x(n))T。样本有n种特性,我们用
x
(
i
)
x^{(i)}
x(i)表示样本
x
⃗
\vec{x}
x的第i个特征。线性模型的形式为:
f
(
x
⃗
)
=
w
⃗
⋅
x
⃗
+
b
f(\vec{x}) = \vec{w}\cdot\vec{x} + b
f(x)=w⋅x+b
其中,
w
⃗
=
(
w
(
1
)
,
w
(
2
)
,
…
,
w
(
n
)
)
T
\vec{w} = (w^{(1)},w^{(2)},\dots,w^{(n)})^T
w=(w(1),w(2),…,w(n))T为每个特征对应的权重生成的权重向量,权重向量直观地表达了各个特征在预测中的重要性。
1.2广义线性模型(generalized linear model)
考虑单调可导函数
h
(
⋅
)
h(\cdot)
h(⋅),令
h
(
y
)
=
w
⃗
T
x
⃗
+
b
h(y) = \vec{w}^T\vec{x} + b
h(y)=wTx+b,这样得到的模型称为广义线性模型。
广义线性模型的一个典型的例子就是对数线性回归。当
h
(
⋅
)
=
ln
(
⋅
)
h(\cdot) = \ln(\cdot)
h(⋅)=ln(⋅)时的广义线性模型就是对数线性回归,即
ln
y
=
w
⃗
T
x
⃗
+
b
\ln y = \vec{w}^T\vec{x} + b
lny=wTx+b
它是通过
exp
(
w
⃗
T
x
⃗
+
b
)
\exp(\vec{w}^T\vec{x} + b)
exp(wTx+b)拟合
y
y
y的。它虽然被称为广义线性回归,但实质上是非线性的。
1.3线性回归的公式及损失函数(Loss Function)
给定数据集
T
=
{
(
x
⃗
1
,
y
1
)
,
(
x
⃗
2
,
y
2
)
,
…
,
(
x
⃗
N
,
y
N
)
}
,
x
⃗
i
∈
X
∈
R
n
,
y
⃗
i
∈
Y
∈
R
,
i
=
1
,
2
,
…
,
N
T = \{(\vec{x}_1,y_1),(\vec{x}_2,y_2),\dots,(\vec{x}_N,y_N)\},\vec{x}_i \in X\in \Bbb R^n,\vec{y}_i \in Y\in \Bbb R,i = 1,2,\dots,N
T={(x1,y1),(x2,y2),…,(xN,yN)},xi∈X∈Rn,yi∈Y∈R,i=1,2,…,N,其中
(
x
⃗
i
=
(
x
i
(
1
)
,
x
i
(
2
)
,
…
,
x
i
(
n
)
)
T
(\vec{x}_i = (x_i^{(1)},x_i^{(2)},\dots,x_i^{(n)})^T
(xi=(xi(1),xi(2),…,xi(n))T。我们需要学习的模型为:
f
(
x
⃗
)
=
w
⃗
⋅
x
⃗
+
b
f(\vec{x}) = \vec{w}\cdot\vec{x} + b
f(x)=w⋅x+b
对于给定的样本
x
⃗
i
\vec{x}_i
xi,其预测值为
y
⃗
i
=
f
(
x
⃗
i
)
=
w
⃗
⋅
x
⃗
+
b
\vec{y}_i = f(\vec{x}_i) = \vec{w}\cdot\vec{x} +b
yi=f(xi)=w⋅x+b。我们采用平方损失函数,则在训练集
T
T
T上,模型的损失函数为:
L
(
f
)
=
∑
i
=
1
N
(
y
^
i
−
y
i
)
2
=
∑
i
=
1
N
(
w
⃗
⋅
x
⃗
i
+
b
−
y
i
)
2
L(f) = \sum_{i=1}^{N}(\hat{y}_i - y_i)^2 = \sum_{i=1}^{N}(\vec{w}\cdot\vec{x}_i + b - y_i)^2
L(f)=i=1∑N(y^i−yi)2=i=1∑N(w⋅xi+b−yi)2
我们的目标是损失函数最小化,即:
(
w
⃗
∗
,
b
∗
)
=
a
r
g
min
w
⃗
,
b
∑
i
=
1
N
(
w
⃗
⋅
x
⃗
i
+
b
−
y
i
)
2
(\vec{w}^*,b^*) = arg\min_{\vec{w},b}\sum_{i=1}^{N}(\vec{w}\cdot\vec{x}_i + b - y_i)^2
(w∗,b∗)=argw,bmini=1∑N(w⋅xi+b−yi)2
可以用梯度下降法来求解上述最优化问题的数值解。使用梯度下降法时,要注意特征归一化。
2求解线性回归的方法
2.1梯度下降法(Gradient Descent)
梯度下降法是最早最简单,也是最为常用的最优化方法。
梯度下降法实现简单,当目标函数是凸函数时,梯度下降法的解是全局解。
一般情况下,其解不保证是全局最优解,梯度下降法的速度也未必是最快的。
梯度下降法的搜索迭代示意图如下图所示:
假设
h
(
θ
)
h(\theta)
h(θ)是要拟合的函数,
J
(
θ
)
J(\theta)
J(θ)是损失函数,
θ
\theta
θ是要迭代求解的值,
θ
\theta
θ求解出来了那最终要拟合的函数h(theta)就出来了。其中m是训练集的样本个数,n是特征的个数。
h
(
θ
)
=
∑
j
=
0
n
θ
j
x
j
h(\theta) = \sum_{j=0}^{n}\theta_jx_j
h(θ)=j=0∑nθjxj
J
(
θ
)
=
1
2
m
∑
i
=
1
m
(
y
i
−
h
θ
(
x
i
)
)
2
J(\theta) = \frac{1}{2m}\sum_{i=1}^{m}(y^i - h_\theta(x^i))^2
J(θ)=2m1i=1∑m(yi−hθ(xi))2
2.1.1批量梯度下降法(Batch Gradient Descent):
在更新参数时使用所有的样本来进行更新;
将
J
(
θ
)
J(\theta)
J(θ)对
θ
\theta
θ求偏导,得到每个theta对应的的梯度:
∂
J
(
θ
)
∂
θ
j
=
−
1
m
∑
i
=
1
m
(
y
i
−
h
θ
(
x
i
)
)
x
j
i
\frac{\partial J(\theta)}{\partial \theta_j} = -\frac{1}{m}\sum_{i=1}^{m}(y^i - h_\theta(x^i))x^i_j
∂θj∂J(θ)=−m1i=1∑m(yi−hθ(xi))xji
由于是要最小化风险函数,所以按每个参数
θ
\theta
θ的梯度负方向,来更新每个
θ
\theta
θ:
θ
j
′
=
θ
j
+
1
m
∑
i
=
1
m
(
y
i
−
h
θ
(
x
i
)
)
x
j
i
\theta_j^\prime = \theta_j + \frac{1}{m}\sum_{i=1}^{m}(y^i - h_\theta(x^i))x^i_j
θj′=θj+m1i=1∑m(yi−hθ(xi))xji
从上面公式可以注意到,它得到的是一个全局最优解,但是每迭代一步,都要用到训练集所有的数据,
如果m很大,那么可想而知这种方法的迭代速度会相当的慢。
所以,这就引入了另外一种方法——随机梯度下降。
2.1.2随机梯度下降法(Stochastic Gradient Descent):
仅选取一个样本来求梯度;
上面的风险函数可以写成如下这种形式,损失函数对应的是训练集中每个样本的粒度,
而上面批量梯度下降对应的是所有的训练样本:
J
(
θ
)
=
1
m
∑
i
=
1
m
1
2
(
y
i
−
h
θ
(
x
i
)
)
2
=
1
m
∑
i
=
1
m
cos
t
(
θ
,
(
x
i
,
y
i
)
)
J(\theta) = \frac{1}{m}\sum_{i=1}^{m}\frac{1}{2}(y^i - h_\theta(x^i))^2 = \frac{1}{m}\sum_{i=1}^{m}\cos t(\theta,(x^i,y^i))
J(θ)=m1i=1∑m21(yi−hθ(xi))2=m1i=1∑mcost(θ,(xi,yi))
c
o
s
t
(
θ
,
(
x
i
,
y
i
)
)
=
1
2
(
y
i
−
h
θ
(
x
i
)
)
2
cos t(\theta,(x^i,y^i)) = \frac{1}{2}(y^i - h_\theta(x^i))^2
cost(θ,(xi,yi))=21(yi−hθ(xi))2
每个样本的损失函数,对
θ
\theta
θ求偏导得到对应梯度,来更新
θ
\theta
θ:
θ
j
′
=
θ
j
+
(
y
i
−
h
θ
(
x
i
)
)
x
j
i
\theta_j^\prime = \theta_j + (y^i - h_\theta(x^i))x^i_j
θj′=θj+(yi−hθ(xi))xji
2.1.3小批量梯度下降法(Mini-batch Gradient Descent):
小批量梯度下降法是批量梯度下降法和随机梯度下降法的折衷,也就是对于 m 个样本, 采用 x 个样本来迭代,1<x<m。一般可以取 x=10。
θ
:
=
θ
j
−
α
1
10
∑
k
=
i
i
+
9
(
h
θ
(
x
(
k
)
)
−
y
(
k
)
)
x
j
(
k
)
\theta := \theta_j - \alpha\frac{1}{10}\sum_{k=i}^{i+9}(h_\theta(x^{(k)})- y^{(k)})x^{(k)}_j
θ:=θj−α101k=i∑i+9(hθ(x(k))−y(k))xj(k)
2.1.4梯度下降法的缺点:
(1)靠近极小值时收敛速度减慢,如下图所示;
(2)直线搜索时可能会产生一些问题;
(3)可能会“之字形”地下降。
2.2最小二乘法(Least Square Method)
在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧式距离之和最小。实际在求解时,用最小二乘法求解解析解的问题被称为多元线性回归(multivariate linear regression)。
令:
w
~
⃗
=
(
w
(
1
)
,
w
(
2
)
,
…
,
w
(
n
)
,
b
)
T
=
(
w
⃗
T
,
b
)
T
x
~
⃗
=
(
x
(
1
)
,
x
(
2
)
,
…
,
x
(
n
)
,
1
)
T
=
(
x
⃗
T
,
1
)
T
y
⃗
=
(
y
1
,
y
2
,
…
,
y
N
)
T
\vec{\tilde{w}} = (w^{(1)},w^{(2)},\dots,w^{(n)},b)^T = (\vec{w}^T,b)^T\\ \vec{\tilde{x}} = (x^{(1)},x^{(2)},\dots,x^{(n)},1)^T = (\vec{x}^T,1)^T\\ \vec y = (y_1,y_2,\dots,y_N)^T
w~=(w(1),w(2),…,w(n),b)T=(wT,b)Tx~=(x(1),x(2),…,x(n),1)T=(xT,1)Ty=(y1,y2,…,yN)T
则有:
∑
i
=
1
N
(
w
⃗
⋅
x
i
⃗
+
b
−
y
i
)
2
=
(
y
⃗
−
(
x
~
⃗
1
,
x
~
⃗
2
,
…
,
x
~
⃗
N
)
T
w
~
⃗
)
T
(
y
⃗
−
(
x
~
⃗
1
,
x
~
⃗
2
,
…
,
x
~
⃗
N
)
T
w
~
⃗
)
\sum_{i=1}^{N}(\vec{w}\cdot\vec{x_i} + b - y_i)^2 = (\vec{y} - (\vec{\tilde{x}}_1,\vec{\tilde{x}}_2,\dots,\vec{\tilde{x}}_N)^T\vec{\tilde{w}})^T (\vec{y} - (\vec{\tilde{x}}_1,\vec{\tilde{x}}_2,\dots,\vec{\tilde{x}}_N)^T\vec{\tilde{w}})
i=1∑N(w⋅xi+b−yi)2=(y−(x~1,x~2,…,x~N)Tw~)T(y−(x~1,x~2,…,x~N)Tw~)
令:
x
⃗
=
(
x
~
⃗
1
,
x
~
⃗
2
,
…
,
x
~
⃗
N
)
T
=
[
x
~
⃗
1
T
x
~
⃗
2
T
⋮
x
~
⃗
N
T
]
=
[
x
1
(
1
)
x
1
(
2
)
…
x
1
(
n
)
1
x
2
(
1
)
x
2
(
2
)
…
x
2
(
n
)
1
⋮
⋮
⋱
⋮
1
x
N
(
1
)
x
N
(
2
)
…
x
N
(
n
)
1
]
\vec{x} = (\vec{\tilde{x}}_1,\vec{\tilde{x}}_2,\dots,\vec{\tilde{x}}_N)^T = \begin{bmatrix} \vec{\tilde{x}}_1^T \\ \vec{\tilde{x}}_2^T \\ \vdots \\ \vec{\tilde{x}}_N^T \\ \end{bmatrix} = \begin{bmatrix} x_1^{(1)} & x_1^{(2)} & \dots & x_1^{(n)} & 1\\ x_2^{(1)} & x_2^{(2)} & \dots & x_2^{(n)} & 1 \\ \vdots & \vdots & \ddots & \vdots & 1 \\ x_N^{(1)} & x_N^{(2)} & \dots & x_N^{(n)} & 1 \\ \end{bmatrix}
x=(x~1,x~2,…,x~N)T=⎣⎢⎢⎢⎢⎡x~1Tx~2T⋮x~NT⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡x1(1)x2(1)⋮xN(1)x1(2)x2(2)⋮xN(2)……⋱…x1(n)x2(n)⋮xN(n)1111⎦⎥⎥⎥⎥⎤
则:
w
~
⃗
∗
=
a
r
g
min
w
~
⃗
(
y
⃗
−
x
⃗
w
~
⃗
)
T
(
y
⃗
−
x
⃗
w
~
⃗
)
\vec{\tilde{w}}^* = arg\min_{\vec{\tilde{w}}}(\vec{y} - \vec{x}\vec{\tilde{w}})^T (\vec{y} - \vec{x}\vec{\tilde{w}})
w~∗=argw~min(y−xw~)T(y−xw~)
令
E
w
~
⃗
=
(
y
⃗
−
x
⃗
w
~
⃗
)
T
(
y
⃗
−
x
⃗
w
~
⃗
)
E_{\vec{\tilde{w}}} = (\vec{y} - \vec{x}\vec{\tilde{w}})^T (\vec{y} - \vec{x}\vec{\tilde{w}})
Ew~=(y−xw~)T(y−xw~),求它的极小值。对
w
~
⃗
\vec{\tilde{w}}
w~求导令导数为零,得到解析解:
∂
E
w
~
⃗
∂
w
~
⃗
=
2
x
⃗
T
(
x
⃗
w
~
⃗
−
y
⃗
)
=
0
⃗
⟹
x
⃗
T
x
⃗
w
~
⃗
=
x
⃗
T
y
⃗
\frac{\partial E_{\vec{\tilde{w}}}}{\partial \vec{\tilde{w}}} = 2\vec{x}^T (\vec{x}\vec{\tilde{w}} - \vec{y}) = \vec{0} \Longrightarrow \vec{x}^T \vec{x}\vec{\tilde{w}} = \vec{x}^T \vec{y}
∂w~∂Ew~=2xT(xw~−y)=0⟹xTxw~=xTy
当
x
⃗
T
x
⃗
\vec{x}^T \vec{x}
xTx为满秩矩阵或者正定矩阵时,可得:
w
~
⃗
∗
=
(
x
⃗
T
x
⃗
)
−
1
x
⃗
T
y
⃗
\vec{\tilde{w}}^* = (\vec{x}^T \vec{x})^{-1}\vec{x}^T\vec{y}
w~∗=(xTx)−1xTy
于是学得多元线性回归模型为:
f
(
x
~
⃗
i
)
=
x
~
⃗
i
T
w
~
⃗
∗
f(\vec{\tilde{x}}_i) = \vec{\tilde{x}}_i^T \vec{\tilde{w}}^*
f(x~i)=x~iTw~∗
当
x
⃗
T
x
⃗
\vec{x}^T \vec{x}
xTx不为满秩矩阵时,存在多个解析解。我们引入
L
2
L_2
L2正则化项:
w
~
⃗
∗
=
a
r
g
min
w
~
⃗
[
(
y
⃗
−
x
⃗
w
~
⃗
)
T
(
y
⃗
−
x
⃗
w
~
⃗
)
+
λ
∣
∣
w
~
⃗
∣
∣
2
2
]
\vec{\tilde{w}}^* = arg\min_{\vec{\tilde{w}}} [(\vec{y} - \vec{x}\vec{\tilde{w}})^T (\vec{y} - \vec{x}\vec{\tilde{w}}) + \lambda\lvert\lvert\vec{\tilde{w}}\lvert\lvert_2^2]
w~∗=argw~min[(y−xw~)T(y−xw~)+λ∣∣w~∣∣22]其中,
λ
>
0
\lambda >0
λ>0调整正则化项与均方误差的比例;
∣
∣
…
∣
∣
2
\lvert\lvert\dots\lvert\lvert_2
∣∣…∣∣2为
L
2
L_2
L2范数。
2.3牛顿法(Newton’s Method)
牛顿法是一种在实数域和复数域上近似求解方程的方法。方法使用函数
f
(
x
)
f (x)
f(x)的泰勒级数的前面几项来寻找方程
f
(
x
)
=
0
f (x) = 0
f(x)=0的根。牛顿法最大的特点就在于它的收敛速度很快。
具体步骤:
首先,选择一个接近函数
f
(
x
)
f (x)
f(x)零点的
x
0
x_0
x0,计算相应的
f
(
x
0
)
f (x_0)
f(x0)和切线斜率
f
′
(
x
0
)
f^\prime(x_0)
f′(x0)。然后我们计算穿过点
(
x
0
,
f
(
x
0
)
)
(x_0, f(x_0))
(x0,f(x0)) 并且斜率为
f
′
(
x
0
)
f ^\prime(x_0)
f′(x0)的直线和 x 轴的交点的x坐标,也就是求如下方程的解:
x
⋅
f
′
(
x
0
)
+
f
(
x
0
)
−
x
0
⋅
f
′
(
x
0
)
=
0
x\cdot f^\prime(x_0)+f(x_0)-x_0\cdot f^\prime(x_0) = 0
x⋅f′(x0)+f(x0)−x0⋅f′(x0)=0
我们将新求得的点的 x 坐标命名为
x
1
x_1
x1,通常
x
1
x_1
x1会比
x
0
x_0
x0更接近方程
f
(
x
)
=
0
f(x) = 0
f(x)=0的解。因此我们现在可以利用
x
1
x_1
x1开始下一轮迭代。迭代公式可化简为如下所示:
x
n
+
1
=
x
n
−
f
(
x
n
)
f
′
(
x
n
)
x_{n+1} = x_n-\frac{f(x_n)}{f^\prime(x_n)}
xn+1=xn−f′(xn)f(xn)
已经证明,如果
f
′
f^\prime
f′ 是连续的,并且待求的零点x是孤立的,那么在零点x周围存在一个区域,只要初始值
x
0
x_0
x0位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果
f
′
(
x
)
f^\prime(x)
f′(x)不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。
由于牛顿法是基于当前位置的切线来确定下一次的位置,所以牛顿法又被很形象地称为是"切线法"。
2.3.1关于牛顿法和梯度下降法的效率对比:
从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。
如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,
梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,
牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。
所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。
(牛顿法目光更加长远,所以少走弯路;相对而言,梯度下降法只考虑了局部的最优,没有全局思想。)
2.3.2牛顿法的优缺点总结:
优点:二阶收敛,收敛速度快;
缺点:牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。
参考资料:
常见的几种最优化方法(梯度下降法、牛顿法、拟牛顿法、共轭梯度法等)
线性回归 - 爖
线性回归算法 - 黑桃
《Python大战机器学习》华校专著