机器学习(二)——多变量线性回归

多变量线性回归

我们将开始介绍一种新的更为有效的线性回归形式,这种形式适用于多个变量,或者多特征量的情况。先简单介绍一下记法,现在我们有四个特征量,我要用x下标1 、x下标2等等,来表示这种情况下的四个特征量,然后仍然用Y来表示,我们所想要预测的输出变量,我要用小写n来表示特征量的数目,之前我们是用的“m”来表示样本的数量,然后我要用x上标(i)来表示第i个训练样本的输入特征值,x上标(2)这样表示,就是一个四维向量,事实上更普遍地来说,这是n维的向量,我用x上标(i)下标j来表示第i个训练样本的第j个特征量,因此具体的来说x上标(2)下标3代表着,第2个训练样本里的第3个特征量。既然我们有了多个特征量,我们的假设形式应该是怎样的,我们就不能再使用以前那种简单的表示方式了,取而代之的,我们将把线性回归的假设改成这样:

图片1

为了表示方便,我要将x下标0的值设为1,具体而言,这意味着对于第i个样本,都有一个向量x上标(i),并且x上标(i)下标0等于1。你可以认为我们,定义了一个额外的第0个特征量,因此我现在的特征向量x是一个从0开始标记的n+1维的向量。同时,我也想把我的参数都看做一个向量,所以我们要把所有的参数都写成一个向量θ0 θ2…一直到θn,所以我的假设现在可以写成,θ转置乘以X,这就为我们提供了一个表示假设的更加便利的形式,即用参数向量θ以及特征向量X的内积,这样的表示习惯,就让我们可以以这种紧凑的形式写出假设,这就是多特征量情况下的假设形式,起另一个名字,就是所谓的多元线性回归,多元一词,也就是用来预测的多个特征量或者变量。

我们将会谈到如何找到满足这一假设的参数,尤其是如何使用梯度下降法,来解决多特征的线性回归问题。当有一个以上特征时候的算法,我们的梯度下降更新规则变成了这样:

图片2

我想让你明白,为什么新旧两种算法实际上是一回事儿,或者说为什么这两个是类似的算法,考虑这样一个情况,有两个或以上个数的特征,同时我们有对θ1、θ2、θ3的三条更新规则,当然可能还有其它参数,如果你观察θ0的更新规则,你会发现这跟之前 n=1的情况相同,它们之所以是等价的,这是因为在我们的标记约定里有x(i)0=1,同样地,如果你观察θ1的更新规则,我们只是用了新的符号x(i)1来表示我们的第一个特征。现在我们有更多的特征,那么就可以用与之前相同的更新规则,来处理θ2等其它参数。

我想告诉你一些关于梯度下降运算中的实用技巧,我会先告诉你一个被称为特征缩放(feature scaling)的方法,这个方法如下,如果你有一个机器学习问题,这个问题有多个特征,如果你能确保不同特征的取值在相近的范围内,这样梯度下降法就能更快地收敛。具体地说,假如你有一个具有两个特征的问题,其中x1是房屋面积大小,它的取值在0到2000之间,x2是卧室的数量,可能这个取值范围在1到5之间,如果x1的取值范围远远大于x2的取值范围,那么最终画出来的代价函数J(θ)的轮廓图,就会呈现出这样一种非常偏斜,2000和5的比例会让这个椭圆更加瘦长,所以,这是一个又瘦又高的椭圆形轮廓图,而如果你用这个代价函数来运行梯度下降的话,你要得到梯度值,最终可能需要花很长一段时间,并且可能会来回波动,最终才收敛到全局最小值。在这样的情况下,一种有效的方法是进行特征缩放(feature scaling),具体来说,把特征x1定义为房子的面积大小除以2000的话,并且把x2定义为卧室的数量除以5,那么这样的话,表示代价函数J(θ)的轮廓图的形状,就会变得偏移没那么严重,可能看起来更圆一些了,如果你用这样的代价函数,来执行梯度下降的话,那么梯度下降算法就会找到一条更捷径的路径通向全局最小,而不是像刚才那样沿着一条让人摸不着头脑的路径,一条复杂得多的轨迹,来找到全局最小值。因此,通过特征缩放,通过"消耗掉"这些值的范围 这样你得到的梯度下降算法,就会更快地收敛,更一般地,我们执行特征缩放时,我们通常的目的是将特征的取值约束到-1到+1的范围内,你的特征x0总是等于1,因此,这已经是在这个范围内,但对其他的特征,你可能需要通过除以不同的数,来让它们处于同一范围内。-1和+1这两个数字并不是太重要,非常接近-1到+1的范围都可以,类似地,如果你的特征在一个比-1到+1小得多的范围,这个特征也不太好,所以,可能你认可的范围,也许可以大于或者小于-1到+1,但是也别太大,只要大得不多就可以接受,比如+100,或者也别太小,比如这里的0.001,不同的人有不同的经验,但是我一般是这么考虑的,如果一个特征是在-3到+3的范围内,那么你应该认为这个范围是可以接受的,但如果这个范围大于了-3到+3的范围,我可能就要开始注意了。因此,总的来说,不用过于担心你的特征是否在完全相同的范围或区间内,只要它们足够接近的话,梯度下降法就会正常地工作。除了在特征缩放中,将特征除以最大值以外,有时候我们也会进行一个被称为均值归一化的工作(mean normalization),如果你有一个特征xi,你就用 xi-μi来替换,通过这样做,让你的特征值具有为0的平均值,很明显,我们不需要把这一步应用到x0中,因为x0总是等于1的,所以它不可能有为0的的平均值,但是,对其他的特征来说,比如房子的大小取值介于0到2000,并且假如房子面积的平均值是等于1000的,那么你可以用这个公式:将x1的值变为x1减去平均值μ1再除以2000,更一般的规律是,你可以用这样的公式:你可以用(x1 – μ1)/S1来替换原来的特征,μ1的意思是在训练集中特征x1的平均值,而S1是该特征值的范围,指最大值减去最小值,也可以把S1设为变量的标准差,但其实用最大值减最小值就可以了。只要将特征转换为相近似的范围,就都是可以的。特征缩放其实并不需要太精确,只是为了让梯度下降能够运行得更快一点而已,让梯度下降收敛所需的循环次数更少。

这里我想要告诉大家,应该如何确定梯度下降是正常工作的,此外我还想告诉大家,如何选择学习率α。我通常是怎样确定梯度下降正常工作的,梯度下降算法所做的事情,就是为你找到一个θ值,并希望它能够最小化代价函数J(θ),我通常会在梯度下降算法运行时,绘出代价函数J(θ)的值,这里的x轴是表示梯度下降算法的迭代步数,所以这条曲线显示的是,梯度下降算法迭代过程中代价函数J(θ)的值。如果梯度下降算法正常工作,那么每一步迭代之后J(θ)都应该下降,这条曲线的一个用处在于,它可以告诉你,当这条曲线看起来已经很平坦时,梯度下降算法基本上已经收敛了,因为代价函数并没有继续下降。所以说,看这条曲线可以帮助你判断,梯度下降算法是否已经收敛。顺便说一下,对于每一个特定的问题,梯度下降算法所需的迭代次数,可以相差很大。实际上,我们很难提前判断梯度下降算法需要多少步迭代才能收敛,通常我们需要画出代价函数随迭代步数数增加的变化曲线,通过看这种曲线来试着判断,梯度下降算法是否已经收敛。另外,也可以进行一些自动的收敛测试,也就是说用一种算法,来告诉你梯度下降算法是否已经收敛,自动收敛测试的一个非常典型的例子是,如果代价函数J(θ)的下降小于一个很小的值ε,那么就认为已经收敛,比如可以选择1e-3。但我发现,通常要选择一个合适的阈值ε是相当困难的,因此,为了检查梯度下降算法是否收敛,我实际上还是通过看这条曲线图,而不是依靠自动收敛测试,此外,这种曲线图也可以在算法没有正常工作时,提前警告你,具体地说,如果代价函数J(θ)随迭代步数实际上在不断上升,那么这就很明确的表示,梯度下降算法没有正常工作,而这样的曲线图,通常意味着你应该使用较小的学习率α,当然也要确保,你的代码中没有错误,但通常最可能出现的错误是α值过大。同样的,有时你可能看到这种形状的J(θ)曲线:它先下降,然后上升,接着又下降,如此往复,而解决这种情况的方法,通常同样是选择较小α值。对于我们讨论的线性回归,可以很容易从数学上证明,只要学习率足够小,那么每次迭代之后代价函数J(θ)都会下降,因此如果代价函数没有下降,那可能意味着学习率过大,这时你就应该尝试一个较小的学习率,当然你也不希望,学习率太小,因为如果这么做,那么梯度下降算法可能收敛得很慢。在某些情况下,如果学习率α过大,也可能出现收敛缓慢的问题,但更常见的情况是,你会发现代价函数J(θ)并不会在每次迭代之后都下降。所以在运行梯度下降算法时,请尝试不同的α值,比如0.001, 0.01,这里每隔10倍取一个值,然后对于这些不同的α值,绘制J(θ)随迭代步数变化的曲线,然后选择看上去使得J(θ)快速下降的一个α值。事实上,我通常是按3的倍数来取值的,所以我会尝试一系列α值,直到我找到一个值,它不能再小了,同时找到另一个值,它不能再大了,然后我尽量挑选其中最大的那个α值,或者一个比最大值略小一些的合理的值,而当我做了以上工作时,我通常就可以得到一个不错的学习率。

你现在了解了多变量的线性回归,我想告诉你一些用来选择特征的方法以及如何得到不同的学习算法,当选择了合适的特征后,这些算法往往是非常有效的,另外我也想给你们讲一讲多项式回归,它使得你们能够使用线性回归的方法,来拟合非常复杂的函数, 甚至是非线性函数。以预测房价为例,假设你有两个特征,分别是房子临街的宽度和垂直宽度,临街宽度其实就是它的宽度,或者说是你拥有的土地的宽度,而这所房子的纵向深度就是,你的房子的深度。你可能会像这样建立一个线性回归模型:其中临街宽度 是你的第一个特征x1,纵深是你的第二个特征x2,但当我们在运用线性回归时,你不一定非要直接用给出的x1和x2作为特征,其实你可以自己创造新的特征,因此,如果我要预测房子的价格,我可能会创造一个新的特征,我称之为x,它是临街宽度与纵深的乘积,这得到的就是我拥有的土地的面积,然后我可以把假设选择为使其只使用一个特征,也就是我的土地的面积。因此,这取决于你从什么样的角度,去审视一个特定的问题,有时通过定义新的特征,你确实会得到一个更好的模型。与选择特征的想法密切相关的一个概念,被称为多项式回归(polynomial regression),比方说,你有这样一个住房价格的数据集,为了拟合它,可能会有多个不同的模型供选择,其中一个你可以选择的是像这样的二次模型,因为直线似乎并不能很好地拟合这些数据,因此也许你会想到 用这样的二次模型去拟合数据,然后你可能会觉得,二次函数的模型并不好用,因为一个二次函数最终会降回来,而我们并不认为房子的价格在高到一定程度后会下降回来,因此也许我们会转而选择使用一个三次函数,因为它不会在最后下降回来,那么我们到底应该如何将模型与我们的数据进行拟合呢?使用多元线性回归的方法,我们可以通过将我们的算法做一个非常简单的修改来实现它,按照我们以前假设的形式,我们知道如何对这样的模型进行拟合,其中hθ(x)=θ0 +θ1×x1 + θ2×x2 + θ3×x3,那么,如果我们想拟合这个三次模型,现在我们讨论的是,为了预测一栋房子的价格,我们用θ0加θ1乘以房子的面积加上θ2乘以房子面积的平方,然后再加θ3乘以房子面积的立方,为了将这两个定义互相对应起来,我们自然想到了将x1特征设为房子的面积,将第二个特征x2设为房屋面积的平方,将第三个特征x3设为房子面积的立方,那么,仅仅通过将这三个特征这样设置,然后再应用线性回归的方法,我就可以拟合这个模型,并最终将一个三次函数拟合到我的数据上。我还想再说一件事,那就是,如果你像这样选择特征,那么特征的归一化就变得更重要了。这三个特征的范围有很大的不同,因此,如果你使用梯度下降法,应用特征值的归一化是非常重要的,这样才能将他们的值的范围变得具有可比性。最后,关于如何使你真正选择出要使用的特征,此前我们谈到一个像这样的二次模型并不是理想的,但是除了转而建立一个三次模型以外,你也许有其他的选择特征的方法,这里有很多可能的选项,但是给你另外一个合理的选择的例子,可能是这样的:一套房子的价格是θ0加θ1乘以房子的面积,然后加θ2乘以房子面积的平方根,也许θ1 θ2 θ3 中会有一些值,会捕捉到这个模型,从而使得这个曲线看起来趋势是上升的,但慢慢变得平缓一些,而且永远不会下降回来。因此,通过深入地研究并且更深入地了解了选择不同特征时数据的形状,有时可以得到更好的模型。

正规方程

我们要讲正规方程(Normal Equation),对于某些线性回归问题,用正规方程法求解参数θ的最优值更好,具体而言,到目前为止,我们一直在使用的线性回归的算法是梯度下降法,就是说为了最小化代价函数J(θ),需要通过多次迭代来计算梯度下降,来收敛到全局最小值,相反地,正规方程法提供了一种求θ的解析解法,所以与其使用迭代算法,我们可以直接一次性求解θ的最优值,正规方程法有一些优点,也有一些缺点,但是在我们讲解这个和何时使用标准方程之前,让我们先对这个算法有一个直观的理解,我们举一个例子来解释这个问题,假设有一个非常简单的代价函数J(θ),它就是一个实数θ的函数,假设我们的代价函数J是这个实参数θ的二次函数,所以J(θ)看起来是这样的,那么如何最小化一个二次函数呢?你可能知道最小化的一个函数的方法是,对它求导,并且将导数置零,所以对J求关于θ的导数,你把那个导数置零,这样你就可以求得使得J(θ)最小的θ值,这是数据为实数的一个比较简单的例子。当θ不是一个实数的情况,它是一个n+1维的参数向量,并且代价函数J是这个向量的函数,也就是θ0到θm的函数,一个代价函数看起来是这样,我们如何最小化这个代价函数J?实际上,微积分告诉我们一种方法:

图片8

对每个参数θ求J的偏导数,然后把它们全部置零,如果你这样做,并且求出θ0 θ1一直到θn的值,这样就能得到能够最小化代价函数J的θ值,如果你真的做完微积分和求解参数θ0到θn,你会发现这个偏微分最终可能很复杂。接下来我要做的,实际上不是遍历所有的偏微分,因为这样太久太费事,我只是想告诉你们,你们想要实现这个过程所需要知道内容,这样你就可以解出偏导数为0时θ的值,换个方式说,或者等价地,这个θ能够使得代价函数J(θ)最小化。在一般情况下,假如我们有m个训练样本x(1) y(1)直到x(m) y(m),n个特征变量,所以每一个训练样本xi可能看起来像这样一个n+1维特征向量,我要构建矩阵X的方法,也被称为设计矩阵,如下所示,每个训练样本给出一个这样的n+1维向量,我构建我的设计矩阵X的方法,就是构建这样的矩阵,接下来我要做的是将,取第一个训练样本,也就是一个向量,取它的转置,让x1转置作为我设计矩阵的第一行,然后我要把我的第二个训练样本x2进行转置,让它作为X的第二行进行转置,以此类推,直到最后一个训练样本,取它的转置作为矩阵X的最后一行,这样矩阵X就是一个m*(n+1)维矩阵。

图片9

所以,这就是如何构建矩阵X和向量y,有时我可能会在上面画一个箭头来表示这是一个向量,但很多时候,我就只写y,是一样的。向量y是这样求得的:把所有训练集中正确的房子价格放在一起,得到一个m维向量y。最后,构建完矩阵X和向量y,我们就可以通过计算X转置乘以X的逆乘以X转置乘以y,来得到θ。

图片10

这个式子会给出最优的θ值。最后一点,在之前我提到特征变量归一化和让特征变量在相似的范围内的想法,如果你使用正规方程法,那么就不需要归一化特征变量,实际上这是没问题的。但如果你使用梯度下降法,特征变量归一化就很重要。最后,你何时应该使用梯度下降法,而何时应该使用正规方程法呢?这里列举了一些它们的优点和缺点,假如你有m个训练样本和n个特征变量,梯度下降法的缺点之一就是,你需要选择学习速率α,这通常表示需要运行多次,尝试不同的学习速率α,然后找到运行效果最好的那个,所以这是一种额外的工作和麻烦,梯度下降法的另一个缺点是,它需要更多次的迭代,因为一些细节,计算可能会更慢。至于正规方程,你不需要选择学习速率α,所以就非常方便,也容易实现,你只要运行一下,通常这就够了,并且你也不需要迭代, 所以不需要画出J(θ)的曲线,来检查收敛性或者采取所有的额外步骤。梯度下降法在有很多特征变量的情况下也能运行地相当好,所以即使你有上百万的特征变量,你可以运行梯度下降法,并且通常很有效,它会正常的运行,相对地,正规方程法为了求解参数θ,我们需要计算这项:X转置乘以X的逆,这个X转置乘以X矩阵是一个n*n的矩阵,其中n是特征变量的数量,实现逆矩阵计算所需要的计算量,大致是矩阵维度的三次方,因此计算这个逆矩阵需要计算大致n的三次方,有时稍微比计算n的三次方快一些,但是对我们来说很接近,所以如果特征变量的数量n很大的话,实际上标准方程法会慢很多。因此如果n很大,我可能还是会使用梯度下降法,但如果n比较小,那么标准方程法可能更好地求解参数θ,那么怎么叫大或者小呢?很难给出一个确定的值来决定何时该换成梯度下降法,但是对我来说通常是在一万左右,我会开始考虑换成梯度下降法,或者我们将在以后讨论到的其他算法。只要特征变量数量小于一万,我通常使用正规方程法,而不使用梯度下降法。随着我们要讲的学习算法越来越复杂,例如,当我们讲到分类算法,像逻辑回归算法,我们会看到实际上对于那些算法,并不能使用正规方程法,对于那些更复杂的学习算法,我们将不得不仍然使用梯度下降法,因此,梯度下降法是一个非常有用的算法,可以用在有大量特征变量的线性回归问题,但对于这个特定的线性回归模型,正规方程法是一个比梯度下降法更快的替代算法,所以根据具体的问题以及你的特征变量的数量,这两算法都是值得学习的。

我想谈谈正规方程(normal equation)以及它们的不可逆性,这是一种较为深入的概念,我们要讲的问题如下,当计算θ等于inv(X'X ) X'y,那对于矩阵X'X的结果是不可逆的情况咋办呢?在Octave里,有两个函数可以求解矩阵的逆,一个被称为pinv(),另一个是inv(),这两者之间的差异是些许计算过程上的,一个是所谓的伪逆,另一个被称为逆,使用pinv()函数可以展现数学上的过程,这将计算出θ的值,即便矩阵X'X是不可逆的,在pinv()和inv()之间又有哪些具体区别呢?其中inv()引入了先进的数值计算的概念。如果矩阵X'X结果是不可逆的,通常有两种最常见的原因,第一个原因是,在你的学习问题中,你有多余的特征值,如果你可以用一个线性方程来展示那两个相关联的特征值,矩阵X'X将是不可逆的;第二个原因是,在你想用大量的特征值尝试实践你的学习算法的时候,可能会导致矩阵X'X的结果是不可逆的,具体地说,在m小于或等于n的时候。例如,有m等于10个的训练样本,也有n等于100的特征数量,尝试从10个训练样本中找到满足101个参数的值,这工作可能会让你花上一阵子时间,但这并不总是一个好主意,因为正如我们所看到,你只有10个样本以适应这100或101个参数,数据还是有些少。通常,我们会使用一种叫做正则化的线性代数方法,通过删除某些特征或者是使用某些技术,来解决当m比n小的时候的问题。总之当你发现的矩阵X'X的结果是奇异矩阵 或者找到的其它矩阵是不可逆的,我会建议你这么做:首先应该通过观察所有特征检查是否有多余的特征,如果有多余的就删除掉,直到他们不再是多余的为止;如果特征里没有多余的,我会检查是否有过多的特征,如果特征数量实在太多,我会删除些,用较少的特征来反映尽可能多内容,否则我会考虑使用正规化方法,这也是我们将要谈论的话题。总之,出现不可逆矩阵的情况极少发生,所以在大多数实现线性回归中出现不可逆的问题不应该过多的关注。



发表评论

电子邮件地址不会被公开。 必填项已用*标注