首页 > 代码库 > 机器学习之多变量线性回归(Linear Regression with multiple variables)

机器学习之多变量线性回归(Linear Regression with multiple variables)

1. Multiple features(多维特征)

在机器学习之单变量线性回归(Linear Regression with One Variable)我们提到过的线性回归中,我们只有一个单一特征量(变量)——房屋面积x。我们希望使用这个特征量来预测房子的价格。我们的假设在下图中用蓝线划出:

image
不妨思考一下,如果我们不仅仅知道房屋面积(作为预测房屋价格的特征量(变量)),我们还知道卧室的数量、楼层的数量以及房屋的使用年限,那么这就给了我们更多可以用来预测房屋价格的信息。

image

image

image

image

即,支持多变量的假设为:

image

这个公式中有n+1个参数和n个特征量(变量),为了使得公式能够简化一些,引入x0=1,则公式转化为:

image

可以简化为如下形式:

image

2. Gradient descent for multiple variables(多变量梯度下降)

image

image

3. Gradient descent in practice:Feature Scaling(特征缩放)

1

下面我们来介绍一些关于梯度下降运算中的实用技巧,首先是特征缩放 (feature scaling) 方法。

如果你有一个机器学习问题,并且这个问题有多个特征。如果你能确保这些特征都处在一个相近的范围(确保不同特征的取值在相近的范围内),这样梯度下降法就能更快地收敛。

具体来说,假如你有一个具有两个特征的问题,其中 x1 是房屋面积大小,它的取值在0到2000之间,x2 是卧室的数量,这个值取值范围在1到5之间。如果你画出代价函数J(θ) 的轮廓图:

image

那么这个轮廓看起来,应该是如上图左边的样子。

J(θ) 是一个关于参数 θ0 、θ1 和 θ2 的函数,我在此处忽略 θ0 (暂时不考虑 θ0)。并假想一个函数的参数,只有 θ1 和 θ2,但如果变量 x1 的取值范围远远大于 x2 的取值范围的话,那么最终画出来的代价函数 J(θ) 的轮廓图就会呈现出这样一种非常偏斜并且椭圆的形状。2000和5的比例会让这个椭圆更加瘦长。

所以,这是一个又瘦又高的椭圆形轮廓图,正是这些非常高大细长的椭圆形构成了代价函数 J(θ),如果你用这个代价函数来进行梯度下降的话,你要得到梯度值最终可能需要花很长一段时间才能得到。并且可能会来回波动,然后会经过很长时间,最终才收敛到全局最小值。

事实上,你可以想像如果这些轮廓再被放大一些的话,如上图最左边的那样(如果你画的再夸张一些,把它画的更细更长),那么可能情况会更糟糕。梯度下降的过程可能更加缓慢,需要花更长的时间,反复来回振荡,最终才找到一条正确通往全局最小值的路。

在这样的情况下一种有效的方法是进行特征缩放(feature scaling)。

2

举例来说,把特征 x 定义为房子的面积大小除以2000,并且把 x2 定义为卧室的数量除以5。如此一来,表示代价函数 J(θ)的轮廓图的形状偏移就会没那么严重,也许看起来会更圆一些。

如果你用这样的代价函数,来进行梯度下降的话,那么梯度下降算法就会找到一条更快捷的路径通向全局最小,而不是像刚才那样,沿着一条让人摸不着头脑的路径、一条复杂得多的轨迹来找到全局最小值。

因此,通过特征缩放,通过“消耗掉”这些值的范围(在这个例子中,我们最终得到的两个特征 x1 和 x2 都在 0 和 1 之间),你得到的梯度下降算法就会更快地收敛。

更一般地,我们执行特征缩放,将特征的取值约束到-1 到 +1 的范围内(注意:特征 x0 是总是等于1,已经在这个范围内)。但对其他的特征,我们可能需要通过除以不同的数来让它们处于同一范围内。-1 和 +1 这两个数字并不是太重要。

image

如果你有一个特征 x1 ,它的取值在 0 和 3 之间,这没问题。

如果你有另外一个特征,取值在-2 到 +0.5 之间,OK,这也没什么关系。因为这也非常接近 -1 到 +1 的范围。

但如果你有另一个特征,假如它的范围在 -100 到 +100 之间,那么这个范围跟 –1 到 +1 就有很大不同了,所以,这可能是一个不那么好的特征。

类似地,如果你的特征在一个非常非常小的范围内,比如 -0.0001 和 +0.0001 之间,那么这同样是一个比 –1 到 +1 小得多的范围,因此,我们同样会认为这个特征也不太好。

所以,你所认可的范围可以大于或者小于 -1 到 +1 的范围,但是也别太大或者太小到不可以接受的范围。通常不同的人有不同的经验,但是我们一般是这么考虑的:如果一个特征是在 -3 到 +3 的范围内,那么你应该认为这个范围是可以接受的。但如果这个范围大于了 -3 到 +3 的范围,我们可能就要开始注意了。如果它的取值在 -1/3  到 +1/3 的话,我们觉得也还不错,可以接受,或者是 0 到 1/3  或 -1/3 到 0 这些典型的范围,我们都认为是可以接受的。但如果特征的范围取得很小的话,你就要开始考虑进行特征缩放了。

总的来说,不用过于担心你的特征是否在完全相同的范围或区间内,只要他们足够接近的话,梯度下降法就会正常地工作。

3

除了在特征缩放中,将特征除以最大值以外,有时我们也会进行一个称为均值归一化的工作(mean normalization)

我的意思是这样的,如果你有一个特征 xi,你就用 xi - μi 来替换它,通过这样做,让你的特征值,具有为0的平均值(μi 指所有 xi 的平均值)。

很明显,我们不需要把这一步应用到 x0 中,因为 x0 总是等于1的,所以它不可能有为0的的平均值。

但是对其他的特征来说,比如房子的大小,取值介于 0 到 2000,并且假设房子面积的平均值等于1000,那么你可以用这个公式将 x1 的值变为 x1 减去平均值 μ1,再除以2000。

类似地,如果你的房子有五间卧室,并且平均一套房子有两间卧室,那么你可以使用这个公式来归一化你的第二个特征 x2。

在这两种情况下你可以算出新的特征 x1 和 x2,这样它们的范围,可以在 -0.5 和 +0.5 之间。

image

当然这肯定不对,例如 x2 的值实际上有可能会大于0.5(例如(5-2)/ 5 = 0.6 ) 但很接近。

更一般的规律是,你可以用如下的公式:

(x1 - μ1)/S1

来替换原来的特征 x1

其中定义μ1的意思是,在训练集中,特征 x1 的平均值。而 S1 是该特征值的范围(最大值减去最小值)。当然,也可以把 S1 设为变量的标准差,但其实用最大值减最小值就可以了。

类似地,对于第二个特征 x2,你也同样可以运用这个特征减去平均值再除以范围,来替换原特征(范围的意思依然是最大值减最小值)。

这类公式将把你的特征变成如下这样的范围,也许不是完全这样,但大概是这样的范围:

-0.5 < Xi < 0.5

顺便提一下,有些同学可能看文章比较仔细,如果我们用最大值减最小值来表示范围的话,上面的 5 应该改成 4(如果最大值为5,那么减去最小值1,这个范围值就是4)。

但不管这么说,这些取值都是非常近似的,只要将特征转换为相近似的范围,就都是可以的,特征缩放其实并不需要太精确,只是为了让梯度下降能够运行得更快一点而已。

小结

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

接下来我们将介绍另一种技巧来使梯度下降在实践中工作地更好 。

4. Gradient descent in practice: Learning rate(学习速率)

1

接下来,我们将集中讨论学习速率 α。

具体来说,这是梯度下降算法的更新规则,这里我想介绍的是如何调试(也就是如何确定梯度下降是正常工作的)以及如何选择学习率 α。

image

2

怎样确定梯度下降正常工作的?

梯度下降算法所做的事情就是为你找到一个 θ 值,并希望它能够最小化代价函数 J(θ)。

我们通常可以在梯度下降算法运行时绘制出代价函数 J(θ) 的值。注意这里的 x 轴是表示梯度下降算法的迭代步数。

image
你可能会得到上图那样的一条曲线。

曲线上一点的含义是这样的:假如当我运行完100步的梯度下降迭代之后,无论我得到什么 θ 值(无论如何,100步迭代之后,我将得到一个 θ 值),根据100步迭代之后得到的这个 θ 值,我们可以计算出代价函数 J(θ) 的值,而这个点的垂直高度就代表梯度下降算法经过100步迭代之后而算出的 J(θ) 值。

因此这条曲线显示的是梯度下降算法迭代过程中代价函数 J(θ) 的值。

如果梯度下降算法正常工作,那么每一步迭代之后J(θ) 都应该下降。这条曲线用处在于,它可以告知你一些信息:例如,你可以观察到上图的这条曲线,当你达到300步迭代之后,也就是在300步到400步迭代之间,看起来 J(θ) 并没有下降多少。当你到达400步迭代时,这条曲线看起来已经很平坦了。

也就是说,在这里400步迭代的时候,梯度下降算法基本上已经收敛了,因为代价函数并没有继续下降。

所以说,观察这条曲线可以帮助你判断梯度下降算法是否已经收敛。

顺便提一下,对于每一个特定的问题而言,梯度下降算法所需的迭代次数可以相差很大。

也许对于某一个问题,梯度下降算法只需要30步迭代就可以收敛;然而换一个问题,也许梯度下降算法就需要3000步迭代;再对于另一个机器学习问题而言,则可能需要三百万步迭代。

实际上,我们很难提前判断梯度下降算法需要多少步迭代才能收敛。因此,通常我们需要画出这类曲线,画出代价函数随迭代步数增加的变化曲线。

通常,我们可以通过看这种曲线,来试着判断梯度下降算法是否已经收敛。

3

此外,也可以进行一些自动的收敛测试,也就是说用一种算法,来告诉你梯度下降算法是否已经收敛。

image
自动收敛测试一个非常典型的例子是:如果代价函数 J(θ) 的下降小于一个很小的值 ε ,那么就认为已经收敛。

比如可以选择1e-3,但是通常要选择一个合适的阈值 ε 是相当困难的。

因此 为了检查梯度下降算法是否收敛,我们实际上还是通过观察之前介绍的代价函数随迭代步数增加的变化曲线,而不是依靠自动收敛测试。

4

此外,这种曲线图也可以在算法没有正常工作时,提前警告你。

image

具体地说,如果代价函数 J(θ) 随迭代步数的变化曲线是上图左上角的这个样子,J(θ) 实际上在不断上升,那么这就很明确的表示梯度下降算法没有正常工作。

而这样的曲线图,通常意味着你应该使用较小的学习率 α。

同样的 有时你可能看到上图左下角这种形状的 J(θ) 曲线,它先下降,然后上升,接着又下降,然后又上升,如此往复。

而解决这种情况的方法,通常同样是选择较小 α 值。

我们并不打算证明这一点,但对于我们讨论的线性回归,可以很容易从数学上证明,只要学习率足够小,那么每次迭代之后,代价函数 J(θ)都会下降,因此如果代价函数没有下降,那么可以认为是学习速率过大造成的。此时,你就应该尝试一个较小的学习率。

当然,你也不希望学习速率太小。因为如果这样,那么梯度下降算法可能收敛得很慢。

image

总结一下:

如果学习率 α 太小,你会遇到收敛速度慢的问题,而如果学习率 α 太大,代价函数 J(θ) 可能不会在每次迭代都下降,甚至可能不收敛,在某些情况下,如果学习率 α 过大,也可能出现收敛缓慢的问题。但更常见的情况是,你会发现代价函数 J(θ),并不会在每次迭代之后都下降。

而为了调试所有这些情况,绘制J(θ)随迭代步数变化的曲线,通常可以帮助你弄清楚到底发生了什么。

具体来说,当我们运行梯度下降算法时,通常会尝试一系列α值,如:

…,0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1,…

然后对于这些不同的 α 值,绘制 J(θ)随迭代步数变化的曲线,然后选择看上去使得 J(θ)快速下降的一个 α 值。

所以,在为梯度下降算法选择合适的学习率时,可以大致按3的倍数来取值一系列α值,直到我们找到一个值它不能再小了,同时找到另一个值,它不能再大了。然后我尽量挑选,其中最大的那个 α 值,或者一个比最大值略小一些的合理的值。当我们做了以上工作时,通常就可以得到一个不错的学习 速率值。

5. Features and polynomial regression(特征与多项式回归)

1

你现在已经了解了多变量的线性回归,本章将介绍选择特征的方法以及如何得到不同的学习算法。当选择了合适的特征后,这些算法往往是非常有效的。另外,我们会介绍多项式回归,它使得你们能够使用线性回归的方法来拟合非常复杂的函数,甚至是非线性函数。

以预测房价为例,假设你有两个特征,分别是房子临街的宽度和垂直宽度。

image

实际上,当我们在运用线性回归时,你不一定非要直接用给出的 x1 和 x2 作为特征,其实你可以自己创造新的特征。

如果我要预测的是房子的价格,我真正要需做的是确定真正能够决定我房子大小的因素是什么,因此,我可能会创造一个新的特征 x ,它是临街宽度与纵深的乘积,这得到的就是我拥有的土地的面积。然后,我可以让假设 h 只使用一个特征,也就是土地的面积。

有时,通过定义新的特征,你可以得到一个更好的模型。

2

与选择特征密切相关的一个概念被称为多项式回归(polynomial regression)。

如果你有一个住房价格的数据集,为了拟合它,可能会有多个不同的模型供选择。

image
直线似乎并不能很好地拟合这些数据,你可以选择二次模型,但是你会发现二次函数的模型似乎也并不好用,因为,一个二次函数的曲线最终会降回来。而我们并不认为房子的价格在高到一定程度后会下降回来。

因此,我们可以选择另一个不同的多项式模型,例如,三次函数,在这里三次函数,对这个数据集拟合得更好,因为它不会在最后下降回来。

那么,我们到底应该如何将模型与我们的数据进行拟合呢?

我们只要将多元线性回归算法做一个非常简单的修改,就可以更好的与数据进行拟合。

按照我们以前假设的形式,我们知道如何对这样的模型进行拟合,可以是:

hθ(X) = θ0 1 × X1+ θ2 × X2 + θ3 × X3

其中 X1,X2 和 X3 分别代表不同的特征。

那么,如果如何将数据拟合成三次模型?

可以将第一个特征 x1 设为房子的面积,将第二个特征 x2 设为房屋面积的平方,将第三个特征 x3 设为房子面积的立方。

那么仅仅通过将,这三个特征如上这样设置,然后再应用线性回归的方法,我们就可以拟合这个模型,并最终将一个三次函数拟合到我的数据上。

以上所做的,也可以理解为通过设置3个特征,从而将模型转化为线性回归模型。注:如果我们采用多项式回归模型,在运行梯度下降算法前,进行特征缩放非常有必要。

3

需要说明的是,如果你像上面介绍的这样选择特征,那么特征的归一化就变得更重要了,因为这三个特征的范围有很大的不同。

因此,如果你使用梯度下降法,使用特征值的归一化是非常重要的,这样才能将他们的值的范围变得具有可比性。

再来看一个例子,关于如何使你真正选择出要使用的特征。

此前我们谈到一个像这样的二次模型并不是理想的,因为你知道也许一个二次模型能很好地拟合这个数据,但二次函数最后会下降,这是我们不希望看到的。

但是,除了转而建立一个三次模型以外,你也许有其他的选择特征的方法,如下:

image

小结

本章中,我们探讨了多项式回归,也就是如何将一个多项式,如一个二次函数或一个三次函数拟合到你的数据上。

除此之外,我们还讨论了在使用特征时的选择性。例如,我们不使用房屋的临街宽度和纵深,而是把它们乘在一起,从而得到房子的土地面积这个特征。实际上,这似乎有点难以抉择,这里有这么多不同的特征选择,我该如何决定使用什么特征呢?

在之后的文章中,我们将探讨一些算法,它们能够自动选择要使用什么特征,因此,你可以使用一个算法,它将通过你给出的数据,自动为你选择到底应该选择一个二次函数、一个三次函数或者还是其他别的函数。

但是,在我们学到那种算法之前,我希望你们知道你需要选择使用什么特征,并且通过设计不同的特征,能够其使用用更复杂的函数去拟合你的数据,而不是只用一条直线去拟合。

6. Normal equation(正规方程)

之前,我们一直都在使用梯度下降算法,但是对于某些线性回归问题,正规方程式更好的解决方案。

正规方程通过求解以下的方程:

image

来求出使得代价函数最小的参数。

image

image

机器学习之多变量线性回归(Linear Regression with multiple variables)