回归大致可以理解为根据数据集DD,拟合出近似的曲线,所以回归也常称为拟合,像下列右图一样拟合出来是直线的就称为线性回归

1

下面就来解释其中的一些细节。

线性回归

首先,为什么拟合曲线会被称为回归呢?

均值回归

“回归”这个词源于弗朗西斯·高尔顿爵士

他发现高个子父亲的儿子身高会矮一些,而矮个子父亲的儿子身高会高一些(否则高个子家族会越来越高,而矮个子家族会越来越矮),也就是说人类的身高都会回到平均值附近,他将这种现象称为均值回归

线性回归

高尔顿的研究过程用现在的数学语言来表述就是,首先对一些父子的身高进行了抽样,得到数据集DD;然后根据数据集拟合出一条直线;最后通过该直线就可以对某父亲的x\boldsymbol{x}儿子的身高进行预测了:

数据集D

拟合

预测

高尔顿拟合的直线方程为(单位为米):

\begin{align}y=0.516x+0.8567\end{align}

将方程和y=xy=x联立,可得:

\begin{align}\begin{cases} y=0.516x+0.8567\\ y=x \end{cases} \implies x\approx 1.77,y\approx 1.77\end{align}

也就是说这两条直线会交于点 (1.77, 1.77),这说明身高低于1.77米的父亲,他的儿子身高会高一些;而高于1.77米的父亲,他的儿子身高会矮一些。:

1

所以这条拟合出来的直线,其实就表示了均值回归现象,因此拟合直线的过程被称为 线性回归(英文:Linear Regression)。

经验误差函数

下面开始解释高尔顿是如何根据数据集来拟合直线的。先来介绍下线性回归的经验误差是什么。

假设空间H\mathcal{H}

首先肯定是用直线来进行拟合:

1

所以假设空间为:

\begin{align}\mathcal{H}=\{h(\boldsymbol{x})=\boldsymbol{w}\cdot\boldsymbol{x}+b\}\end{align}

和感知机的假设空间差不多,只是少了sign\operatorname{sign}函数。

数据集DD

在历史上,高尔顿总共采集了近千个父子身高的数据来拟合。本课为了方便讲解,我们从中抽取了六个(原始数据的单位是“英寸”,这里全部转为了“米”)作为数据集DD

\begin{align}\begin{array}{c|c|c}\hline 父亲身高(x) & 孩子身高(y) \\ \hline \\ 1.51&1.63\\ 1.64&1.7\\ 1.6&1.71\\ 1.73&1.72\\ 1.82&1.76\\ 1.87&1.86\\ \\ \hline\end{array}\end{align}

1

经验误差

随便找一条假设空间中的直线h(x)Hh(x)\in\mathcal{H},对于某父亲身高xix_i,该直线给出的h(xi)h(x_i)和真实的儿子身高yiy_i是存在距离的,这个距离也称为点与直线的误差,高尔顿用两者差的平方来表示(yih(xi))2\Big(y_i-h(x_i)\Big)^2

1

将数据集DD中所有点与该直线的误差加起来,再进行算术平均就是该直线在数据集上DD的经验误差:

\begin{align}\hat{R}_D(h) =\frac{1}{|D|}\sum_{i}\Big(y_i-h(x_i)\Big)^2=\frac{1}{|D|}\sum_{i}\Big(y_i-(\boldsymbol{w}\cdot\boldsymbol{x_i}+b)\Big)^2\end{align}

其中D|D|表示该数据集的大小。

最小二乘法

有了经验误差函数之后,就可以利用上一单元介绍的经验误差最小原则来设计算法,从而在假设空间H\mathcal{H}中挑选离ff最近的hh作为gg

1

具体到线性回归中,其经验误差函数为:

\begin{align}\hat{R}_D(h) =\frac{1}{|D|}\sum_{i}\Big(y_i-h(x_i)\Big)^2=\frac{1}{|D|}\sum_{i}\Big(y_i-(\boldsymbol{w}\cdot\boldsymbol{x_i}+b)\Big)^2\end{align}

根据经验误差最小原则,只需要求出使得该经验误差函数取得最小值的w^\hat{\boldsymbol{w}}b^\hat{b}

\begin{align}\hat{\boldsymbol{w}},\hat{b}=\operatorname*{argmin}_{\boldsymbol{w},b}\hat{R}(h)\end{align}

实际上就得到了离ff最近的hh,本节就来介绍如何求解w^\hat{\boldsymbol{w}}b^\hat{b}

凸函数

首先,将手上的数据集DD

\begin{align}\begin{array}{c|c|c}\hline 父亲身高(x) & 孩子身高(y) \\ \hline \\ 1.51&1.63\\ 1.64&1.7\\ 1.6&1.71\\ 1.73&1.72\\ 1.82&1.76\\ 1.87&1.86\\ \\ \hline\end{array}\end{align}

代入线性回归的经验误差函数后可得:

\begin{align}\begin{aligned} \hat{R}_D(h) &=\frac{1}{|D|}\sum_{i}\Big(y_i-h(x_i)\Big)^2=\frac{1}{|D|}\sum_{i}\Big(y_i-(\boldsymbol{w}\cdot\boldsymbol{x_i}+b)\Big)^2\\ &=\frac{1}{6}\Big[\Big(1.63-(1.51w+b)\Big)^2+\Big(1.7-(1.64w+b)\Big)^2\\ &\qquad\quad+\Big(1.71-(1.6w+b)\Big)^2+\Big(1.72-(1.73w+b)\Big)^2\\ &\qquad\quad+\Big(1.76-(1.82w+b)\Big)^2+\Big(1.87-(1.86w+b)\Big)^2\Big] \end{aligned}\end{align}

可见R^D(h)\hat{R}_D(h)是关于wwbb的函数,并且是 凸函数(英文:Convex Function)。凸函数意味着画出来看上去是山谷:

1

凸函数的最小值

就如山谷肯定有最低点一样,凸函数肯定有最小值,这说明最小值是一定存在的。并且更重要的是,使得经验误差函数R^D(h)\hat{R}_D(h)取得最小值的w^\hat{\boldsymbol{w}}b^\hat{b},可以通过求解下面方程组得到:

\begin{align} \begin{cases} \displaystyle\frac{\partial }{\partial w}\hat{R}_D(h)=0\\ \displaystyle\frac{\partial }{\partial b}\hat{R}_D(h)=0 \end{cases} \implies \hat{\boldsymbol{w}}=?,\hat{b}=? \end{align}

查看详情

三维的凸函数可能不好观察,我们看看二维的凸函数。比如y=x2y=x^2就是二维的凸函数,它的图像是抛物线,最小值在谷底:

1

使函数取得最小值的xx可以通过求导得到:

\begin{align}\frac{\mathrm{d}}{\mathrm{d}x}x^2=0\implies x=0\end{align}

因为线性回归的经验误差函数R^D(h)\hat{R}_D(h)是平方之和,所以本节介绍的求解该经验误差函数的最小值的方法被称为最小二乘法。

代码实现

根据上一节描述的数学原理,可以借助 Python 来求出w^\hat{\boldsymbol{w}}b^\hat{b}

from sympy import symbols, diff, solve
import numpy as np

# 数据集 D
X = np.array([1.51, 1.64, 1.6, 1.73, 1.82, 1.87])
y = np.array([1.63, 1.7, 1.71, 1.72, 1.76, 1.86])

# 构造经验误差函数
w, b = symbols('w b', real=True)
RDh = 0
for (xi, yi) in zip(X, y):
RDh += (yi - (xi*w + b))**2
RDh *= 1/len(X)

# 对 w 和 b 求偏导
eRDhw = diff(RDh, w)
eRDhb = diff(RDh, b)

# 求解方程组
ans = solve((eRDhw, eRDhb), (w, b))
print('使得经验误差函数 RD(h) 取最小值的参数为:{}'.format(ans))

上面代码运行后,可以解出w^0.51\hat{w}\approx 0.51以及b^0.86\hat{b}\approx 0.86,得到的结果和高尔顿几乎一样:

1

至此我们就完成了一个简单的线性回归。至于为什么最小二乘法是正确的,可以看我们之后的课程,或者看如何理解最小二乘法。