Stanford-Andrew Ng《Machine Learning》week2

多变量线性回归 (Linear Regression with Multiple Variables)

 

1.1 多维特征 (Multiple Features)

在之前我们研究过的线性回归中,我们只有一个单一特征量,房屋面积x,我们希望用这个特征量来预测y,房屋的价格。

现在假设我们不仅有房屋面积作为预测房屋价格的一个特征或者变量,我们还知道卧室的数量,楼层的数量,以及房屋的年龄。这构成了一个含有多个变量的模型,模型中的特征为(x1,x2,...,xn)。仍然用y来表示我们想要预测的输出变量。

现在引入更多的表示方式:

n:表示特征量的数目。因此在这个例子中,n等于4。

x(i):表示第i个训练样本的输入特征值,是特征矩阵中的第i行,是一个向量(vector)。例如x(2)表示第二个训练样本的特征向量。

x^(i)_ j,(i是上标,j是下标)代表第i个训练样本中第j个特征量的值,比如在上图中x^(2)_3为2。

在单变量线性回归中,假设函数是hθ(x) = θ0 + θ1∗x。x是我们唯一的特征量。但现在我们有了多个特征量,我们就不能再使用这种简单的表示方式了。

取而代之的,现在的线性回归假设应该改为 hθ(x) = θ0 + θ1*x1 + θ2*x2 +⋯ + θn*xn = (θ^T)*x。

为了让表示更方便,将x0的值设为1。具体而言,这意味着对于第i个样本,都有一个向量x^(i)_0=1。你可以认为我们定义了一个额外的第0个特征量。过去有n个特征量,x1,x2......xn,由于又另外定义了额外的第0个特征量(并且这个特征量的取值总为1),所以现在的特征向量x是一个从0开始标记的n+1维的向量。同时也可以把所有的参数都看做一个向量,所以参数就是θ0,θ1,θ2......θn。将θ和x的所有参数写成如下的向量形式,再由向量内积的原理就可以将假设函数写成如下形式。这就为我们提供了一个便利的方式来表示假设。其中上标T代表矩阵的转置。

1.2 多变量梯度下降(Gradient Descent for Multiple Variables)

与单变量线性回归类似,在多变量线性回归中,我们也构建一个代价函数,则这个代价函数是所有建模误差的平方和,即

我们的目标和单变量线性回归问题中一样,要找出使得代价函数最小的一系列参数。

多变量线性回归的批量梯度下降算法为:

我们要通过θj - α*导数项来不断更新每个θj参数。

1.3 特征缩放(Feature Scaling)

如果你有一个机器学习问题,这个问题有多个特征,如果你能确保这些特征都处在一个相近的范围,这样就能让梯度下降法更快地收敛。具体地说,如果你有一个具有两个特征的问题,其中x1是房屋面积大小,它的取值在0~2000之间。x2是卧室的数量,取值在1~5之间。如果画出代价函数J(θ)的等值线,假设J(θ)是一个关于参数θ0,θ1和θ2的函数,但是这里暂时先不考虑θ0,假设这个函数的变量只有θ1和θ2。但如果x1的取值范围远远大于x2的取值范围的话,那么最终画出来的代价函数J(θ)的等值线就会呈现出一种非常歪斜并且椭圆的形状。如果在这种代价函数上运行梯度下降的话,最终可能需要花很长一段时间,并且可能会来回波动,然后会经过很长时间,最终才会收敛到全局最小值。

在这种情况下一种有效的解决方法是进行特征缩放。具体来说,把特征x1定义为房子的面积大小除以2000。并且把x2定义为卧室的数量除以5,那么代价函数J(θ)的等值线就会变得偏移没那么严重,看起来就更圆一些了,如果在这样的代价函数上来执行梯度下降的话,那么梯度下降算法就会找到一条更直接的路径通向全局最小,而不是曲折地沿着一条复杂得多的路径通向全局最小值。因此通过特征缩放来使x1和x2的值的范围变得相近。在这个例子中,我们最终使两个特征x1和x2都在0和1之间。这样得到的梯度下降算法就会更快地收敛。

更一般地来说,我们执行特征缩放时,我们通常的目的是将特征的取值约束到-1到1的范围内。具体来说,特征x0是总是等于1的,因此这已经是在这个范围内了。但对于其他的特征,可能需要通过除以不同的数来让它们处于同一范围内,-1和1这两个数字并不是太重要。所以,如果你有一个特征x1,它的取值在0和3之间,这是没问题的。如果你有另外一个特征取值在-2到0.5之间,这也非常接近-1到1的范围,这也是可以的。但如果你有另外一个特征比如x3,假如它的范围在-100到100之间,那么这个范围就和-1到1相差太大了,所以这可能是一个不太合适的特征。类似地,如果你的特征在一个非常非常小的范围内,比如另一个特征x4的范围在-0.0001到0.0001之间,那么这是一个比-1到1小得多的范围,因此这个特征的范围也不太合适。所以可能你认可的范围也许可以大于1,或者小于1,但是也别太大,比如100,或者也别太小,比如0.0001。因此总的来说,不用过于担心你的特征是否在完全相同的范围或区间内,但是只要它们足够接近的话,梯度下降法就会正常地工作。

除了将特征除以最大值以外,在特征缩放中,有时候我们也会进行一个称为均值归一化的工作。如果你有一个xi,就可以用xi-μi来替换,让你的特征值具有为0的平均值。很明显不用将这一步应用到x0中,因为x0总是等于1,所以它不可能有为0的平均值。但对其他的特征来说,比如房子的大小,取值介于0到2000,并且假设房子面积的平均值是1000,那么就可以用(size-1000)/2000作为x1的值。类似地,如果这些房子有1到5间卧室,并且平均一套房子有两间卧室,那么就可以用(bedrooms-2)/5来均值归一化第二个特征x2。这样x1和x2的范围就会在大体在-0.5~0.5(实际上是-0.5~0.6),当然x2的值可以略大于0.5,但很接近。更一般的规律是可以把x1替换为(x1-μ1)/s1,其中定义μ1是训练集中特征x1的平均值,而s1是该特征值的范围,也可以把s1设为变量的标准差。(在下图中,或许s2应该等于5-1=4而不是5),但特征缩放其实并不需要太精确,只是为了让梯度下降能够运行得更快一点而已。

通过使用特征缩放这个简单的方法,可以将梯度下降的速度变得更快,收敛所需的迭代次数更少。

1.4 学习率(Learning Rate)

对于每一个特定的问题,梯度下降算法所需的迭代次数可能会相差很大。实际上,我们很难提前判断梯度下降算法需要多少步迭代才能收敛,我们可以绘制代价函数随迭代步数增加的变化曲线来观测算法在何时趋于收敛。

注意,上图中的x轴代表的是迭代次数。之前的J(θ)曲线中,x轴表示参数向量θ,但在这幅图中不是这样。

另外,也可以进行一些自动的收敛测试,也就是说让一种算法来告诉我们梯度下降算法是否已经收敛。下面是自动收敛测试一个非常典型的例子,如果代价函数J(θ)一步迭代后的下降小于一个很小的值,这个测试就判断函数已经收敛,这个值可以是1e-3。但通常要选择一个合适的阀值是相当困难的。因此为了检查梯度下降算法是否已经收敛,实际上还是更倾向于看左边的这种曲线图,而不是依靠自动收敛测试。

看这种曲线图还可以告诉你或提前警告你算法没有正常工作。具体地说,如果你画出代价函数J(θ)随迭代步数的变化曲线是下图中的这个样子,J(θ)在不断地上升,这就表明梯度下降算法没有正常工作。而这样的曲线图通常意味着你应该使用较小的学习率α。

如果J(θ)在上升,那么最常见的原因是,你在尝试最小化下图这样一个函数,但如果你的学习率开始太大的话,比如从红点开始,那么梯度下降算法可能会冲过最小值,然后将不断冲过最小值,得到越来越糟的结果,将得到越来越大的代价函数J(θ)的值。

数学家已证明,只要学习率α足够小,那么每次迭代之后代价函数J(θ)都会下降,因此如果代价函数没有下降,那可能是因为学习率过大,这时你就该尝试一个较小的学习率,当然你也不希望学习率太小,因为如果这样做的话,那么梯度下降算法可能收敛得很慢,需要迭代很多次,才能到达最低点。

总结一下,如果学习率α太小的话,收敛速度会很慢。而如果学习率太大的话,代价函数J(θ)可能不会在每次迭代都下降,甚至可能不收敛,在某些情况下,如果学习率α过大,也可能会出现收敛缓慢,但更常见的问题是,代价函数J(θ)并不会在每次迭代之后都下降。所以为了调试所有的情况,通常绘制J(θ)随迭代步数变化的曲线,可以帮助你弄清楚到底发生了什么。

通常可以考虑尝试这些学习率:α = 0.01,0.03,0.1,0.3,1,3,10。

2. 多项式回归和正规方程

2.1 多项式回归(Polynomial Regression)

以预测房价为例,假设你有两个特征,分别是房子邻街的宽度(其实就是它的宽度或者说是拥有土地的宽度)和垂直宽度(房子的纵向深度),那么就可以建立一个这样的线性回归模型,hθ(x) = θ0+θ1*x1+θ2*x2(x1 = frontage(临街宽度),x2 = depth(纵向深度))。当在运用线性回归的时候,不一定非要直接用给出的x1和x2特征,可以自己创造新的特征。因此如果我要预测房子的价格,需要做的也许是确认真正能够决定房子大小的是我所拥有土地的面积,因此可以创造一个新的特征设为x,即临街宽度与纵深的乘积,于是假设函数可以写为 hθ(x) = θ0+θ1*x ,也就是只需要土地面积这一个特征。因此,这取决于你从什么样的角度去审视一个特定的问题,不是直接去使用临街宽度和纵深这两个我们一开始使用的特征,有时通过定义新的特征,你可能会得到一个更好的模型。

与选择特征的想法密切相关的一个概念被称为多项式回归。线性回归并不适用于所有数据,有时我们需要曲线来适应我们的数据。比如说你有这样一个住房价格的数据集,可能会用多个不同的模型用于拟合。比如一个二次方模型:hθ(x)=θ0+θ1*x+θ2*x^2,但是可能会觉得二次函数模型不合理,因为一个二次函数最终会下降。但我们并不认为随着土地面积的增加,房屋的价格会降低。因此我们也许会选择一个不同的多项式模型,比如说使用一个三次函数hθ(x)=θ0+θ1*x+θ2*x^2+θ3*x^3,用这个模型来拟合这个数据集可能拟合得更好,因为它不会在最后降下来。


那么我们如何将模型与数据进行拟合呢?使用多元线性回归的方法,我们可以对算法做一个简单的修改来实现它。按照我们以前的假设形式,我们知道如何拟合,让hθ(x) = θ0 + θ1*x1 + θ2*x2 + θ3*x3。而现在为了预测房子的价格,如果我们想拟合这个三次模型,则现在的假设函数是hθ(x) = θ0 + θ1*x + θ2*x^2 + θ3*x^3 ,为了使这两个假设函数对应起来,就可以将第一个特征x1设为x,第二个特征x2设为x^2,第三个特征x3设为x^3,仅仅通过将这三个特征这样设置,然后再应用线性回归的方法,我们就能拟合这个模型,最终将一个三次函数拟合到数据上。如果像这样选择了特征,那么特征缩放就变得更重要了。因此如果房子的面积范围在1到1e3之间,那么房子面积的平方的范围就是1到1e6之间,第三个特征x3(房子面积的立方)范围是1到1e9。因此这三个特征的范围有很大的不同,所以,如果你使用梯度下降法,特征缩放非常重要,需要将值的范围变得具有可比性。

2.2 正规方程(Normal Equation)

对于某些线性回归问题,正规方程解法会给我们更好的方法来求得参数θ的最优值。

到目前为止,我们一直在使用的线性回归算法是梯度下降法,为了最小化代价函数J(θ),我们使用这种迭代算法。经过很多步,也就是梯度下降的多次迭代来收敛到全局最小值。

相反地,正规方程提供了一种求θ的解析解法,所以我们不再需要运行迭代算法。而是可以直接一次性求解θ的最优值,所以说基本上只需要一步就可以得到最优值。事实上,正规方程法,有一些优点也有一些缺点。在阐明优缺点和什么时候使用正规方程之前,先对这个算法进行一个解释。举一个例子来解释,假设有一个非常简单的代价函数J(θ),它是一个实数θ的函数,所以现在θ只是一个变量,或者说θ只是一个实数值。它是一个数字,不是向量。假设代价函数J是关于实参数θ的二次函数,那么如何最小化一个二次函数呢?如果你了解一点微积分的话,很明显可以对这个代价函数进行求导,将导数置为0,这样就可以求得使得J(θ)最小的θ值,这是θ为实数的一个比较简单的例子。

正规方程是通过求解这样的方程来找出使得代价函数最小的参数的:

假设我们的训练集特征矩阵为X(包含了x0=1)并且我们的训练集结果为向量y,则利用正规方程解出向量

T代表矩阵的转置,-1代表矩阵的逆。

上图中m是训练样本的数量,n是特征变量的数量,特征变量的数量实际上是n+1(增加了x0)。

另外提一点,如果使用正规方程解法,是不需要使用特征缩放的。

下面将正规方程法和梯度下降法的优缺点进行比较:

在 Octave 中,正规方程写作:pinv(X'*X)*X'*y

对于这个方程你可能会有疑惑,如果矩阵X^T*X是不可逆的话怎么办?(T是转置),XT*X不可逆的情况其实很少发生,在Octave里,如果你用 pinv(X'*X)*X'*y来计算θ,实际上你将会得到正解,这是技术性问题。Octave里有两个函数可以求解矩阵的逆,一个是pinv,另一个是inv,这两者之间的差异是技术性的,一个是所谓的伪逆,另一个被称为逆。数学上可以证明,只要你使用pinv函数,它就能计算出你想要的θ值,即使矩阵X'*X是不可逆的。在pinv和inv之间又有哪些具体的区别,这是数值计算的概念,在此并不深入解释。

下面来解释一下X'*X的不可逆是什么意思?

如果X'*X是不可逆的,通常有两种最常见的原因。

第一个原因是,如果由于某些原因,你的学习问题包含了多余的特征,例如,在预测住房价格时,如果x1是以平方英尺为单位的房子面积,x2是以平方米为单位的房子面积,因为1米等于3.28英尺(四舍五入到两位小数),这两个特征值将始终满足x1等于3.28²乘以x2,由于这两个特征是线性关系的,所以矩阵X'*X是不可逆的。

X'*X不可逆的第二个原因是,你在运行的学习算法有很多特征,具体地说,在m ≤ n的时候,例如你有m=10的训练样本,但你有n=100的特征数量,你要找到适合的参数向量θ,这是一个n+1维的向量,也就是101维的向量,你要从10个训练样本中找到101个参数值,有时可能会成功,但这并不总是一个好方法,因为要配置100或101个参数,10个样本还是有些少。如果m ≤ n,我们通常会看能否删除某些特征或者使用一种叫正则化的方法(这种方法可以让你使用很多的特征来配置很多参数,即使你有一个相对较小的训练集)。

这就是有关正规方程的内容以及矩阵X'*X不可逆是什么意思,但通常来说,不会出现这种情况,如果你在Octave里,用pinv函数来实现,也就是伪逆函数(不同的线性代数库叫法不同),即使X'*X是不可逆的,算法也能正确运行。出现不可逆矩阵的情况极少发生,所以在大多数线性回归的实现中,这不是一个大问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值