本节将介绍一种更有效的线性回归形式。这种形式适用于多个变量或多个特征的情况。
目前为止,我们探讨了单变量/特征的回归模型,如下。用房屋面积x预测房子价格y。
下面的公式就是我们所说的“假设”,其中x就是唯一的特征量。
现在我们对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为(x1,x2,...,xn)。
增添更多特征后,我们引入一系列新的注释:
n代表特征的数量
x(i)代表第 i个训练实例,是特征矩阵中的第i行,是一个向量(vector)。
代表特征矩阵中第 i 行的第 j个特征,也就是第 i个训练实例的第 j个特征。
例如就表示上图中的第二个样例的第3个特征量。
支持多变量的假设 h表示为:
这个公式中有n+1个参数和n个变量,这n个变量就表示样例的n个特征量。为了使得公式能够简化一些,引入x0=1,则公式转化为:
就可以用来预测某房子在一段时间后的价格:该房子的起价是80K ,0.1x1表示一段时间后单位面积价格上升0.1K$, 房子价格会随着房子数(用x2表示)的增加而增加0.01*x2,会随着楼层数的增加而增加3*x3, -2*X4表示房子价格会随着使用时间的增加而贬值。
此时模型中的参数是一个n+1维(第一个维度X0是一个常数1,当然,也可以说这是我们额外定义的一个特征量)的向量,任何一个训练实例也都是n+1维的向量,特征矩阵X的维度是 m*(n+1)。此时我们的特征向量和参数向量就可以表示为下面的形式:
假设就可以改写为:
因此公式可以简化为:,其中上标T代表矩阵转置。
这就是多特征量情况下的假设形式,其另一个名字就是多元线性回归。“多元”就是指用来预测的多个特征量或变量,只是好听一些罢了。
上一节我们讨论了多变量(或多特征)线性回归的假设形式,本节介绍如何设定该假设的参数,特别是如何运用梯度下降处理多元线性回归问题。
快速地总结下变量记号,如下:
Hypothesis是多元线性回归中的假设形式,按照惯例x0 = 1。此模型的参数包括θ0~θn,我们不把他们看做n个相互独立的变量,而是将其视为一个 n+1维的向量。所以我们可以把此模型的参数看作模型自己的一个向量。代价函数通过误差项的平方的总和来指定,但不把J当作一个有n+1个参数的函数,而是将其视为参数为θ向量的函数。
下面就是梯度下降,我们要不断更新每个θj。其中α是学习速率(learning rate),导数部分是代价函数对参数θj求偏导:
接下来看看具体使用梯度下降方法时是什么样子的。
下面,左边是N=1时的梯度下降法,有两个独立的更新规则,分别对应参数θ0和θ1。画圈部分就等价于代价函数J对θ0求偏导。
右边是 N>=1时的梯度下降法,花圈部分等价于代价函数J对θj求偏导。
需要说明的是为何上面两个算法是同一种算法,为何都是梯度下降算法。
来看下面的例子,我们有3个特征值θ0~θ2,用三条更新规则来更新θ0~θ2。
观察θ0的更新规则,可以发现,它与N=1时的θ0更新规则其实是相同的。(其起价的原因是,在我们的符号惯例中,有x(i)0 = 1的约定)
观察θ1的更新规则,可以发现,它与N=1时的θ1更新规则其实是相同的。我们只是使用了新符号x(i)1来表示第一个特征。
本节及下一节将会讲解一些梯度运算中的实用技巧,使梯度下降法的运行效果更好。
为了加快梯度下降法的收敛速度,本节中会讲解一种称为特征缩放(feature scaling)的方法。
现在有一个机器学习问题,含有多个特征。你需要做的是确保这些特征的值具有相近的取值范围,那么在该问题中运用梯度下降法时,就能收敛的更快一些。
举例如下,下面的问题还有两个特征x1、x2。其中x1是房屋面积大小, 且x1∈(0,2000);x2是房间数,且x2∈(1,5)。
画出代价函数J(θ)的轮廓图。代价函数J(θ)是关于θ0,θ1,θ2的函数,因为θ0是一个常数,只会影响的轮廓图在坐标系中的位置,不会影响其形状,所以暂不考虑θ0。只画出J(θ)关于θ1、θ2的图形。
由于x1的取值范围远远大于x2的取值范围,所以代价函数的轮廓图呈现扁斜状,2000:5的比例会让该轮廓图中的椭圆更加瘦长。如果在该代价函数上运行梯度下降算法。可能会经过很长时间才能收敛到全局最小值,如右图。
如果把这个图像画的再夸张一些,如左图,情况可能会更糟糕,甚至可能会反复来回震荡,才能找到一条通往全局最小值的路。
小编初学时,在此处有个疑惑,即为什么上图中的收敛路径不是下图(小编自己思考的)中橙色的这样,直接冲着最低点去就是了,为什么要先拐个弯呢,现在回想起来也是“太年轻”啦:
后来思考后,或许原因是这样的:思考一个问题,使用梯度下降法,在某点处,决定下一步往哪个方向走时,怎么选择方向呢?该点在一个三维图像上,所以该点的360°方向上都有切线,我们选择的方向就是切线斜率最大的那个方向。形象一点说,如下图,假设一个人站在图中黑点处,地域面积太大了,他的视野范围就只能在图中黑色圆圈内,他在圈内,在当前位置处,能看到的坡度最陡的方向自然就是大红色箭头标记的方向。
所以,在代价函数参数的比例过大的情况下,一种有效的方法是进行特征缩放。
具体来说,可以把特征x1定义为房子面积/2000,特征x2定义为房间数/5,这样特征值x1,x2的范围就都在[0,1]内了。此时代价函数的轮廓图就是一个规整的圆,梯度下降法很快就能找到一条通往最小值的捷径。所以,通过最小值缩放,就能抵消掉特征值的范围问题。
总体来说,我们使用特征缩放的目的就是将特征的取值约束到[-1,+1]范围内。
特征x0总是取值为1,因此其总满足x0∈[-1,+1]。至于其他特征,可能需要对其进行某种处理(比如,各自除以不同的数),来使其处于同一范围内。
注意:-1、+1这两个数,并不是很重要。比如特征x1∈(0,3),而特征x2∈(-1,2),这也没关系,因为这也非常接近[-1,1]的范围了。若特征x3∈[-100,+100],那x3与[-1,+1]的范围就非常远了,已经是O(10^2)的数量级差距了。X3很可能是一个缩放的不太好的特征。当然,若特征x4∈(-0.00001,+0.00001),也是不合适的。
但是用太过担心,特征值的范围太大还是太小,因为只要他们足够接近,那么梯度下降法就能正常运行了。
在特征缩放中,除了将特征除以最大值,也可以进行均值归一化(mean normalization)。均值归一化是指,对于特征xi,可以用xi-ui来替换它,来让所有特征的平均值为0。
对于x0=1,不需要进行此处理,因为其值恒等于1,均值不可能等于0。对于其他特征,例如代表房子面积的特征x1∈(0,2000),假如房子面积的特征值,其平均值为1000,那么可以将x1进行如下处理。再例如,房间含有的卧室数是[0,5],平均一套房子有两间卧室,那么可以像下面这样归一化x2。
像这样,便可以算出新的特征x1、x2,这样它们的范围就可以在[-0.5,0.5]之间。
更一般的,均值归一化可以表示为如下公式:
其中x1是特征,u1是训练集中所有样例的特征x1的平均值。S1是x1的范围,即
此时可以发现,若按S1=最大值-最小值,那么上面的分母5就会变成4了,但这是没关系的,只要这数能够使特征的范围较近就都是可以的。所以说,特征缩放并不需要太精确,只是为了让梯度下降能够运行地更快一些。
下一节,将介绍另一种方法,来使梯度下降运行地快些。
本节将介绍另一些关于梯度下降算法的技巧,围绕学习率α展开讨论。
下面是梯度下降算法的更新规则。第一,我们将介绍怎么进行调试,以及一些使使梯度下降算法正确运行的技巧。第二,学习如何选择学习率α。
下面介绍怎么保证梯度下降算法正确运行。
梯度下降算法的任务是给θ找一个值,以使代价函数J(θ)取到最小值。
为了判断梯度下降算法是否收敛,可以画出J(θ)随迭代步数变化的曲线,横坐标是梯度下降算法的迭代步数(注意,不是参数θ),纵坐标是代价函数J(θ)的值,图中的每一点都对应一个θ值。可以看出,在迭代步数300~400之间,代价函数几乎没有在下降,所以,可以说代价函数J(θ)在迭代步数等于400时收敛。
这幅图可以帮助我们看出代价函数是否收敛,
也可以进行一些自动的收敛测试,也就是用一种算法来告诉你梯度下降算法是否收敛。
一个很典型的例子是,如果代价函数J(θ)的值,减小至一个极小的数ε,那么就可以认为函数已经收敛,例如可以选择ε=e^(-3)。
但实际上要选择一个合适的阈值ε是很困难的,所以为了判断梯度下降算法是否收敛,最常用的还是上面那种简单的绘图方法。
另外,“J(θ)—迭代步数”曲线也可以在算法没有正确运行时,提前发出警告。例如,若“J(θ)—迭代步数”曲线出现下面这样的情况,即J(θ)是随迭代步数的增加而增长的,那么很明显,此时梯度下降算法没有正确运行。这通常意味着应该使用较小的学习率α。
如果J(θ)在上升,那么最常见的原因就是α过大,导致迭代时容易错开最小值,以最小值为中心,反复迭代,不断增大。很明显,解决办法就是减小学习率α。当然也有可能是代码的错误,所以需要仔细检查。
也可能出现左下角所示的情况,即J(θ)不断减小、增大,呈波浪状变化,出现这种情况的原因也很可能是α过大,解决办法自然也是减小α了。
但这并不是说α越小越好,因为若α过小,可能导致梯度下降算法收敛的非常慢。
总结一下,学习率α太小,可能导致梯度下降算法收敛的非常慢;学习率α太大,可能导致梯度下降算法在某几次迭代时不下降,反而增加,甚至不能收敛。当然α太大,也有可能导致算法收敛的很慢的。而为了弄清到底发生了什么,可以画出J(θ)随迭代步数变化的曲线。
在实际工作中,可以尝试多选几个α值试试,分别画出其“J(θ)—迭代步数”曲线,选择使算法收敛最快的α作为最终值。通常,可以选择α的值,间隔3倍。例如... 0.001、0.003、0.01、0.03、0.1、0.3、1,通常先找到两个端点值,例如不能比1再大,不能比0.001再小。通常选取,这组数中尽可能大的值,例如最大的值1,或者比最大值1略小一点的0.3。
在前面,我们已经了解了多变量的线性回归。本节我们介绍选择特征的方法,以及如何得到不同的学习算法。当选择了合适的特征后,这些算法往往是非常有效的。同时也会讲解多项式线性回归,它使得能够使用线性回归的方法来拟合非常复杂的函数甚至是非线性函数。
以预测房价为例,假设有两个特征,分别是房子临街的宽度(frontage)和纵向深度(depth)。其中临街宽度其实就是房
子占地面积的宽度,纵向深度也就是占地面积的长度。建立下面的线性回归模型,其中临街宽度是第一个特征,纵深宽度是第二个特征。
不要忘了我们这节的目的,是为了讲解选择特征的方法。那么思考一下,只能像上面这样选择特征吗?
当然不是,还有其他的选择方法。例如我们令Area = frontage * depth,那么就可以只用Area这一个变量作为模型的特征。
即 hθ(x) = θ0 + θ1*x 。x即面积Area。
与选择特征密切相关的一个概念是多项式回归(Polynomial Regression)。假如有如下住房价格数据集,为了拟合数据,可
能有多种解决问题的模型。例如,可以选用二次函数模型,考虑到二次函数终会降下来,但我们并不认为房价在高到一定程
度后也会降下来。因此我们可能会转而使用另一种模型,比如三次函数模型
那么到底应该如何使用模型拟合数据呢?使用多元线性回归的方法,可以将我们的模型进行简单的修改。
假设我们使用三次函数作为选用的模型。
按照以前的假设形式(hθ(x) = θ0 +θ1x1 +θ2x2 +θ3x3 —— 假设公式),我们知道如何用该模型对数据进行拟合。
而如果我们想拟合下面的三次模型(θ0 +θ1x + θ2x^2 + θ3x^3)呢?
我们现在讨论的是预测房子的价格,房价 =θ0 +θ1*(房子面积) + θ2*(房子面积)^2 + θ3*(房子面积)^3,即
房价 =θ0 +θ1*(size) + θ2*(size)^2 + θ3*(size)^3 —— 模型公式。因此该式子与三次模型式子(绿框内)是相等的。
为了将假设公式与三次模型公式对应起来,使
x1 = (size)
x2 = (size)^2
x3 = (size)^3
这种思想总结起来就是:将特征像上面这样设置,再应用线性回归(hθ(x) = θ0 +θ1x1 + θ2x2 + θ3x3)的方法,就可以
拟合三次函数模型。
如果像这样(x1 = ,x2 = ,x3 = )选择数据,那么特征值的归一化就更为重要了。因为size ∈ [0,10^3] ,size^2∈[1,10^6],
size^3∈[1,10^9],这三个特征的范围有很大不同。
最后再举一个例子,说明如何真正选择出要使用的特征。
向下面这样,一个二次模型可能不能对数据进行很好的拟合,但除了转而使用三次模型外,我们还可以采用另外的方法。例如
将公式改为下面的形式可能就可以了。
总结:在本节中,我们讨论了多项式回归,也就是如何将一个多项式,如一个二次函数,或三次函数拟合到数据上。
我们还讨论了如何选择特征,例如我们不使用房屋的临街宽度和纵向深度,而是使用它们的乘积,从而得到房屋的
土地面积这个特征。
实际上,由于特征有很多,对我们来说是很难选择的。在后面将介绍一些算法,它们能够自动选择要使用什么特征。
因此我们可以使用算法观察给出的数据,并自动选择用一个二次函数,三次还是别的函数。
前面我们讲解了梯度下降算法,但是对于某些线性方程问题,用正规方程法求解参数θ的最优值,效果将会更好。
到目前为止,在线性回归问题中,为了减小代价函数,我们一直使用的是梯度下降算法。
(线性回归、梯度下降、正规方程,这三者之间有什么关系呢?可以参看网址:机器学习_线性回归,梯度下降算法与正规方程
线性回归问题:给出若干的训练集,然后拟合为一条直线,使得cost最小。
故,我们只需确定使得cost最小的参数即可。求使cost最小的参数,可以使用梯度下降算法或正规方程法。
)
梯度下降算法确定参数θ的原理是:经过多次迭代,使得代价函数最终收敛到最小值。
相反地,正规方程法提供了一种求θ的解析(analytically)解法。即不用再经过多次迭代,可以直接一次性求出θ的值。所以,一步就可以得到优化值。
举例说明该方法,假设有一个非常简单(简单在θ是实数)的代价函数J(θ) = αθ^2 + bθ + c,θ∈R。假设θ只是一个标量或只有一行,它是一个数字不是向量。假设我们的代价函数是这个实参数θ的二次函数。
那么如何最小化这个二次函数呢?
从微积分的角度来说,就是求导,令导数为0,求解此等式就可以得到使J(θ)最小的参数θ。
上面的例子中,θ只是一个简单的实数,若θ是一个n+1维的参数向量,代价函数是关于该向量的函数呢?我们如何最小化这种代价函数呢?
在微积分中可以对每个参数θ,求代价函数J的偏导数,然后令它们全部为0,分别求解出θ0~θn的值。但是这种偏微分计算方法太过复杂了,并不实用。
那应该怎么做呢?举例说明。
如下,一个训练集中有m=4个训练样本,为了实现正规方程法,首先在训练集中加上额外一列对应额外特征变量的x0,就是取值恒为1的特征。然后,建立一个矩阵x,包含训练样本的所有特征值。接着,对将要预测的值,建立一个向量,称为向量y。其中x是一个m*(n+1)维矩阵,y是一个m 维向量,m是训练样本数量,n是特征变量数,n+1是因为加了一个额外的她特征变量x0。
最后,计算下面的公式
就能得到使代价函数最小的θ。
上面使用了一个例子来讲解,现在使用更通用的形式。
在一般情况下,假设有m个训练样本,每个样本有n个特征变量。所以每一个训练样本都有一个与之相对应的n+1维的特征向量。
接下来构建矩阵X,这也被称为设计矩阵(design matrix)。构建矩阵的方法是:
首先,取第一个训练样本,也就是一个向量,取它的转置。让x1的转置作为矩阵的第一行。按行依次添加其他样本的特征向量的转置。这样矩阵X就是一个m*(n+1)维的矩阵。
举个例子,假设除了x0以外,只有一个特征变量,且x0恒等于1。如下x的下标代表第几个样例,x的商标代表第几个特征变量。这样设计的矩阵就是一个m*2维矩阵。向量y包含了训练集中的所有标签(或说正确答案,例子中即房子价格)。
构建了矩阵X和向量y后,就能通过计算公式来得到θ。
之前说的特征方程归一化以及让特征变量在相似范围内,如果使用正规方程法,就不需要进行这些处理了。即便各个特征值的范围相差很大数量级也没关系。若使用的是梯度下降法,特征归一化就非常重要了。
最后,什么时候应该用梯度下降法,什么时候应该用正规方程法呢?下面是他们的优缺点。
假设有m个训练样本、n个特征变量。
梯度下降法的缺点:
这意味着需要运行多次,尝试不同的α,找到运行效果最好的那个。这是一种额外的工作和麻烦。
某些细节问题可能还会导致迭代的很慢。
对应的正规方程法的优点即:
所以,也不需要画出J(θ)的曲线,来检查收敛性。也不需要采取其他的额外步骤。
梯度下降法的优点:
即便有很多特征,也能运行地很好
正规方程法的缺点:
为了求解参数θ,需要计算(X^(T).*X)^(-1),其中X、X^(T)的维度是n*n,并且记性逆运算的计算量大致是矩阵维度的三次方。所以,如果特征变量很多,那么项的计算量会非常大,正规方程法会很慢。
所以,建议在特征变量数1万以下时使用正规方程法,在大于1万时,使用梯度下降法。
总结:在特征变量不多(<1万)时,使用正规方程法计算参数θ,会很方便。
以后,在讲到一些复杂的算法,例如分类算法时,并不能使用正规方程法,那时将不得不使用梯度下降法。所以梯度下降法是一种很重要的算法。
举一个关于正规方程和线性回归的例子,如下:
对于计算θ的公式θ = (X^T.*X)^(-1).*X^T.*y ,若矩阵(X^T.*X)是不可逆的呢?(在线性代数中,不可逆矩阵又被称为奇异(singular)矩阵或退化(degenerate)矩阵)
使用程序进行计算时,例如Octave,即便项(X^T.*X)是不可逆的,也可以得到正确解。在这门编程语言中有两个函数可以计算矩阵的逆,伪逆函数pinv()和逆函数inv()。
那么为什么会出现(X^T.*X)不可逆的情况呢?
一种可能的原因是,在学习问题中有多余的功能,例如在预测住房价格时,如果x1是以英尺计算的住房面积,x2是以平方米计算的住房面积,我们知道1m = 3.28英尺,所以x1、x2之间始终能满足某种转换,即X1 = (3.28)^2 * X2。这样就导致(X^T.*X)不可逆。
另一种原因是,使用了过多的特征(eg.m <= n),例如有m=10个样本,选用了n=100个特征,加上x0,就是101个特征了,,试图从10个样例中找出满足101个参数的值,这需要花费很长时间。稍后将介绍如何使用称为“正则化”的线性代数方法来通过
小样本数据获得这101个参数值,通过删除某些特征或者是某些技术来解决m<=n时的情况。