简介
线性回归,可谓是机器学习领域的HelloWorld了。工作中大部分预测、监控之类的需求,都可以用线性回归来解决。
那么用了这么久,你真的了解它吗?是否是日用而不知?
线性回归是怎么来的?损失函数为何是二乘函数(最小二乘法)?如何求解最优解?
本文将对这些问题一一解答。
前世今生
线性回归并非是机器学习领域的发明,而是从其他学科领域借鉴过来。
具体地说,线性回归来自于生物学。早在19世纪,就有生物学家在研究人类的遗传时发现:人类的身高存在「回归均值」的现象。
举个栗子:姚小明的父母身高都很高(高于平均值),那么姚小明的身高不会比父母更高,而是向下趋于平均值;潘小江的父母身高都很矮(低于平均值),那么潘小江的身高不会比父母更矮,而是向上趋于平均值。
用公式表达:
孩子身高 = 人类平均身高 + 父母身高 * w
假设,人类平均身高为1.8,w为0.1,那么计算孩子的身高公式为:
孩子身高 = 1.8 + 0.1 * 父母身高
如果父母身高是2.4,孩子身高会被拽向1.8,计算得2.04;如果父母身高为1.6,孩子身高会被拉向1.8,计算得1.96。
这种现象就是「回归均值」现象,就好像有股力量拉着你,当你走向极端时,被它拉了回来。
我们今天所说的「线性回归」其实就是从「均值回归」发展来的。现在我们都知道,孩子的身高会在人类平均身高附近波动,这种波动符合正态分布,可以用最小二乘法求解w的值。可当时的人们哪知道什么是「正态分布」,又哪里知道「最小二乘法」。
曲折的最小二乘法
最小二乘法是统计学里解决线性回归问题的基础方法,那么,为什么是「最小二乘法」,而不是「最小差值法」、「最小四乘法」?
还得回到19世纪。
当时,人们经常做各种各样的实验。既然是实验,就少不了误差的干扰。就有人来研究,有什么办法来减少误差呢?
有人马上脱口而出:多次测量,取平均值!那么,为什么是平均值呢?为什么不是中位数、众数呢?
当时有个法国的科学家勒让德就想:如果每次测量都是有误差的,那么这个误差一定是在「真值」附近上下波动。那真值就应该是让这些误差波动最小的那个值,那么误差平方也会最小,而这个y就是「真值」。
举个栗子:说要测量一个物体的长度,测量了5次,测定的值分别是
y
1
=
10.3
y_1 = 10.3
y1=10.3
y
2
=
10.2
y_2 = 10.2
y2=10.2
y
3
=
9.9
y_3 = 9.9
y3=9.9
y
4
=
9.8
y_4 = 9.8
y4=9.8
y
5
=
9.8
y_5 = 9.8
y5=9.8
假设真值是y,那么y应该是那个让5此测量误差平方和最小的值。
即求:
(
y
−
y
1
)
2
+
(
y
−
y
2
)
2
+
(
y
−
y
3
)
2
+
(
y
−
y
4
)
2
+
(
y
−
y
5
)
2
(y-y_1)^2 + (y-y_2)^2 + (y-y_3)^2 + (y-y_4)^2 + (y-y_5)^2
(y−y1)2+(y−y2)2+(y−y3)2+(y−y4)2+(y−y5)2
值最小的。
这是个关于的2次函数,很容易证明2次函数是凸函数(二阶导数>=0),所以会有最小值,且最小值在导数为0处。
求导数,另导数为0,得:
2
(
y
−
y
1
)
+
2
(
y
−
y
2
)
+
2
(
y
−
y
3
)
+
2
(
y
−
y
4
)
+
2
(
y
−
y
5
)
=
0
2(y-y_1) + 2(y-y_2) + 2(y-y_3) + 2(y-y_4) + 2(y-y_5) = 0
2(y−y1)+2(y−y2)+2(y−y3)+2(y−y4)+2(y−y5)=0
求得:
y
=
(
y
1
+
y
2
+
y
3
+
y
4
+
y
5
)
/
5
y = (y_1 + y_2 + y_3 + y_4 + y_5) / 5
y=(y1+y2+y3+y4+y5)/5
y
y
y恰好是5次测量的平均值。这就回答了,为什么多次测量取平均值就能减少误差。
可是,为什么要误差平方和最小?为什么不用误差绝对值和最小?为什么不用误差4次方?这个问题勒让德也没有很好的解释,他只能说:2次方好计算。
当时有另外一个个数学家高斯有着同样的疑问。他就要一探究竟,为什么是最小2次方,而不是其他。
他用了概率的方法来解答此问题。假设真值为y,那么每次测量的误差为:
e
i
=
y
−
y
i
e_i = y - y_i
ei=y−yi,误差的概率密度函数为:。
那么,5次测量的联合概率为:
L
(
y
)
=
p
(
e
1
)
∗
p
(
e
2
)
∗
p
(
e
3
)
∗
p
(
e
4
)
∗
p
(
e
5
)
L(y) = p(e_1)*p(e_2)*p(e_3)*p(e_4)*p(e_5)
L(y)=p(e1)∗p(e2)∗p(e3)∗p(e4)∗p(e5)
即:
L
(
y
)
=
p
(
y
−
y
1
)
∗
p
(
y
−
y
2
)
∗
p
(
y
−
y
3
)
∗
p
(
y
−
y
4
)
∗
p
(
y
−
y
5
)
L(y)=p(y-y_1)*p(y-y_2)*p(y-y_3)*p(y-y_4)*p(y-y_5)
L(y)=p(y−y1)∗p(y−y2)∗p(y−y3)∗p(y−y4)∗p(y−y5)
这是关于y的似然函数。
他认为,之所以观测到误差是这个结果,是因为这个结果发生的概率最大,也就是似然值最大。
最终,高斯证明:如果误差服从正态分布,那么必须要求误差的平方和最小,才能使得似然值最大,这种方法叫「极大似然估计」。
那么,测量误差是服从正态分布的吗?同时期的数据家拉普拉斯后来证明,误差还真就是服从正态分布的!
如今,我们有了结论:如果实验观测误差服从正态分布,那么可以用最小二乘法(最小化二次方之和)求解真值。
以上是根据观测值估计一个真值的情况,那么如果是估计一个函数,是否也能用最小二乘法呢?
答案是可以的。
实际上,估计函数就是估计函数的系数。
例如,有一些
(
x
,
y
)
(x,y)
(x,y)对,发现与大致分布在一条直线上,如下图:
线性回归
我们可以猜测,与存在线性关系:
y
^
=
w
∗
x
+
b
\hat{y} = w*x + b
y^=w∗x+b
那么对于每个,都可以用上式计算得到对应的,与的差值记作,可以看做观测值与真值的误差,如果这个误差服从「正态分布」,就可以用「最小二乘法」来估计真值了,即:
m
i
n
L
(
w
,
b
)
=
m
i
n
∑
i
=
1
m
(
w
∗
x
i
+
b
−
y
i
)
2
min L(w,b) = min \sum_{i=1}^{m}(w*x_i + b - y_i)^2
minL(w,b)=mini=1∑m(w∗xi+b−yi)2
这就是我们所说的「线性回归」问题,其中,
L
(
w
,
b
)
L(w,b)
L(w,b)就是所说的「损失函数」。
如何求解
书接上文,「损失函数」为:
L
(
w
,
b
)
=
∑
i
=
1
m
(
w
∗
x
i
+
b
−
y
i
)
2
L(w,b) = \sum_{i=1}^{m}(w*x_i + b - y_i)^2
L(w,b)=i=1∑m(w∗xi+b−yi)2
这是关于
(
w
,
b
)
(w,b)
(w,b)的2次函数,分别对和求偏导数,另偏导数为0,得到方程组,解方程组即可。
很明显,方程组有两个未知数:w和b,至少需要两对不同的 ( x i , y i ) (x_i,y_i) (xi,yi),方程组才有解。
如果是「多元线性回归」呢?
同样可以猜测,与存在线性关系:
y
^
=
w
1
∗
x
1
+
.
.
.
+
w
n
∗
x
n
+
b
\hat{y} = w_1*x_1 + ... + w_n*x_n + b
y^=w1∗x1+...+wn∗xn+b
优化目标为:
m
i
n
L
(
w
1
,
w
2
,
.
.
.
,
w
n
,
b
)
=
m
i
n
∑
i
=
1
m
(
∑
j
=
1
n
w
j
∗
x
i
j
+
b
−
y
i
)
2
min L(w_1, w_2,..., w_n ,b) = min \sum_{i=1}^{m}(\sum_{j=1}^{n} w_j*x_{ij} + b - y_i)^2
minL(w1,w2,...,wn,b)=mini=1∑m(j=1∑nwj∗xij+b−yi)2
同样,可以求 L L L对 w w w各个的偏导数,另为0,解方程组得到 w 1 , w 2 , . . . , w n , b w_1, w_2,..., w_n ,b w1,w2,...,wn,b。
但是,这样太复杂了,我们借助矩阵、向量来解方程。
重新整理估计函数:
y
^
=
w
0
∗
x
0
+
w
1
∗
x
1
+
.
.
.
+
w
n
∗
x
n
\hat{y} = w_0*x_0 + w_1*x_1 + ... + w_n*x_n
y^=w0∗x0+w1∗x1+...+wn∗xn
其中,
w
0
w_0
w0是原来的
b
b
b,
x
0
x_0
x0恒为1。
则m个观察样本为:
y
^
(
1
)
=
w
0
∗
x
0
(
1
)
+
w
1
∗
x
1
(
1
)
+
.
.
.
+
w
n
∗
x
n
(
1
)
\hat{y}^{(1)} = w_0*x_0^{(1)} + w_1*x_1^{(1)} + ... + w_n*x_n^{(1)}
y^(1)=w0∗x0(1)+w1∗x1(1)+...+wn∗xn(1)
y
^
(
2
)
=
w
0
∗
x
0
(
2
)
+
w
1
∗
x
1
(
2
)
+
.
.
.
+
w
n
∗
x
n
(
2
)
\hat{y}^{(2)} = w_0*x_0^{(2)} + w_1*x_1^{(2)} + ... + w_n*x_n^{(2)}
y^(2)=w0∗x0(2)+w1∗x1(2)+...+wn∗xn(2)
.
.
.
...
...
y
^
(
m
)
=
w
0
∗
x
0
(
m
)
+
w
1
∗
x
1
(
m
)
+
.
.
.
+
w
n
∗
x
n
(
m
)
\hat{y}^{(m)} = w_0*x_0^{(m)} + w_1*x_1^{(m)} + ... + w_n*x_n^{(m)}
y^(m)=w0∗x0(m)+w1∗x1(m)+...+wn∗xn(m)
上角标m表示第m个样本。
每个样本的误差表示为
e
(
m
)
e^{(m)}
e(m),则有:
e
(
1
)
=
w
0
∗
x
0
(
1
)
+
w
1
∗
x
1
(
1
)
+
.
.
.
+
w
n
∗
x
n
(
1
)
−
y
(
1
)
e^{(1)} = w_0*x_0^{(1)} + w_1*x_1^{(1)} + ... + w_n*x_n^{(1)} - y^{(1)}
e(1)=w0∗x0(1)+w1∗x1(1)+...+wn∗xn(1)−y(1)
e
(
2
)
=
w
0
∗
x
0
(
2
)
+
w
1
∗
x
1
(
2
)
+
.
.
.
+
w
n
∗
x
n
(
2
)
−
y
(
2
)
e^{(2)} = w_0*x_0^{(2)} + w_1*x_1^{(2)} + ... + w_n*x_n^{(2)} - y^{(2)}
e(2)=w0∗x0(2)+w1∗x1(2)+...+wn∗xn(2)−y(2)
.
.
.
...
...
e
(
m
)
=
w
0
∗
x
0
(
m
)
+
w
1
∗
x
1
(
m
)
+
.
.
.
+
w
n
∗
x
n
(
m
)
−
y
(
m
)
e^{(m)} = w_0*x_0^{(m)} + w_1*x_1^{(m)} + ... + w_n*x_n^{(m)} - y^{(m)}
e(m)=w0∗x0(m)+w1∗x1(m)+...+wn∗xn(m)−y(m)
用矩阵和向量表示为:
[
e
(
1
)
e
(
2
)
.
.
.
e
(
m
)
]
=
[
x
0
(
1
)
x
1
(
1
)
x
n
(
1
)
x
0
(
2
)
x
1
(
2
)
x
n
(
2
)
.
.
.
.
.
.
.
.
.
x
0
(
m
)
x
1
(
m
)
x
n
(
m
)
]
⋅
[
w
0
w
1
.
.
.
w
n
]
−
[
y
(
1
)
y
(
2
)
.
.
.
y
(
m
)
]
\begin{bmatrix} e^{(1)} \\ e^{(2)} \\ ... \\ e^{(m)} \end{bmatrix} = \begin{bmatrix} x_0^{(1)} & x_1^{(1)} & x_n^{(1)} \\ x_0^{(2)} & x_1^{(2)} & x_n^{(2)} \\ ... & ... & ...\\ x_0^{(m)} & x_1^{(m)} & x_n^{(m)} \end{bmatrix} \cdot \begin{bmatrix} w_0 \\ w_1 \\ ... \\ w_n \end{bmatrix} {-} \begin{bmatrix} y^{(1)} \\ y^{(2)} \\ ... \\ y^{(m)} \end{bmatrix}
e(1)e(2)...e(m)
=
x0(1)x0(2)...x0(m)x1(1)x1(2)...x1(m)xn(1)xn(2)...xn(m)
⋅
w0w1...wn
−
y(1)y(2)...y(m)
即:
e
⃗
=
X
w
⃗
−
y
⃗
\vec{e} = X\vec{w} - \vec{y}
e=Xw−y
则误差平方和为:
e
⃗
2
=
e
⃗
T
e
⃗
=
(
X
w
⃗
−
y
⃗
)
T
(
X
w
⃗
−
y
⃗
)
\vec{e}^{2} = \vec{e}^{T}\vec{e} = (X\vec{w} - \vec{y})^T(X\vec{w} - \vec{y})
e2=eTe=(Xw−y)T(Xw−y)
展开得到:
e
⃗
T
e
⃗
=
w
⃗
T
X
T
X
w
⃗
−
w
⃗
T
X
T
y
⃗
−
y
⃗
T
X
w
⃗
+
y
⃗
T
y
⃗
\vec{e}^{T}\vec{e} =\vec{w}^TX^TX\vec{w} - \vec{w}^TX^T\vec{y} - \vec{y}^TX\vec{w} + \vec{y}^T\vec{y}
eTe=wTXTXw−wTXTy−yTXw+yTy
其中,
w
⃗
T
X
T
y
⃗
\vec{w}^TX^T\vec{y}
wTXTy 和
y
⃗
T
X
w
⃗
\vec{y}^TX\vec{w}
yTXw的结果都是标量(实际上式中每项结果都是标量),对于标量有
α
T
=
α
\alpha^T = \alpha
αT=α,所以
y
⃗
T
X
w
⃗
=
(
y
⃗
T
X
w
⃗
)
T
=
w
⃗
T
X
T
y
⃗
\vec{y}^TX\vec{w} = (\vec{y}^TX\vec{w})^T = \vec{w}^TX^T\vec{y}
yTXw=(yTXw)T=wTXTy,于是得到:
e
⃗
T
e
⃗
=
w
⃗
T
X
T
X
w
⃗
−
2
w
⃗
T
X
T
y
⃗
+
y
⃗
T
y
⃗
\vec{e}^{T}\vec{e} =\vec{w}^TX^TX\vec{w} - 2\vec{w}^TX^T\vec{y} + \vec{y}^T\vec{y}
eTe=wTXTXw−2wTXTy+yTy
以上转换过程中用到了公式:
(
A
B
)
T
=
B
T
A
T
(AB)^T = B^TA^T
(AB)T=BTAT
要求最小值,另各个偏导数为0,解方程组即可,即:
∂
e
⃗
T
e
⃗
∂
w
0
=
0
;
∂
e
⃗
T
e
⃗
∂
w
1
=
0
;
.
.
.
;
∂
e
⃗
T
e
⃗
∂
w
n
=
0
;
\frac{\partial \vec{e}^{T}\vec{e}}{\partial w_0} = 0;\frac{\partial \vec{e}^{T}\vec{e}}{\partial w_1} = 0;...;\frac{\partial \vec{e}^{T}\vec{e}}{\partial w_n} = 0;
∂w0∂eTe=0;∂w1∂eTe=0;...;∂wn∂eTe=0;
为了表示方便,我们用「梯度」来代替偏导数。梯度就是各个偏导数组成的向量:
∇
w
⃗
e
⃗
T
e
⃗
=
∂
e
⃗
T
e
⃗
∂
w
⃗
=
[
∂
e
⃗
T
e
⃗
∂
w
0
∂
e
⃗
T
e
⃗
∂
w
1
.
.
.
∂
e
⃗
T
e
⃗
∂
w
n
]
\nabla_{\vec{w}}\vec{e}^T\vec{e} = \frac{\partial \vec{e}^{T}\vec{e}}{\partial \vec{w}} = \begin{bmatrix} \frac{\partial \vec{e}^{T}\vec{e}}{\partial w_0} \\ \frac{\partial \vec{e}^{T}\vec{e}}{\partial w_1} \\ ... \\ \frac{\partial \vec{e}^{T}\vec{e}}{\partial w_n} \end{bmatrix}
∇weTe=∂w∂eTe=
∂w0∂eTe∂w1∂eTe...∂wn∂eTe
让各个偏导数为0,其实就是让梯度为0。
由于 x ⃗ T A x ⃗ \vec{x}^TA\vec{x} xTAx 对 x ⃗ \vec{x} x求导为 ( A + A T ) x ⃗ (A+A^T) \vec{x} (A+AT)x,所以第一项 w ⃗ T X T X w ⃗ \vec{w}^TX^TX\vec{w} wTXTXw 对 w ⃗ \vec{w} w求导为 ( X T X + ( X T X ) T ) w ⃗ (X^TX + (X^TX)^T)\vec{w} (XTX+(XTX)T)w,即 2 X T X w ⃗ 2X^TX\vec{w} 2XTXw ;对于第二项 2 w ⃗ T X T y ⃗ 2\vec{w}^TX^T\vec{y} 2wTXTy对 w ⃗ \vec{w} w求导为 2 X T y ⃗ 2X^T\vec{y} 2XTy ;
合并整理得:
∇
w
⃗
e
⃗
T
e
⃗
=
∂
e
⃗
T
e
⃗
∂
w
⃗
=
2
X
T
X
w
⃗
−
2
X
T
y
⃗
\nabla_{\vec{w}}\vec{e}^T\vec{e} = \frac{\partial \vec{e}^{T}\vec{e}}{\partial \vec{w}} = 2X^TX\vec{w} - 2X^T\vec{y}
∇weTe=∂w∂eTe=2XTXw−2XTy
另梯度为0,得到:
2
X
T
X
w
⃗
−
2
X
T
y
⃗
=
0
2X^TX\vec{w} - 2X^T\vec{y} = 0
2XTXw−2XTy=0
计算
w
⃗
\vec{w}
w为:
w
⃗
=
(
X
T
X
)
−
1
X
T
y
⃗
\vec{w} = (X^TX)^{-1}X^T\vec{y}
w=(XTX)−1XTy
这样,就可以直接用解方程的方式来计算 w ⃗ \vec{w} w了。
梯度下降求解
理论上只要 X T X X^TX XTX可逆,就能用解方程的方式求解 w ⃗ \vec{w} w了,但如果 X T X X^TX XTX是个非常大的矩阵,甚至大到无法把一个矩阵放入内存,求逆矩阵就没有那么容易了,这时就需要使用「梯度下降法」来求近似解了。
大体思想是,任意选择一个 w ⃗ \vec{w} w 的初始值,计算此时的梯度(前边已经提到了梯度,即偏导数组成的向量),使 w ⃗ \vec{w} w沿着梯度方向前进一小步 α \alpha α ,重复以上步骤,如果梯度小于某个临界值 e e e,则终止。
参考:
[http://www.52nlp.cn/正态分布的前世今生四]
[最小二乘法的历史回顾与现状]
| 文章出处:https://www.jianshu.com/p/74096ef5a5fb