多元线性回归 

Multivarate Linear Regression

Multiple Feature

前面我们学习了一元线性回归,也动手亲自从底层编写了梯度下降算法来实现一元线性回归。相信大家已经对梯度下降和线性回归有了很清晰的理解了。

现在,我们讨论线性回归的另一种更加强大的版本,那就是可以使用多个变量或者多个特征。

我们之前开发的线性回归仅能处理单一的特征x,也就是房子的面积,而且我们仅仅依赖它来预测房子的价格。

我们看到这里就是我们的假设函数,非常简单,仅有theta0和theta1.

不过现在我们试想一下,我们如果真的去预测一套房子的价格的话,单单依靠房子的面积肯定是不够的。因为影响房价的因素肯定不仅仅是面积。比如,有几个卧室呀,有几个卫生间呀,房龄多久了呀等等。

比如,我们看到这里68.04平米的房子反而比62.47平米的房子要便宜,似乎意味着房龄越长价格越低。所以,房价显然不仅仅依赖面积。

那么,自然的想法就是,将更多的信息纳入模型,或者说假设函数,逻辑上就应该能够使得我们对房价的预测更加准确。

为了便于讨论,我们这里再新引入几个标记:

小写字母n,表示特征数。

x上标i表示第i个样本,

x上标i下标j则表示第i个样本的第j个特征。

现在让我们来看看我们的假设函数应该是什么样子。

之前,我们的假设函数是这样的,非常简单,x是单特征,但是现在我们有多个特征了,因此我们就不能继续使用这样简单的表示方法了。

下面这个式子就是我们新的表示方法。而如果我们有N个特征而不是这里的4个的话,我们就一直加到N就可以了

对于多元线性回归,或者可以称为多变量线性回归,我们认为各个特征和预测值之间是简单的加权求和关系。这个假设在很多时候很牵强,但确实也在一些应用中性能不错。

作为机器学习入门而言,它相较于前面的一元线性回归复杂一些,更加接近能够真实工作的机器学习应用。因为在实际中,机器学习几乎总是处理多变量或者多特征。

我们把多变量线性回归的式子抄在这里,毕竟这个式子还是挺长的。

为了便于统一,我们将x下标0定义成1,它实际上是对应参数theta0的特征。

那么我们实实在在的n个特征就是x1,x2一直到xn。

这样,我们的特征向量X就是N+1维的了,而且它的下标从0开始。

而我们的参数向量呢,当然也是从0开始,一直到n,也就是theta0到theta n,它也是一个n+1维的向量。

如果大家还熟悉我们前面介绍的线性代数的基础知识的话,那么我们的假设函数就可以非常容易地写成theta 转置乘以X。

后面我们将经常使用这种形式。

多变量梯度下降

Gradient Descent for Multiple Variables

前面,我们讨论了多特征线性回归的假设函数的形式。

现在,我们来看看如何学习出这种假设函数的参数。实际上,我们要讨论的是如何使用梯度下降来求解多特征线性回归。

我们这里先来看看形式化的数学表示。

这里是我们多元线性回归的正式假设函数,注意,这里的x0=1。

这个模型待学习的参数是theta0到theta n。不过相比于将它们看成n个独立的参数,我们可以将它视为一个n+1维的参数向量。向量的思维方式将非常有助于简化表达,也很有助于使用numpy来自己实现各种机器学习算法。不过在初期,这确实会带来一些思维上的障碍,这很正常,只要大家多试着从向量的角度想想,很快就会适应。

我们的代价函数很自然地就是J theta0, theta1,一直到theta n。不过以向量的思维,我们这里统一将至表达成J theta就好。

最后就是我们的梯度下降算法了。每次见到梯度下降算法的这种式子,我都希望大家能够在脑子里清晰地理解它意味着什么。

它意味着我们处在雾气环绕的环境,我们希望能够尽快地到达一个海拔最低的地方。微分项表达的是我们环顾四周,找到附近小范围内的下降最快的方向。alpha大略表达的是我们向那个方向走的步幅。

我们如此不断地边看边走,直到到达某个最小点。

关于梯度下降另外一个重要的点就是不要忘记所有的参数同步更新。

好了,这里我们实际要说的是,对于这个式子,我们也使用J theta来表达,即将theta视作一个向量。

不过就像开始说的,这里theta的向量化的表达实际上仅仅是为了简化而已。

在一元线性回归的时候,我们编写代码实现的时候实际上用的是左侧的算法。我们分别对theta0和theta1进行编程,以进行对应的迭代。

不过对于多特征而言,对每一个参数theta进行编程显然不是一个好办法。但是似乎在单变量梯度下降时,theta0和theta1的更新规则是不同的,似乎没办法统一。

不过我们注意到,theta0和theta1的更新的微分项的差别仅仅是theta1多了一个x^i项。而我们前面其实定义了x0=1,这样的话,我们可以巧妙地将theta0的更新规则添加一个x^i 0,而它的值都是1,实际上不影响更新规则。

而theta1更新规则的x^i项,实际上应该写成x^i 1.因为对于一元线性回归的时候,我们仅有一个特征,所以当时我们省略了它的下标1.现在我们把它加回来。

因此,我们可以总结出来,模型的参数theta j的更新规则实际上可以被统一成这个式子[右上角式子]。

这个式子的这部分[α后的部分]实际上就是微分项。

关于偏微分,我们这里简单回顾一下,它表达的是,某个变量对于函数值的影响情况。非正式地可以理解为最快下山的方向。

我们实际地来看看当j=0,1,2的时候它分别是什么样子。

[按照三个式子介绍下]

Gradient Descent in Practice I – Feature Scaling

对于多变量而言。为了让梯度下降工作地更好,我们常常需要引入一些技巧。

我们先来看看所谓的特征放缩。

特征放缩的逻辑是,对于多特征,我们希望它们都具有类似的尺度。这个的含义是,希望各个不同的特征,它们的取值范围尽量地相似。这样的话,梯度下降算法就能够更快地收敛。

我们用房价预测的例子来说。假如我们有两个特征,分别是房子的面积以及房子的卧室数。房子的面积取值范围大约是0~300,而卧室数的取值范围在0~5.这样的话,如果我们把它们关于代价函数的等高线图绘制出来的话,大约是这个样子上图左。

这是一个狭长的等高线图,因为x1的取值范围相较于x2要大得多,这样,theta1的些许变动都会造成J的剧烈变动,在等高线图上就表现得更加稠密。相对地,x2取值范围很小,theta2需要更新很多才会使得J的变动稍微多一些,即表现在等高线图上,在theta2这个轴上更加稀疏。

这样带来的问题在于,因为theta1太窄了,梯度下降很容易出现Z字型迭代曲线。这导致在表象上看,迭代次数会增多,甚至在合理地迭代次数内,无法收敛到最小值点。

因此,理想情况下的等高线图最好是完美的同心圆,而将特征缩放到同一尺度将有助于达到这种情况。直观的理解就是,不同特征,相同幅度的变化,对于J的影响相近。因此,等高线图更近似一系列的同心圆。[上图右]

实际上,一般很多人会认为理论上一定要对特征进行缩放,因为特征取值的尺度不同会造成学习算法出错。但这个逻辑其实并不正确。因为,学习算法会根据梯度一直不断地调整我们的参数theta,即使特征没有进行缩放,理论上学习算法总会找到一个最小值点。而我们之所以要做特征放缩,主要原因其实在于加速梯度下降,以尽量少的迭代次数来收敛到最小值点。

我们对特征做放缩,实际上没必要做得毫厘不差。因为我们本质上只是希望收敛速度更快些而已,尺度上的些微差别对梯度下降的整体迭代没有特别大的影响。

比如,所有特征的尺度大约都在-1到1之间。

x1在0到3之间,其实还OK,x2在-2到0.5之间也不算什么问题。不过如果x3的范围在-100到100,那就可能会有问题了,毕竟已经有数量级上的差距了。而x4若是在-0.0001到0.0001之间,那就更可能有问题了,差了都不只一个数量级了。

所以,只要掌握特征缩放的主要目的和原理,我们在做特征缩放的时候就心里有数,大概什么范围是合理的。

前面的特征缩放,直接使用特征值除以该特征值可能的最大值。这个虽然看上去可以将所有特征全部放缩到0~1之间。

不过这里也有个问题,那就是比如房屋面积的均值可能在80左右,这样大部分面积特征,将会被放缩到0~80/300也就是大约0~0.27左右。

而卧室的数量通常是1,2,3,那么卧室数量这个特征缩放以后就是0.2,0.4,0.6,这样虽然特征都放缩到了0~1了,但是问题在于它们的差异仍然很明显。

我们真正想要的,其实是缩放后,特征的均值是差不多的,这样才能尽量保证我们的代价函数尽可能接近完美的曲面,比如二维特征下的碗型曲面,也就能使得梯度下降能够收敛的更快。

所以,我们通常可以选择使用特征值减去它的均值,然后再除以它们的最大值。这样,我们可以保证放缩后的特征取值都处于相近的范围了。

随着大家对机器学习知识的丰富,可能还会见到其他方式的特征放缩。而很多实践者对不同的放缩方式都有不同的偏爱,不过大家的最终目的还是一致的。所以,在具体的现实问题中,究竟采用哪种放缩方式是可以酌情选择的,不过一般情况下,只要使用了最常用的放缩方式,比如我们这里的这种均值标准化,效果可能就已经不错了,更换其他类型的放缩方法可能效果也不会得到质的提升。

好,以上就是特征放缩方面的知识了。

Gradient Descent in Practice II – Learning Rate

接下来,我们将主要围绕学习率alpha来看看如何让梯度下降高效地工作起来。

具体来说,我们这里有一个梯度下降更新的规则。我们首先想要探讨的是,如何debug我们的学习算法,以确保梯度下降工作正常。其次,我们来谈谈怎么选择学习率alpha。

梯度下降的任务是找到尽可能最小化代价函数J theta的参数theta值。我们在实际中经常做的是,绘制出随着迭代轮次增加,代价函数J的值变化曲线。

所以,x轴就是梯度下降的迭代轮次,y轴是代价函数J的值。我们的曲线最好是这样的[一个不断下降的线]。这里需要大家稍微注意的一点是,虽然我们这里也绘制了xy轴的图形,但它的横纵坐标和我们之前的代价函数和参数theta的关系,参数theta表示的直线关系完全不是一个东西。

我们在整个课程中绘制过好几种xy轴的图形来帮助大家更好地理解机器学习知识,不过每次看到图的时候,希望大家稍微注意一下x轴和y轴是什么,以便正确地理解图的含义。

那么好,我们这个图的含义就是随着梯度下降迭代的进行,我们的代价函数最好是一直不断地下降。

而我这里绘制的这条下降曲线其实并不是随手一画。一般情况下我们绘制出的代价函数下降曲线都会随着梯度下降迭代轮次的增加逐渐变缓。也就是越往后,代价函数的值减小的越少。这一点我想大家通过前面的学习也能推理出来,因为越接近最小值点,梯度就越小,也就是梯度下降更新规则中的微分项越小,这就使得theta更新的越小,进而使得整个代价函数J的变化就越小。

我们看这个图,迭代到了300轮以后,J就下降的幅度很小了,后面再迭代到400轮的时候,J几乎就没有下降,这说明我们几乎已经达到了J的某个最小值点了。考虑到我们的梯度下降算法是数值型的迭代算法,没办法确切地收敛到实际的最小值点,因此我们需要有个限制条件避免无限地迭代下去。

所以,我们通过观察连续两次迭代间,代价函数变化情况来判断是否已经收敛。比如我们说,如果两次迭代间,代价函数J的变化幅度小于某个很小的值的时候,我们就认为梯度下降已经收敛了。不过这个很小的值可以根据应用选取,比如可以选择10^-3之类的。

顺便再说一下,对于实际的机器学习应用,梯度下降收敛所需要的迭代轮次可能差距悬殊。也就是说,有些应用可能几十轮迭代就已经收敛了,但是有些应用可能需要数千上万次迭代才可能收敛,甚至在工业界百万次也不令人惊讶。

所以,如果代价函数图形类似于我们这里的这幅图,那么说明梯度下降工作的不错,代价一直在降低。

其实,在上一次的编程课上,我们也绘制了这样的图,不过我们这里更加细致地讨论了它,希望大家对此有更加清晰的认识。

虽然我们对机器学习有了不少了解,但是我们在实际工作中还是会常常遇见这样的[如上图]不受欢迎的代价函数曲线。

这里,代价函数不仅没有随着迭代的增加而减小,反而增加了。这显然就是代价函数发散了,离最小值点越来越远了。一旦出现这种情况,预示着我们的学习算法已经误入歧途了。

至于为什么会出现这种情况,我想大家应该会回想起我们前面说的学习率alpha过大的问题。

因为学习率alpha太大了,致使学习算法跨越了最小值点,进而使得代价函数不收敛。

不过,当然还有可能是我们的代码实现的问题。

所以,在确认没有代码上的问题的时候,一般情况下都是学习率过大导致的。那么我们就应该尝试更小的学习率。我们前面也讨论过,过小的学习率最大的问题在于步幅太保守,每次只更新一点点,需要非常多轮次才能收敛。不过好处在于,它至少能够保证收敛。

所以,alpha太小,收敛速度慢。alpha太大则容易不收敛,甚至发散。那么如何选择适当的学习率alpha呢?

其实也没有什么特别的办法,实际中常常使用的就是多尝试几个alpha,然后选择能够使得代价函数减小最快的那个学习率alpha即可。

不同的人可能有各自钟爱的学习率候选集,不过大家可以试试这些alpha。当然,我们的目的最终还是尽可能地快速地迭代并收敛。

所以,这就是学习率了。并没有什么特殊的技巧,都是在掌握机器学习基础知识的情况下,然后自然地、符合逻辑地来进行学习率的选择。

所以,我们这里强调一下,我们的目的就是在于让大家清晰地理解机器学习的本质,然后很多所谓的技巧其实都是顺理成章的事情。因此,大家一定要把握住最本质的东西,其他的都是可以推理出来的。

Features and Polynomial Regression

现在大家应该对多变量线性回归已经了然于胸了。这里我们简单来聊一下关于特征的更多使用方式。

其实在机器学习中,相较于某个学习算法或者模型,特征往往更加重要。这里,我们主要讨论下被称为多项式回归的技术,它可以被用于进行非常复杂的线性回归问题,甚至能够拟合非线性函数。让我们继续以预测房价为例。

假设我们现在有两个特征,房子的长和宽。比如右图,是房子的户型图,长宽一目了然。一种比较稚嫩的线性回归的假设函数直接将长、宽作为特征。虽然我们一直以来都在这样使用特征,但是显然我们也必须承认,在这个例子中这么使用特征显得有些傻。因为,我们知道,房子的面积和长宽的关系并不是长宽的线性组合,而是长乘以宽。

所以,如果我们真的想预测房价的话,我们实际上更加关注的是房子的面积,而不是房子的长、宽。

所以,基于这个认识,我们应该使用现有的特征来生成一个新特征。而这个特征就是面积。

这个例子的主要目的是想告诉大家,我们在面对具体问题的时候,不能够想当然地将手头的特征直接拿过来塞进模型。因为线性模型的表达能力很有限,而现实生活中很多特征和预测变量之间的关系并不是线性的。所以,我们需要尽量地结合实际的问题来审视特征,争取能构造出更加有效、合理的特征来。

类似于前面说的用于房价预测的新特征构建的方式,我们可以尝试使用特征的多项式来生成更多的新特征。

假如说,我们继续来预测房价,数据集大约长这样。对于这个数据集,我们可以直接的线性假设函数来拟合,当然也可以增加一个特征的二次项来拟合,甚至再增加一个三次项。

我们可以说,每增加一个高阶项,模型就变得更复杂,同时对数据的拟合也就更好。不过需要注意的一点在于,我们实际上这是在增加多项式型的特征。

如果我们只有一个特征,那么我们可以对于这个特征进行各种操作生成新的特征,比如二次方、三次方、甚至开方等。

而对于多个特征,我们也可以使用各特征之间的各种非线性组合关系来生成新的特征,比如x1*x2等。当然,如果认为新特征可能是a*x1 + b*x2,那其实就没必要做这个新特征了,因为现行回归模型自己可以学出来这个新特征。

所以,这里我们想要说的是,通过对于已有特征的多项式组合,我们可以生成更加复杂的新特征,而添加这些新特征到我们的假设函数中,将很可能对拟合效果有正向效果。

不过,增加这些构造出来的特征,虽然可能会提高模型对数据的拟合能力,但是也会增加模型本身的复杂度。而且,增加了这么多特征,到底哪些是真正有用,而哪些又是意义不大的呢?这个问题我们后面会讨论一些算法来自动地进行特征选择。

Computing Parameters Analytically

Normal Equation

现在是时候让我们来讨论下正规方程了,它是一种解析地得到参数theta的办法。

具体来说,到目前为止,我们使用的都是梯度下降来最小化代价函数J theta。这种办法采用的迭代的方法,通过很多轮的迭代渐进式地向全局最优点前进。而相对地,正规方程是一种解析方法,它直接求解最优解,而不需要进行迭代。

不过实际上,正规方程这种方法既有优点,又有缺点,否则我们也就不会到现在才讨论它。

我们先来看简单的例子。我们讨论仅有一个参数的情况。我们知道对于线性回归问题而言,代价函数J theta实际上是关于theta的一个二次函数,比如类似这种形式:a theta^2 + b theta + c。

如果熟悉高中数学,我们可以非常轻松地求解出theta,使得J最小化。不过,假如你熟悉微积分,我们其实要做的是,求这个函数的导数,然后将导数设置为0,再来求解theta的值。这是因为,对于我们这个问题,最小值点对应的导数是其切线的斜率,也就是0. 而对于其他点,切线都不是0.因此只需要求导数为0所对应的theta就可以了。

那么,推广到多变量的情况,我们要做的是,对于每一个theta计算偏微分,然后将这些偏微分全部设置成0.再来使用这些式子求解出theta就可以了。

不过这种方式不可避免地需要使用到微积分的相关知识,比如求偏导。

而正规方程则可以认为是另一种更加直观的解法。

比如我们这里有四个样本。

我们的假设函数应该是X*theta = y。我们的X就是。。。,我们的y是。。。

那么我们想要求解的是theta。如果X,theta,y都是普通的标量数值的话,theta就等于y/X。或者说X^-1 * y。但是我们有多个样本,所以无论是X,theta还是y,它们都不是简单的标量数值。因此,我们必须借助矩阵或者向量的计算法则来求解theta。

最直观简单的想法,就是theta=X^-1 * y。但是如果大家还记得线性代数的基本知识的话,X并不是方阵,压根无法求逆。不过正如这里的式子,线性代数可以直接对theta进行求解。

多元线性回归的基础理解相关推荐

  1. 多元线性回归算法预测房价【人工智能】

    目录 一.理论知识 二.Excel多元线性回归 1.数据集 2.数据分析 三.借助Sklearn库实现多元线性回归 1.基础包与数据导入 2.变量探索 3.分析数据 4.建立线性回归模型 5.Skle ...

  2. TensorFlow基础3-机器学习基础知识(解析法实现一元线性回归、多元线性回归)

    记录TensorFlow听课笔记 文章目录 记录TensorFlow听课笔记 一,机器学习基础 1.1一元线性回归 1.2解析法实现一元线性回归 1.3解析法实现多元线性回归 二,代码实现一元/多元回 ...

  3. 统计|如何理解多元线性回归的F检验的作用与目的

    本博文源于<商务统计>,旨在讲述如何理解多元线性回归中的F检验. 问题起源 我们通过统计软件计算多元线性回归的参数,计算测得后,如何更好的描述你拥有回归参数对y的影响呢?换句话说,如果某一 ...

  4. 【零基础Eviews实例】00了解多元线性回归模型常见检验

    使用说明 刚接触计量经济学和Eviews软件不久,并且本着能用就行的原则,只对软件的操作和模型的结果分析进行说明,并不太在意具体的方法和具体的数学原理. 以下内容大多为在网上学习相关操作,按照自己的理 ...

  5. 多元线性回归:R语言的有关基础操作

    数据来源:波士顿地区房价预测完整数据集(CSV格式)_weixin_51454889的博客-CSDN博客 参考书目:<R语言实战> (其实我不太清楚实际回归时各种检查和操作的一个整体,因而 ...

  6. MOOC网深度学习应用开发1——Tensorflow基础、多元线性回归:波士顿房价预测问题Tensorflow实战、MNIST手写数字识别:分类应用入门、泰坦尼克生存预测

    Tensorflow基础 tensor基础 当数据类型不同时,程序做相加等运算会报错,可以通过隐式转换的方式避免此类报错. 单变量线性回归 监督式机器学习的基本术语 线性回归的Tensorflow实战 ...

  7. 关于多元线性回归显著性水平P的理解

    我们在用统计软件工具,比如SPSS.R.python在做多元线性回归时,通常会看其系数的P值,但你真的理解这个P值吗?关于这个问题,我们首先需要了解什么是假设检验.假设检验的两类错误以及P值的含义. ...

  8. 机器学习基础-多元线性回归-02

    矩阵运算 多元线性回归 梯度下降法-多元线性回归 import numpy as np from numpy import genfromtxt import matplotlib.pyplot as ...

  9. 多元线性回归模型-数学建模类-matlab详解

    如果本文有点小难理解的话,可以看看我之前的基础线性规划啥的,有lingo,matlab还有python 就不给大家放链接了,想看的话,点击头像即可!! 文章目录 (1)一元线性回归之旧轿车价格案例 ( ...

最新文章

  1. python开源人脸识别库识别率达99_Python的开源人脸识别库:离线识别率高达99.38%...
  2. 从零开始的AI·决策树原来这么好理解(附实例代码)
  3. SAP MRP的计算步骤
  4. Objective-C总Runtime的那点事儿(一)消息机制
  5. imx8m开发板资料
  6. k8s mysql数据同步_K8s——MySQL实现数据持久化
  7. TFS数据服务器启动优化
  8. python+opencv打开摄像头、拍摄指定次数的照片_python+openCV调用摄像头拍摄和处理图片的实现...
  9. webstorm汉化后乱码现象解决
  10. 溯源:通过qq电话获取对方位置
  11. STK X教程—C++/CLI
  12. 屏幕取词翻译软件:Lingoes 灵格斯词霸
  13. 用python解决放苹果问题_分苹果问题的C++和Python实现
  14. Opencv裁剪图片大小
  15. 如何打包c#编写的程序
  16. 屏幕的单位如何计算机,如何查看您的计算机显示器有多少英寸
  17. 极米H3S和坚果J10S对比,5000元投影仪到底哪个好?
  18. 4年Java经验面试总结(转)
  19. vue组件雨滴、星星、流星特效动画(开箱即用)
  20. 【完整代码】用HTML/CSS制作一个美观的个人简介网页

热门文章

  1. 使用SQLAlchemy创建数据模型
  2. 开始使用ABP.CORE模板 (ASP.NET Core with Angular)
  3. 【WPF学习手记】利用fo-dicom读取DICOM文件
  4. JVM面试八股文第一弹
  5. 大夏天解渴,喝茶,喝凉白开
  6. 恒锋转债上市价格预测
  7. 企业邮箱一年多少钱,邮箱注册教程,企业oa平台
  8. (强制)类型转换方法
  9. python 编写函数,实现根据键盘输入的长、宽、高之值计算长方体体积
  10. MATLAB: 2018a百度云资源、迅雷资源、安装步骤