机器学习的数学 (一)回归

前段时间想了解机器学习的原理和作用,搜索“机器学习”可以找到铺天盖地的资料,可是目前大部分找到的资料是讲解,如何使用机器学习的库来快速搭建可用的机器学习程序。对我来说,可能更加重要是了解机器学习的原理而不是把它当成一个黑盒子来用。我想搞清楚几个问题:什么是机器学习?机器学习适用于哪些问题?。带着这些问题,请教了X博士,X是机器学习方面的博士后,简单交流之后,X说,需要一些基础的数学知识:

  • 线性代数
  • 概率论
  • 算法
  • 计算机科学知识

然后给我推荐了斯坦福大牛写的书 《Deep Learning》。我如获至宝,既然是此领域研究前沿的牛人推荐,必定是精品。专门抽出时间来钻研这本书。对于牛人来说”基础”的知识,于我算的上是难啃的骨头,虽然说站在巨人的肩膀上可能看得更远,首先得能爬得上巨人的肩旁才行。

既然难度太大的吃不消,那就把难度降低一点,直到能够稍微花点力气能够啃下来就行。搜索一番,果然找到一本适合我目前水平的书《白话机器学习的数学》。听书名就是面向基础读者。买来一读,果然如我所料。本书的特色之一在内容的表现形式上,采用的是两个程序员的对话讨论的形式来表达书中的知识点。一个请教,一个回答,通俗易懂。计算机书籍中还有一个系列教《head first》系列,成书的风格也很相似,如果你看过《head fist》系列觉得还不错的话,那么这本书也应该会对你的胃口。

书中介绍了机器学习中下面几大块需要的数学知识:

  • 回归
  • 分类
  • 聚类

以及如何来评估所使用的机器学习的模型。最后一章是使用python来编程实现书中前面章节所介绍的内容,可谓是实际动手操作。书中所介绍的基本知识和类型,很少会在实际的问题中应用,不过这些知识可以帮助我们更好的理解机器学习原理。

回归

先从简单的回归讲起,假设有一段数据, x,y 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
x,  y
235,591
216,539
148,413
35,310
85,308
204,519
49,325
25,332
173,498
191,498
134,392
99,334
117,385
112,387
162,425
272,659
159,400
159,427
59,319
198,522

画图出来是这样:

x:假设是广告版面的大小。y:假设是广告费用。我们知道这两种是线性的关系。那么如何把这两者的线性关系表示出来呢?当初的物理课上,做完实验之后,老师说,这两者是线性关系,说完拿着尺子,刷地一下就直线给画出来了。

接着不紧不慢地说,只需要把直线画到让我们实验结果中的点能够均匀地分布在直线的两侧即可。

要处理的问题是什么?

稍微总结一下,目前的情况是:

  1. 已知:我们已经知道数据表示两者之间的关系是线性的(线性关系已知)
  2. 目标:我们需要把这条线找出来
  3. 怎么评估这条线?平面上面这么多值线,凭什么说你找到的就比我找到的线要好?

从我们直接的感官来判断,B 线 A 线要更好,原因是什么?

因为 B 线离我们的采集的点更近.

到目前为止, 我们都是用我们直观的感受来划线,评价所画的线的优劣,然后画更好的线。

理解机器学习最重要的一点就是,如何将我们通过直观和经验达到的结果,用计算机(机器)来实现?

如何评估直线的优劣?

之前我们说到,要让计算机来实现我们人通过直观获得的结果,在我们具体的例子当中,两步:

直观的做法:

  1. 随便画一条线
  2. 确认这条线偏离数据大概的程度
  3. 朝着偏离程度小的方向画另一条更好的线

如何把直观变成数值

如果我们想通过机器来实现上面的几步,得怎么做?

  1. 随便画一条线
    这个好实现,计算机生成一条曲线还不是分分钟的事情

  2. 确认这条线偏离数据大概的程度
    机器没法跟人一样用眼睛区去观察,那么我们得想个办法把我们直观观察到的偏离程度变成一个数字,用这个数值的大小来指示偏离程度的大小。这里是理解机器学习关键的一步:将我们日常生活中的直观经验用数值来体现

    下图中蓝色线段1是某个点跟A线的偏差,2是同一个点到B的偏差。2的长度小于1,说明对这个点来说,BA更好。

  3. 朝着偏离程度小的方向画另一条更好的线

误差

目前来看是有了些头绪,我们通过比较某个点跟我们画出的直线之间的距离来确定直线的优劣,但是稍等,刚刚我们只是考虑了我们数据中的一个点,然后我们的表格中一共有20个点。我们怎么样才能把所有的点都考虑进取?

最简单的方法是,我们把每个点跟直线之间的距离加起来,把这个数值作为这条直线对应于所有数据的误差:

A直线的误差 = 第1个点到A的偏差 + 第2个点到A的偏差 + … + 第20个点到A的偏差
B直线的误差 = 第1个点到B的偏差 + 第2个点到B的偏差 + … + 第20个点到B的偏差
(这里的偏差指的是线段的长度,都是正值)

到此为止,我们既找考虑了所有的点,也达到了用一个数值来表达直线优劣的方法。因此我们把上面的这个公式叫做误差公式(误差函数)。这个根据这个误差公式计算出来的数值越小,说明我们的直线越好。

重新审视问题

稍微总结一下,结合我们之前的结果,解决问题的步骤是:

  1. 随便选取一条曲线 y = a*x + b (a, b的数字随便选)
  2. 用我们表中的20个数据(点)来计算这条曲线的误差
  3. 根据误差值,调整a, b
  4. 重复1,2,直到误差小到一定程度或者无明显变化即可。

总结

这里我们参考《白话机器学习的数学》中的内容,着重讲解了,如何计算线性回归的误差。更加重要的是,如何将我们通过肉眼直观解决问题的方法,通过数学的方式表达出来。这是理解机器学习的基础。要注意的是,我们上面讲的误差函数只是为了方便理解而使用的函数,在实际中是无法使用这种函数的,我们会在下一篇文章中讲解真正使用的误差函数。而且,这里还有一个问题没有解决,那就是如何来调整a,b?增加还是减小呢?增减多少呢?这些问题我们也会在下一篇文章中来讨论。

篇外:线性回归动画图

我根据书中的内容,和数据,制作了一张线性回归的动态图。这里先放出来,直观上能够更好地理解线性回归的过程。

《白话机器学习的数学》

电子书:

纸质书: