还有几天就国庆了,趁着国庆好好调整一下,昨天被一些THU的大佬们的报告给深深打击了,我感jio我就好像没学过计算机一样(笑哭)。。。
读博的欲望更加强烈了,希望有一天能变得像他们一样强(想想而已,啊哈哈哈),OK,开始标题的内容了。。。
1.多维特征
先举个例子,还是上次那个房价模型的例子,现在我们对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为(x 1 ,x 2 ,…,x n )。
增添更多特征后,我们引入一系列新的注释:
n 代表特征的数量,x (i) 代表第 i 个训练实例,是特征矩阵中的第 i 行,是一个向量(vector)。之前的m是行数,即训练样本数。是一个四维的向量。
如图一的x3(2)=2,
X(i)j代表第i个训练样本中第j个特征量的值。
这个公式中有 n+1 个参数和 n 个变量,为了使得公式能够简化一些,引入 x 0 =1,则公式转化为:
此时模型中的参数是一个 n+1 维的向量,任何一个训练实例也都是 n+1 维的向量,特征矩阵 X 的维度是 m*n+1。 因此公式可以简化为:
其中上标 T 代表矩阵转置。
2.多变量梯度下降
与单变量线性回归类似,在多变量线性回归中,我们也构建一个代价函数,则这个代价函数是所有建模误差的平方和,即:
我们的目标和单变量线性回归问题中一样,是要找出使得代价函数最小的一系列参数。多变量线性回归的批量梯度下降算法为:
我们开始随机选择一系列的参数值,计算所有的预测结果后,再给所有的参数一个新的值,如此循环直到收敛。
3.梯度下降法实践–特征缩放
(特征缩放就是让梯度下降更快点,不需要太精确,使收敛所需的迭代次数变得更少。)
在我们面对多维特征问题的时候,我们要保证这些特征都具有相近的尺度,这将帮助梯度下降算法更快地收敛。
以房价问题为例,假设我们使用两个特征,房屋的尺寸和房间的数量,尺寸的值为 0-2000 平方英尺,而房间数量的值则是 0-5,以两个参数分别为横纵坐标,绘制代价函数的等高线图能,看出图像会显得很扁,梯度下降算法需要非常多次的迭代才能收敛。
解决的方法是尝试将所有特征的尺度都尽量缩放到-1 到 1 之间。如图:
(小插曲: J(seida)是一个关于参数seida0,seida1和seida2的函数,我在此忽略seida0(暂时不考虑seida0)。并假想一个函数的参数,只有seida1和seida2,但如果变量x1的取值范围远远大于x2的取值范围的话,那么最终画出来的代价函数J(seida)的轮廓图就会呈现出这样一种非常偏斜并且椭圆的形状。2000和5的比例会让这个椭圆更加瘦长。
所以,这是一个又瘦又高的椭圆形轮廓图,正是这些非常高大细长的椭圆形构成了代价函数J(seida),如果你用这个代价函数来进行梯度下降的话,你要得到梯度值最终可能需要花很长一段时间才能得到,并且来回波动,然后会经过很长时间,最终才能收敛达到全局最小值。
事实上,如果这些轮廓再被放大一些的话,椭圆图变得更细更长,那么可能情况会更糟糕。梯度下降的过程可能会变得更加缓慢,需要花费更长的时间,反复来回振荡,最终找到一条正确地通往全局最小值的路。)
举个例子:
x1=x1-p1/s1,p1是训练集中特征x1的平均值,s1是该特征值的范围(最大值减去最小值)。
通过特征缩放,它们的值的范围变得相近,梯度下降算法就会更快地收敛。即图像偏移地不会那么严重,看起来会更圆一些。
通常,将特征的取值约束到-1到+1的范围内,令x0=1,其它值再除以某个值(最大值)来达到这个范围。
在特征缩放中,均值归一化的工作,举例:
xi用xi-pi来替换,让你的特征值具有为0平均值,不需要用到x0中去,因为x0=1,不可能有为0的平均值。
比如,房子的平均面积为1000,则x1=size-1000/2000,x2=bedrooms-2/5,通过这样可以算出新的特征x1和x2,可能的取值范围是-0.5≤x1≤0.5,-0.5≤x2≤0.5.
4.梯度下降法实践–学习率
梯度下降算法收敛所需要的迭代次数根据模型的不同而不同,我们不能提前预知,我们可以绘制迭代次数和代价函数的图表来观测算法在何时趋于收敛。
正常工作的话,随着迭代次数的增加,曲线会逐渐下降。横轴为梯度下降算法的迭代次数。
比如黑色的seida代表的意思就是,横轴为运行100次梯度下降迭代,纵轴为100次迭代后,得到的seida值算出的J(seida)值。
也有一些自动测试是否收敛的方法,例如将代价函数的变化值与某个阀值(例如 0.001)进行比较,但通常看上面这样的图表更好。(ps:自动收敛测试:用一种算法来告诉你梯度下降算法是否已经收敛)
这里举个例子,例如如果代价函数J(seida)一步迭代后的下降小于一个很小的值e,这个测试就判断函数已收敛。(嗯…,这里的e可以使10的负三次方)
梯度下降算法的每次迭代受到学习率的影响,如果学习率 α 过小,则达到收敛所需的迭代次数会非常高;如果学习率 α 过大,每次迭代可能不会减小代价函数,可能会越过局部最小值导致无法收敛。
ps: 已证明只要学习率足够小,那么每次迭代之后代价函数J(seida)都会下降。但若学习率过小,则会收敛得很慢。若学习率过大,代价函数J(seida)可能不会在每次迭代都下降,甚至可能不收敛,某些情况下,也可能会出现收敛缓慢,可以通过绘制代价函数随迭代次数变化的曲线去调试这个问题。由上图那个代价函数的曲线所示,当迭代到400步的时候就差不多已经收敛了,所以代价函数没再继续下降了。
通常可以考虑尝试些学习率:
α=0.01,0.03,0.1,0.3,1,3,10
5.特征和多项式回归
插一句,如果选择了合适的特征,算法往往是非常有效的。多项式回归即用线性回归的方法来拟合非常复杂的函数甚至是非线性函数,将模型和数据拟合。
x1为第一个特征,x2为第二个特征,这里也可以只选择x作为特征。
线性回归并不适用于所有数据,有时我们需要曲线来适应我们的数据,更好地拟合,比如一个二次方模型:
这种问题解决方法一般分为两种,第一,建立一个三次模型;第二,其它可选的特征。
通常我们需要先观察数据然后再决定准备尝试怎样的模型。 另外,我们可以令:
从而将模型转化为线性回归模型。
根据函数图形特性,我们还可以使
注:如果我们采用多项式回归模型,在运行梯度下降算法前,特征缩放非常有必要。(ps:将值的范围变得具有可比性,即特征的归一化)
6.正规方程(求参数seida的最优值)
到目前为止,我们都在使用梯度下降算法,但是对于某些线性回归问题,正规方程方法是更好的解决方案。如:
seida是标量,实数值,不是向量。
只需一步即可得到seida的最优值。
正规方程是通过求解下面的方程来找出使得代价函数最小的参数的:
求导,使导数为零,求出seida0,seida1,…,seidan,可以求得使得J(seida)最小的seida值。
假设我们的训练集特征矩阵为 X(包含了 x0=1)并且我们的训练集结果为向量 y,则利用正规方程解出向量
在 Octave 中,正规方程写作:(Octave是一种编程语言)
计算seida量的命令
pinv是用来计算逆矩阵的函数
注:对于那些不可逆的矩阵(通常是因为特征之间不独立,如同时包含英尺为单位的尺寸和米为单位的尺寸两个特征,也有可能是特征数量大于训练集的数量),正规方程方法是不能用的。
梯度下降的缺点:需要尝试不同的学习率,然后迭代多次会使计算很慢。
正规方程的优点:不需要选择学习率,不需要画J(seida)的曲线。
总结一下,只要特征变量的数目并不大,标准方程是一个很好的计算参数θ的替代方法。具体地说,只要特征变量数量小于一万,我通常使用标准方程法,而不使用梯度下降法。
随着我们要讲的学习算法越来越复杂,例如,当我们讲到分类算法,像逻辑回归算法,我们会看到, 实际上对于那些算法,并不能使用标准方程法。对于那些更复杂的学习算法,我们将不得不仍然使用梯度下降法。因此,梯度下降法是一个非常有用的算法,可以用在有大量特征变量的线性回归问题。或者我们以后在课程中,会讲到的一些其他的算法,因为标准方程法不适合或者不能用在它们上。但对于这个特定的线性回归模型,标准方程法是一个比梯度下降法更快的替代算法。所以,根据具体的问题,以及你的特征变量的数量,这两种算法都是值得学习的。
7.正规方程及不可逆性
对于这种问题的处理方式为首先看特征里是否有一些多余的特征,例如x1和x2是线性相关的,或互为线性函数,则可以删除其中一个特征。如果没有多余的特征,则检查是否有过多的特征,如果太多,在少一些特征不影响的话,就删除一些特征,或者考虑使用正规化方法。
(ps:正规化方法可以让你使用很多的特征,来配置很多参数,即使你有一个相对较小的训练集。)
pinv和inv函数一个是求伪逆,一个是求逆,伪逆即即使不可逆的情况,算法也能正确运行。
举例:
x1=size in feet^2
x2=size in m^2
在这里1m=3.28feet
即x1=(3.28)^2*x2
这里的两个特征就可以去除其中一个,是多余的。
写完了,bingo~思密达,Fighting!!!