从程序员的角度说统计学习方法概论
应该说这是在看完《统计学习方法》这本书后有的想法,也算是读书笔记。《统计学习方法》是李航写的,重点偏向于基于统计的监督学习,个人觉得这本书好的地方是在叙述完理论之后,通常会有一个比较形象的小例子,在纸上演算一下具体的过程。这就让本来很抽象的数学公式变得相当直观,而且对于用代码实现也会有比较大的帮助。
对于程序员来说,特别是很少见数学公式的来说,要读一本这样满是公式的书其实是比较有挑战的。我试着从程序员能理解的角度去阐述这些概念。严格意义上来说我只是写了一年多程序的不合格程序员,所以很多时候还是得上公式,因为公式在很多时候是最精简的,就像很多优美的代码一样,他是无可替代的。
简单的例子
假如有下面这个问题:
一小面店在过去半年的盈利分别为:10, 12, 9, 13, 11, 12.3 单位为千。然后问题是预测下个月的收入是多少?
我估计绝大部分做过机器学习的人都会跟你说,这是最简单的一元线性回归就能解决的。然后不求甚解的家伙可能会给你一段代码,毕竟在Python 里做机器学习scikit-learn 就像是个大宝箱,基本上所有人都能用。
from sklearn import linear_model
clf = linear_model.LinearRegression()
X = [[1], [2], [3], [4], [5], [6]]
Y = [10.0, 12.0, 9.0, 13.0, 11.0, 12.3]
clf.fit(X, Y)
print clf.predict(7)
然后看到预测的结果是: 12.46666667
好像还不是很离谱的样子。为什么为第一时间选择这样的方法,这个过程到底涉及到哪些知识。所有基于统计的方法,甚至是大部分机器学习方法都是基于一个框架。下面我 们用这个例子来拆解它。
统计学习三要素
统计学习,甚至我觉得所有机器学习都是建立在历史数据之上,学习的目标是让计算机能预测。要抄书的话,你会看到这里面有很多分类,比如监督学习,非监督,半监督,强化学习之类的东西。其实我想真正可以好好理解下的是统计学习三要素:模型(model)、策略(strategy)、算法(algorithm)。理解这个过程,基本能了解机器学习的大部分真相。
model
模型是对现实世界的抽象,这些抽象为了能够比较简单都有一些假设作为前提。对上面那个例子来说模型就是:每月的收入是时间的线性函数。这样一来所有的一元线性函数都有可能,这些所有可能的一元线性函数的集合被称作模型的假设空间(hypothesis space). 统计学习就是要根据历史数据,从模型的假设空间中找到一个确定,也就是上面那段代码干的事情。
还有另外一种类型的假设空间,不是函数组成,是条件概率集合,比如说贝叶斯分类器的假设空间。具体什么是贝叶斯分类器,如果你不懂,后面的文章会有介绍。
strategy
strategy 可以说是学习的标准,有了这个才会有后面的算法。还是上面那个例子,模型的假设空间是所有一元线性函数,但是如何从这无数的函数中选择一个最好的呢?问题如果用数学的方式来说就是求一元线性函数的两个参数,一个是x的系数,一个是常数项。然后就有人提出了几种方法。我知道的就有两种:
- 最小二乘法
- 极大似然估计
看着这些名词很吓人的样子,其实他们的直观逻辑都是及其简单的,虽然背后确实有复杂的假设,和数学证明。
最小二乘法的思路是:找到一个函数使得其在样本上预测值和真实值之间的误差平方和最小。
极大似然的想法也是相当的直观,我们都在不知不觉的使用这种思想:举个例子, 假如你是女生,你读书时候,后面坐着两个男生A,B.每天男生A,都在后面动你头发。突然有天B动了下你的头发,我想你转过头肯定还是会骂A. 极大似然估计还是大名顶顶的高斯提出的。数学点儿的描述就是样本出现的概率最大化。
最终的目标是要预测,所以策略在做的事情就是让风险最小,然后将问题转化成可求解的函数极值的问题。极大似然思想就是一种经验风险最小的例子:上面那女生骂A正确的概率肯定要比骂B正确的概率大。
上面两种strategy 的最终结果是把一个模型求解的过程转化为函数极值。如果这个函数极值有解析解,那后面的算法基本就没有必要了。通常是这个函数的极值比较复杂,很难求解或者根本就不存在解析解,那后面的算法就要派上用处了。
algorithm
这个算法和计算机里那个排序之类的还是有些区别,这个主要是说的数值计算。常见的梯度下降,牛顿法,EM ...... 他们通常都是通过迭代拟合来实现对一个函数求极值。EM 算法的原理也是求函数下界函数的极值来逼近真实函数的极值,我见过的都是在求极值。
上面讲了这么多机器学习,机器在这个过程中干什么呢?我们都没见机器出场。其实机器的核心任务就是实现algorithm 的工具,因为算法通常需要很多迭代和尝试,靠人来做肯定是不行的,但是机器很在行这个。所以到这里我想应该理解写程序和机器学习到底是个什么关系。如果你不是为了创建一个新的算法,只是想解决一个数据上的问题,其实你能写程序就够了,前提是能看懂数学上的逻辑。如果看不懂,就像写程序的时候不知道产品需求一样,后果如何写 程序的都知道。
总结
当然机器学习比我说的要复杂的多,这里面也还会有其他问题。比如数据预处理、特征工程、模型评估、选择,而且这个过程中有很多细节的问题。但是从上面的描述你应该能看到写程序和数学是如何结合的,机器学习到底是个什么东西,至少在传统的基于统计的方法上是这样,其实我想深度学习也是在求函数极值。大部分的数据科学家,都是在利用少部分人发明出来的东西,来解决他们自己的问题,在这个过程中我认为真正重要的还是想象力,和动手能力,当然你得看得懂数学公式,至少能理解其中的逻辑,还是那句话写程序之前好好理解需求这是每个程序员圈子里广泛传播的经验,做机器学习你可能还要看懂公式,这就像是需求的一部分。
你可以在我的博客查看原文 或者搜索微信公众号:正午不早了