机器学习笔记 · 线性回归是怎么一回事?

2022.03.09

💡 劝退指南

本文对一些统计学习方法原理进程了阐述,不可避免的引入了数学公式,有“数学恐惧”的同学可以跳过本文。

引言

几乎每个人都听说过机器学习,每个人也都有着自己的理解,我相信很多人的毕业论文跟机器学习密切相关,尤其是计算机相关的硕士同学。本文主要面向对机器学习的理解比较粗浅,想进一步加深认识的同学。

在与黑产斗智斗勇的过程中,我们也采用了机器学习的方法,比如在批量登录标签的产出中,我们使用了孤立森林;在注册数据的预测中,我们使用了时间序列自回归AR系列的模型。我们本次采用了较为简单好理解的线性回归,给大家做一个简单的讲解。

开始我们simple and easy的笔记旅程吧。

案例引入

所谓回归,我们都知道哈雷彗星大约75-76年就可以在地球上被肉眼观测到,在不久的2061年我们将能够再次见证他的回归。我们对哈雷彗星轨道和运行周期的准确预测其实就是回归的内涵。给定我们一组连续的输入变量,我们来预测一组连续的输出变量,这就是回归问题。

问题引入

那么接下来我们思考一下这个问题: latest_squares_question.jpg

latest_squares_graph.jpg

问题分析

这个问题需要确定刀具的磨损速度,是一个典型的回归问题。输入为时间和刀具厚度两个连续变量。从图中可以明显的看到,刀使用的时间越久,厚度就会越薄。美刀除外:)

💡 所谓连续变量:可以理解为两个值之间可以无限分割,如人的身高

💡 所谓离散变量:可以理解某几种分类,比如投骰子,只有1~6,没有1.1

这种越xx越yy的问题,我们可以理解为有正相关或负相关,比如说买房的人越多,房价越高;大盘越绿,天台上人越多;

从图中我们可以看到,时间与刀具厚度的关系的描点,大致上接近于一条直线。于是,我们可以认为它是线性的。

到了这里,那不就是个曲线(直线)拟合问题吗?嗨,这谁不会啊?

问题解答

直线的函数相信大家已经很熟悉了,二元一次方程嘛。已知时间t和刀具厚度y,我们可设:

\[y = at + b\]

那么其中的常数a和b如何确定呢?理想情况下,我们的直线\(y = at + b\)可以经过图中所标出的各点,但实际上这显然不可能!因为这些点根本就不在一条直线上!

那么我们只能退而求其次,选择一条直线,使得这条直线与这些点尽量的离得近。

所以到这里,问题就变成了,要找到一条跟图中的点偏差最小的直线,也就是求得a和b即可。

表格中一共8组数据

时间:\(t_{0},t_{1},t_{2},...,t_{7}\)

刀具厚度:\(y_{0},y_{1},y_{2},…,y_{7}\)

如果我们要让直线的偏差尽量的小,那么就等价于在直线\(y = at + b\)上\(t_{0},t_{1},t_{2},...,t_{7}\)处的函数值与刀具厚度数据\(y_{0},y_{1},y_{2},…,y_{7}\)相差都很小, 即每个点X都要小

\[X_{i} = y_{i} - (at_{i} + b)\]

极值求解

那么怎么让每个X都很小呢?

如果X的和加起来很小是不是每个X都很小了呢?

不的。

因为偏差有正有负,在求和时,可能互相抵消,为了避免这种情况,可以先对偏差取绝对值再求和。

\[\sum_{i = 0}^{7} |y_{i} - (at_{i}+b)|\]

但是绝对值也不是特别好算,我们取个平方。

\[M=\sum_{i=0}^{7}[y_{i} - (at_{i}+b)]^2\]

我们这里要取最小值,并且用到了平方,所以这种方法就叫“最小平方法(least squares method)”,当然啦“最小二乘法”是更常见的称呼。它专门用来确定常数a和b。

那么现在,我们就要确定a和b符合什么条件时,可以使上面公式中的M最小。

学过高等数学的人都知道,这不就是一个多元函数求极值的问题嘛!

怎么求极值,求偏导,然后偏导为0,解方程就行了。来让我们手动求一遍。

定理1(必要条件)

设函数\(z=f(x, y)\)在点\((x_{0}, y_{0})\)具有偏导数,且在点\((x_{0}, y_{0})\)处有极值,则有

\[f_{x}(x_{0}, y_{0}) = 0, f_{y}(x_{0}, y_{0}) = 0\]

根据定理1,我们有

\[\begin{cases} M_{a}(a,b) = 0, \\ M_{b}(a,b) = 0. \end{cases}\]

然后我们对M公式求偏导可得,

\[ \left\{\begin{matrix} \frac{\mathrm{\partial \mathit{M} }}{\partial \mathit{a}} = -2 \sum_{i-0}^{7} [y_{i} - (at_{i} + b)]t_{i} = 0, \\ \frac{\mathrm{\partial \mathit{M} }}{\partial \mathit{b}} = -2 \sum_{i-0}^{7} [y_{i} - (at_{i} + b)] = 0. \end{matrix}\right. \]

\[ \left\{\begin{matrix} \sum_{i-0}^{7} [y_{i} - (at_{i} + b)]t_{i} = 0, \\ \sum_{i-0}^{7} [y_{i} - (at_{i} + b)] = 0. \end{matrix}\right. \]

将括号内各项进行整理合并,并把未知数a和b分离出来,得

\[ \left\{\begin{matrix} a\sum_{i-0}^{7}t_{i}^2 + b\sum_{i-0}^{7}t_{i} = \sum_{i-0}^{7}y_{i}t_{i}, \\ a\sum_{i-0}^{7}t_{i} + 8b = \sum_{i-0}^{7}y_{i}. \end{matrix}\right. \]

下面通过列表来计算\(\sum_{i-0}^{7}t_{i}, \sum_{i-0}^{7}t_{i}^2, \sum_{i-0}^{7}y_{i}, \sum_{i-0}^{7}y_{i}t_{i}\)

\[t_{i}\] \[t_{i}^2\] \[y_{i}\] \[y_{i}t_{i}\]
0 0 27.0 0
1 1 26.8 26.8
2 4 26.5 53.0
3 9 26.3 78.9
4 16 26.1 104.4
5 25 25.7 128.5
6 36 25.3 151.8
7 49 24.8 173.6
\[\sum\] 28 140 208.5 717.0

带入上述方程组,得到

\[\left\{\begin{matrix} 140a + 28b = 717, \\ 28a + 8b = 208.5. \end{matrix}\right.\]

解方程组,得到a=-0.3036,b=27.125

这样便得到刀具的磨损速度函数,\[y = -0.3036t + 27.125\]

看到这里我们知道了什么是最小二乘法,它解决了刀具磨损速率的问题,并且在衡量偏差最小的方案中,认为绝对值和平方都是可行的。其实,在机器学习中,我们都听说过一个概念:损失函数。对于我们这个问题而言,M如果等于0,则我们认为没有损失,如果M不等于0则认为是我们在计算回归函数的时候,是存在损失的。损失函数越小,意味着我们选取的方法就也就越好。

但是损失函数的之间也是有差别的,绝对值损失函数与平方损失函数都是非常常见的损失函数。对于我们这个场景来说,都可以适用。

那么还有没有其他方法能解决这个问题呢?

梯度下降法

从上面我们知道,问题的关键就在于要求出一个a和b使得M的值最小,也就是一个求解最小值的问题。

在机器学习中,对于求解最优化问题,梯度下降法是一种最常用的办法。

那么什么是梯度下降呢?

在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。

这句话其实不难理解,所谓的梯度是针对多元函数而言的,那么对于一元函数来说,其实就是导数。

比如,我们都熟悉下面的这个一元二次方程

\[f(x) = x^{2} - 10x + 1\]

如果我们要求其极值,当其导数为0时,\(f(x)\)有极值。

\[{f}'(x) = 2x - 10 \]

显然,当x=5时,f(x)有极小值。

对于多元函数来说,像上面这种直接通过求导就能得到唯一解的理想情况并不太多,所以就有了通过找近似解的方式去逼近极值,也就是通过梯度下降法。梯度是有方向的,梯度的方向是局部最大的方向,所以梯度下降就是往梯度的反方向求局部最小值,也就是去找损失函数的最小值。

当我们看到逼近的时候,就以为这会有迭代,不断迭代求得极值,那么梯度下降是如何通多迭代求得极值的呢?

梯度下降公式及推导

我们不妨看看梯度下降的公式:

\[x = x_{0} - \eta \cdot \nabla f(x_{0})\]

其中\(x\)是自变量的下一个位置,\(x_{0}\)是自变量当前位置,\(\eta\)是步长(标量,一般为正值),\(\nabla f(x_{0})\)是梯度值,\(-\)代表梯度下降方向。

我们要求解\(f(x)\)的极小值,\(f(x)\)需满足具有一阶连续偏导数,我们对\(f(x)\)在\(x_{0}\)处进行一阶泰勒展开。

\[f(x) = f(x_{0}) + (x -x_{0})\nabla f(x_{0})\]

其中\(x - x_{0}\)是向量,\(x - x_{0}\)的单位向量用\(v\)标识,我们令:

\[x - x_{0} = \eta v\]

带入上述方程可得

\[f(x) = f(x_{0}) + \eta v \nabla f(x_{0})\]

理想情况是,\(x\)每次更新都能让\(f(x)\)变小,即

\[f(x) - f(x_{0}) = \eta v \nabla f(x_{0}) < 0\]

\[v \nabla f(x_{0}) < 0\]

\(v\)和\(\nabla f(x_{0})\)都是向量,\(\nabla f(x_{0})\)为当前梯度方向,当\(v\)与当前梯度方向相反的时候,\(v \nabla f(x_{0})\)能够最小,也就保证了v的方向是局部下降最快的方向。因为\(v\)是单位向量,所以有,

\[v = - \frac{\nabla f(x_{0})}{|| \nabla f(x_{0}) ||}\]

将其带入到\(x - x_{0} = \eta v\)中,

\[x - x_{0} = - \eta \frac{\nabla f(x_{0})}{|| \nabla f(x_{0}) ||}\]

\(|| \nabla f(x_{0}) ||\)是标量,我们将其合并到\(\eta\)中,得到

\[x = x_{0} - \eta \cdot \nabla f(x_{0})\]

即梯度下降的公式。

用梯度下降的方法解决问题

我们回到刀具磨损的问题上来。

我们定义一个绝对值损失函数 \(X_{i} = |y_{i} - (at_{i} + b)|\)

然后进行计算。

未完待续。

机器学习的分类

  • 监督学习的本质是学习输入到输出的映射的统计规律。
  • 无监督学习的本质是学习数据中的统计规律或潜在结构。
  • 强化学习本质是学习最优的序贯决策。

参考文档

  1. 高等数学