单变量线性回归问题:只含有一个特征/输入变量的问题。
目录
2.1 模型表示
第一个学习算法是线性回归算法。本节介绍了该算法,并说明了完整的监督学习流程。
从下面预测住房价格的例子开始,我们要使用一个包含某市住房价格的数据集。我们会想到建立平面坐标系绘制数据集,把房子大小作为自变量,房子价格作为因变量。那么,你可以做的一件事就是构建一个模型,也许是条直线,建立房屋大小与价格之间的对应关系,然后给出房屋大小就可以估算出价格,这就是监督学习算法的一个例子。
它被称作监督学习是因为对于每个数据来说,我们给出了“正确的答案”,即根据我们的数据,告诉我们房子的实际价格是多少。更具体来说,这是一个回归问题。回归指我们根据之前的数据预测出一个准确的输出值,对于这个例子就是价格。
同时,还有另一种最常见的监督学习方式,叫做分类问题,当我们想要预测离散的输出值,例如,我们正在寻找癌症肿瘤,并想要确定肿瘤是良性的还是恶性的,这就是0/1离散输出的问题。
更进一步来说,在监督学习中有一个数据集,这个数据集被称训练集。在整个课程中用小写的m 来表示训练样本的数目。
以之前的房屋交易问题为例,假设我们回归问题的训练集(Training Set)如下表所示:
定义标记如下:
m | 训练集中实例的数量 |
x | 特征/输入变量 |
y | 目标变量/输出变量 |
x,y | 训练集中的实例 |
(x(i),y(i)) | 第i 个训练实例 |
h | 学习算法的解决方案或函数,也称为假设 (hypothesis) |
上图是一个监督学习算法的工作方式,可以看到图中有训练集里的房屋价格,把它喂给学习算法之后,学习算法工作,然后输出一个函数,通常表示为小写 h 表示。h 代表hypothesis(假设),表示一个函数,输入是房屋尺寸大小,因此 h 会根据输入的 x 值来得出 y 值,y 值对应房子的价格。因此,h 就是一个从x 到 y 的函数映射。
那么,对于我们的房价预测问题,如何表达 h ?
一种可能的表达方式为: ,因为只含有一个特征/输入变量,所以这样的问题叫作单变量线性回归问题。
2.2 代价函数
本节将定义代价函数的概念,这有助于弄清楚如何把最有可能的直线与我们的数据相拟合。如图:
在线性回归中有一个这样的训练集,m 代表训练样本的数量,比如 m=47 。而假设函数,也就是用来进行预测的函数,是线性函数形式: 。
接着,给模型选择合适的参数(parameters) 和 ,在房价问题这个例子中便是直线的斜率和在y 轴上的截距。
我们选择的参数决定了得到的直线相对于训练集的准确程度,模型所预测的值与训练集中实际值之间的差距(下图中蓝线所指)就是建模误差(modeling error)。
我们的目标便是选择出可以使得建模误差的平方和能够最小的模型参数, 即使得代价函数 最小,这里除以m是为了消除样本数量m对J的影响,除以2是为了抵消对J关于θ求偏导数时式子多出的一个2,使计算更方便。
为了求出这两个模型参数,下面绘制一个等高线图,三个坐标分别为 和 和 :
可以看出在三维空间中存在一个使得最小的点,也就是上图中的碗底位置。
代价函数也称平方误差函数或者平方误差代价函数。对于大多数问题,尤其是回归问题,误差平方代价函数是首要选择,当然还有其他代价函数的存在,以后再介绍。
2.3 梯度下降
梯度下降是一个用来求函数最小值的算法,我们将使用梯度下降算法来求出代价函数 的最小值。
梯度下降的思想是:开始时随机选择一个参数组合 ,计算代价函数,然后寻找下一个能让代价函数值下降最多的参数组合。重复上述步骤,直到找到一个局部最小值(local minimum),因为并没有尝试完所有的参数组合,所以得到的局部最小值不一定是全局最小值(global minimum)。而且选择不同的初始参数组合,可能会找到不同的局部最小值。
以上图为例加深理解:想象一下,你正站立在这座红色山上,在梯度下降算法中,我们要做的就是旋转360度看看周围,并问自己需要沿着什么方向,才能用小碎步尽快下山,当然是每次都沿着最陡的坡下山才能最快,依此类推,直到你接近局部最低点的位置。
批量梯度下降(batch gradient descent)算法的公式为:
其中a 是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大,在批量梯度下降中,我们每一次都同时让所有的参数减去学习速率乘以代价函数的导数,需要注意的是所有参数一定要同步更新,如下图的赋值语句所示,语句的顺序不可以颠倒!
2.4 梯度下降的直观了解
上节给出了梯度下降的数学定义,本节将更直观地感受一下这个算法的作用以及它的更新过程有什么意义。梯度下降算法如下:
描述:对θ 赋值,使得 按梯度下降最快方向进行,一直迭代下去,最终得到局部最小值。其中a是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大。
对于这个问题,求导就是取这个红点的切线,当前这条切线有一个正斜率,也就是说它有正导数,所以 θ1 更新后等于θ1减去这个正导数乘以 a 。
如果a 太小,即学习速率太小,结果就是只能这样像小宝宝一样一点点地挪动,去努力接近最低点,这样就需要很多步才能到达最低点,所以如果a太小的话,可能会收敛很慢。
如果a 太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛,下一次迭代又移动了一大步,越过一次,又越过一次,一次次越过最低点,直到你发现实际上离最低点越来越远,所以,如果a 太大,它会导致无法收敛,甚至发散。
另外,假设θ1 初始时就在局部最低点,结果是局部最优点的导数将等于零,因为它是那条切线的斜率,它使得θ1不再改变,也就是新的θ1等于原来的θ1,因此,如果参数已经处于局部最低点,梯度下降法更新其实什么都没做,它不会改变参数的值。因此即使学习速率a 保持不变,梯度下降也可以收敛到局部最低点。
我们来看一个例子,这是代价函数Jθ 。
要找到它的最小值,首先初始化梯度下降算法,在那个品红色的点初始化,每更新一次,导数就减小一次。随着接近最低点,导数越来越接近零。所以,梯度下降一步后,新的导数会变小一点点。所以,我再进行一步梯度下降时,我的导数项是更小的,θ1 更新的幅度就会更小。随着梯度下降法的运行,你移动的幅度会自动变得越来越小,直到最终移动幅度非常小,此时已经收敛到局部极小值。所以梯度下降将自动采取较小的幅度,也就没有必要再另外减小a。
这就是梯度下降算法,你可以用它来最小化任何代价函数J ,不只是线性回归中的代价函数J 。
在下一节,我们要用代价函数J ,回到它的本质——线性回归中的代价函数,也就是我们前面得出的平方误差函数,结合梯度下降法以及平方代价函数,得出第一个机器学习算法,即线性回归算法。
2.5 梯度下降的线性回归
梯度下降是很常用的算法,在本节,我们要将梯度下降和代价函数结合。我们将用到此算法,并将其应用于具体的拟合直线的线性回归算法里。
梯度下降算法和线性回归算法比较如图:
对我们之前的线性回归问题运用梯度下降法,关键在于求出代价函数的导数,即:
j=0 时:
j=1 时:
则算法改写成:
Repeat {
}
上述用于线性回归的梯度下降算法,有时也称为批量梯度下降。批量梯度下降,指的是在梯度下降的每一步中,我们都用到了所有的训练样本,在梯度下降中,在计算微分求导项时,我们需要进行求和运算,所以,在每一个单独的梯度下降中,我们最终都要对所有m 个训练样本求和。也有其他类型的梯度下降法,不是这种"批量"型的,不考虑整个训练集,而是每次只关注训练集中一些小的子集。
线性代数中有一种计算代价函数J 最小值的数值解法,不需要梯度下降这种迭代算法。在后面的文章中会谈到这个方法,它可以在不需要多步梯度下降的情况下,也能解出代价函数J 的最小值,称为正规方程(normal equations)方法。实际上在数据量较大的情况下,梯度下降法比正规方程要更适用一些。
到这里,祝贺大家成功学会第一个机器学习算法。
下节将介绍多变量线性回归。