本文适合机器学习零基础的同学阅读,从最简单的一元线性回归,讲解机器学习的基本概念,以及最常用的优化算法 - 梯度下降法。
一、线性回归算法
假设一个馒头厂老板娘,招聘了5位会做手工馒头的大师傅,大师傅的水平参差不齐,做出来的馒头大小软硬不尽相同,所用的面粉重量也不同。开张第一天就收到一笔1000个馒头的订单,老板娘需要计算出应该购入多少面粉作为原料。
老板娘统计了5位大师傅所做馒头的数量和相应使用面粉的重量的数据,如下:
馒头数量 | 所用面粉重量 | |
---|---|---|
大师傅1 | 5 | 1.5kg |
大师傅2 | 8 | 1.6kg |
大师傅3 | 12 | 4kg |
大师傅4 | 16 | 4.5kg |
大师傅5 | 20 | 7kg |
为了看起来更加直观,勤快的老板娘把统计数据绘制在了坐标纸上,x轴是馒头数量,y轴是面粉重量。
上面列出的五个点,就表示了一个数据集,在机器学习中,也被称为训练集。
现在老板娘的任务是根据训练集,预测1000个馒头需要多少面粉。这是一个回归问题。
回归一词指的是我们根据已有的数据集去预测出一个输出值。
为了完成任务,老板娘找来一些符号作为辅助。
m 表示训练集的样本数量。(在这个数据集中,m=5)
x表示输入变量,往往也被称为特征量。(在这里,x = 1000)
y表示输出变量或者目标变量。(在这里,y是1000个馒头的面粉用量)
(x, y) 表示一个训练样本。在上面的坐标图中,一个点对应一个训练样本。
这样一来,训练集的样本就变成了:
(5, 1.5) (8, 1.6) (12, 4) (16, 4.5) (20, 7)
为了表示具体的某个训练样本,老板娘机智地使用上标(i)来表示。
( x ( 1 ) , y ( 1 ) ) (x^{(1)}, y^{(1)}) (x(1),y(1)) 即为(5, 1.5)
( x ( 2 ) , y ( 2 ) ) (x^{(2)}, y^{(2)}) (x(2),y(2)) 即为(8, 1.6)
以此类推。
好了,至此,老板娘有一个重要发现,貌似x和y之间有某种联系啊,她大胆做出一个假设:
y = a ⋅ x y = a \cdot x y=a⋅x
上面的这种x和y之间的联系,叫做映射,在机器学习里面,上面的函数方程,通常被写成:
h ( x ) = θ 0 ⋅ x h(x) = θ_0 \cdot x h(x)=θ0⋅x
h是hypothesis的缩写,这个单词是假设的意思。 θ 0 θ_0 θ0是常量。
不要小看这个函数,我们已经迈出了机器学习的第一步,它是机器学习中最简单的模型,老板娘激动地给它起名为线性回归模型, θ 0 θ_0 θ0称为模型参数。
二、损失函数
老板娘兴奋地意识到,找到正确的 θ 0 θ_0 θ0,不就万事大吉了吗?她找来直尺,在坐标纸上画了3条经过原点的直线。
我们如何知道哪一条直线是最拟合训练集的呢?
老板娘想到一个好办法:去计算每个点到该条直线的竖直(沿着y轴)距离之和,和越小,表明这条直线越拟合我们的训练集。
计算点到直线的竖直距离,老板娘简单地考虑直接用 y ( i ) y^{(i)} y(i)减去 h ( x ( i ) ) h(x^{(i)}) h(x(i))。
如样本 ( x ( 2 ) , y ( 2 ) ) = ( 8 , 1.6 ) (x^{(2)}, y^{(2)}) = (8, 1.6) (x(2),y(2))=(8,1.6),那么 x ( 2 ) = 8 , y ( 2 ) = 1.6 x^{(2)} = 8,y^{(2)} = 1.6 x(2)=8,y(2)=1.6
紫色直线的函数为 h ( x ( i ) ) = 0.3 ⋅ x ( i ) h(x^{(i)}) = 0.3 \cdot x^{(i)} h(x(i))=0.3⋅x(i)
现在要计算样本2到紫色直接的距离, h ( x ( i ) ) − y ( i ) = h ( x ( 2 ) ) − y ( 2 ) = 0.3 ∗ 8 – 1.6 = 0.8 h(x^{(i)}) - y^{(i)} = h(x^{(2)}) - y^{(2)} = 0.3 * 8 – 1.6 = 0.8 h(x(i))−y(i)=h(x(2))−y(2)=0.3∗8–1.6=0.8
但是这样的计算方式有问题,样本三计算的结果 h ( x ( 3 ) ) − y ( 3 ) = 0.3 ∗ 12 − 4 = − 0.4 h(x^{(3)}) - y^{(3)} = 0.3 * 12 - 4 = - 0.4 h(x(3))−y(3)=0.3∗12−4=−0.4是负数,这不能表示距离。老板娘马上考虑到给每个计算结果加上绝对值不就可以了吗?但是绝对值的求值是很麻烦的,要分条件处理,最后她想到一个好办法,取平方。
于是老板娘把样本点到预测函数的距离定义如下:
( h ( x ( i ) ) − y ( i ) ) 2 (h(x^{(i)}) - y^{(i)})^2 (h(x(i))−y(i))2
那么整个训练集中每个样本点到预测函数的距离可以表示为:
∑ i = 1 m ( h ( x ( i ) ) − y ( i ) ) 2 \sum_{i=1}^{m}\left ( h(x^{(i)}) - y^{(i)} \right )^{2} ∑i=1m(h(x(i))−y(i))2
老板娘又给这个函数起了一个名字,叫做损失函数。顾名思义,损失函数越小,证明我们选的预测函数越完美。
老板娘推导的损失函数已经很完美,但跟在机器学习中所定义的,还有一点点差别,真正的损失函数如下:
J ( θ 0 ) = 1 2 m ∑ i = 1 m ( h ( x ( i ) ) − y ( i ) ) 2 J(θ_0)=\frac{1}{2m}\sum_{i=1}^{m}\left ( h(x^{(i)}) - y^{(i)} \right )^{2} J(θ0)=2m1∑i=1m(h(x(i))−y(i))2
老板娘问:前面加一个 1 2 m \frac{1}{2m} 2m1是起什么作用呢?
首先解释 1 m \frac{1}{m} m1,因为后面 ∑ \sum ∑求m个数的和,为了取平均数,所以除以样本个数m。
至于 1 2 \frac{1}{2} 21,这个跟我们后面要讲的梯度下降有关,是为了抵消掉取平方的那个上角2。
老板娘又问: J ( θ 0 ) J(θ_0) J(θ0)的J字母是从哪个单词来的呢?这个我也不知道了。
由上面的函数,老板娘进一步推导了 J ( Θ 0 ) J(\Theta_{0}) J(Θ0),如下:
J ( θ 0 ) = 1 2 m ∑ i = 1 m ( h ( x ( i ) ) − y ( i ) ) 2 J(θ_0)=\frac{1}{2m}\sum_{i=1}^{m}\left ( h(x^{(i)}) - y^{(i)} \right )^{2} J(θ0)=2m1∑i=1m