本博客主要参考此博客:恋雨心
相对于单变量线性回归模型,多变量线性回归模型适用于处理多个变量/特征。
对比:
以之前我们介绍的单变量线性回归模型为例:
用房屋面积x预测房子价格y。
现在我们对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为(x1,x2,…,xn)。
增添了更多特征后,我们引入以下新的注释:
n代表特征的数量
x(i)代表第 i个训练实例,是特征矩阵中的第i行,是一个向量(vector)。
代表特征矩阵中第 i 行的第 j个特征,也就是第 i个训练实例的第 j个特征。
例如就表示上图中的第二个样例的第3个特征量。
支持多变量的假设 h表示为:
这个公式中有n+1个参数和n个变量,这n个变量就表示样例的n个特征量。
为使公式简洁化,引入x0=1,则公式转化为以下形式:
向量化形式:
以上便是多元线性回归形式。
这一节我们介绍多元线性回归的假设形式以及使用梯度下降法来处理多元线性回归问题。
以下为梯度下降算法更新过程:
其细节部分如下:
左侧为单变量,右侧为多变量
向量化处理形式:
本节主要讨论一种对梯度下降法的优化方式——特征缩放
数学上可以证明,当所有特征取值范围相近时,梯度下降法可以收敛得更快些。
举例如下,下面的问题还有两个特征x1、x2。其中x1是房屋面积大小, 且x1∈(0,2000);x2是房间数,且x2∈(1,5)
画出代价函数J(θ)的轮廓图。代价函数J(θ)是关于θ0,θ1,θ2的函数,因为θ0是一个常数,只会影响的轮廓图在坐标系中的位置,不会影响其形状,所以暂不考虑θ0。只画出J(θ)关于θ1、θ2的图形。
由于x1的取值范围远远大于x2的取值范围,所以代价函数的轮廓图呈现扁斜状,2000:5的比例会让该轮廓图中的椭圆更加瘦长。如果在该代价函数上运行梯度下降算法。可能会经过很长时间才能收敛到全局最小值,如右图。
如果把这个图像画的再夸张一些,如左图,情况可能会更糟糕,甚至可能会反复来回震荡,才能找到一条通往全局最小值的路。
此处收敛路径为何是震荡的,而不是直接向最低点去呢?
如图所示:
我想应该是因为在某点处,决定下一步往哪个方向走时,怎么选择方向呢?该点在一个三维图像上,所以该点的360°方向上都有切线,我们选择的方向就是切线斜率最大的那个方向。形象一点说,如下图,假设一个人站在图中黑点处,地域面积太大了,他的视野范围就只能在图中黑色圆圈内,他在圈内,在当前位置处,能看到的坡度最陡的方向自然就是大红色箭头标记的方向。
所以,在代价函数参数的比例过大的情况下,一种有效的方法是进行特征缩放。
具体来说,可以把特征x1定义为房子面积/2000,特征x2定义为房间数/5,这样特征值x1,x2的范围就都在[0,1]内了。此时代价函数的轮廓图就是一个规整的圆,梯度下降法很快就能找到一条通往最小值的捷径。所以,通过最小值缩放,就能抵消掉特征值的范围问题。
总体来说,我们使用特征缩放的目的就是将特征的取值约束到[-1,+1]范围内。
特征x0总是取值为1,因此其总满足x0∈[-1,+1]。至于其他特征,可能需要对其进行某种处理(比如,各自除以不同的数),来使其处于同一范围内。
注意:-1、+1这两个数,并不是很重要。
比如特征x1∈(0,3),而特征x2∈(-1,2),这也没关系,因为这也非常接近[-1,1]的范围了。若特征x3∈[-100,+100],那x3与[-1,+1]的范围就非常远了,已经是O(10^2)的数量级差距了。X3很可能是一个缩放的不太好的特征。当然,若特征x4∈(-0.00001,+0.00001),也是不合适的。
但是用太过担心,特征值的范围太大还是太小,因为只要他们足够接近,那么梯度下降法就能正常运行了。
在特征缩放中,除了将特征除以最大值,也可以进行均值归一化(mean normalization)。均值归一化是指,对于特征xi,可以用xi-ui来替换它,来让所有特征的平均值为0。
对于x0=1,不需要进行此处理,因为其值恒等于1,均值不可能等于0。对于其他特征,例如代表房子面积的特征x1∈(0,2000),假如房子面积的特征值,其平均值为1000,那么可以将x1进行如下处理。再例如,房间含有的卧室数是[0,5],平均一套房子有两间卧室,那么可以像下面这样归一化x2。
像这样,便可以算出新的特征x1、x2,这样它们的范围就可以在[-0.5,0.5]之间。
更一般的,均值归一化可以表示为如下公式:
其中x1是特征,u1是训练集中所有样例的特征x1的平均值。S1是x1的范围,即
也可以使用标准差作为S1。
特征缩放不需要太精确,只是为了使梯度下降法收敛得快一些。
本节我们讨论另一种梯度下降算法的优化方式——学习速率
为了判断梯度下降算法是否收敛,可以画出J(θ)随迭代步数变化的曲线,横坐标是梯度下降算法的迭代步数(注意,不是参数θ),纵坐标是代价函数J(θ)的值,图中的每一点都对应一个θ值。可以看出,在迭代步数300~400之间,代价函数几乎没有在下降,所以,可以说代价函数J(θ)在迭代步数等于400时收敛。
这幅图可以帮助我们看出代价函数是否收敛:
另外,“J(θ)—迭代步数”曲线也可以在算法没有正确运行时,提前发出警告。例如,若“J(θ)—迭代步数”曲线出现下面这样的情况,即J(θ)是随迭代步数的增加而增长的,那么很明显,此时梯度下降算法没有正确运行。这通常意味着应该使用较小的学习率α。
如果J(θ)在上升,那么最常见的原因就是α过大,导致迭代时容易错开最小值,以最小值为中心,反复迭代,不断增大。很明显,解决办法就是减小学习率α。当然也有可能是代码的错误,所以需要仔细检查。
也可能出现左下角所示的情况,即J(θ)不断减小、增大,呈波浪状变化,出现这种情况的原因也很可能是α过大,解决办法自然也是减小α了。
但这并不是说α越小越好,因为若α过小,可能导致梯度下降算法收敛的非常慢。
总结一下,学习率α太小,可能导致梯度下降算法收敛的非常慢;学习率α太大,可能导致梯度下降算法在某几次迭代时不下降,反而增加,甚至不能收敛。当然α太大,也有可能导致算法收敛的很慢的。而为了弄清到底发生了什么,可以画出J(θ)随迭代步数变化的曲线。
ps:本人在处理学习率选择问题时使用的方法是每次迭代过程都输出更新前后的代价函数值,观察迭代前后代价函数是否减小,若减小则试着增加学习率;若增大则试着减小学习率,最终找到合适的学习率(实现部分的博客会详细讲解)
在实际工作中,可以尝试多选几个α值试试,分别画出其“J(θ)—迭代步数”曲线,选择使算法收敛最快的α作为最终值。通常,可以选择α的值,间隔3倍。例如… 0.001、0.003、0.01、0.03、0.1、0.3、1,通常先找到两个端点值,例如不能比1再大,不能比0.001再小。通常选取,这组数中尽可能大的值,例如最大的值1,或者比最大值1略小一点的0.3。
特征为非一次特征,可以将该特征被一次特征代替,即多项式回归可以用线性回归来拟合
以预测房价为例,假设有两个特征,分别是房子临街的宽度(frontage)和纵向深度(depth)。其中临街宽度其实就是房子占地面积的宽度,纵向深度也就是占地面积的长度。建立下面的线性回归模型,其中临街宽度是第一个特征,纵深宽度是第二个特征。
除此之外还有其他的特征选择吗?
当然有。不过此节主要处理的是多项式回归。
假如有如下住房价格数据集:
以下假设不合理:
二次函数后半部分会随着土地面积增加而减小
单纯的根式函数后半部分增加幅度太小
所以,用三次函数拟合比较合理:
我们现在讨论的是预测房子的价格,房价 =θ0 +θ1*(房子面积) + θ2*(房子面积)^2 + θ3*(房子面积)^3,即
房价 =θ0 +θ1*(size) + θ2*(size)^2 + θ3*(size)^3 —— 模型公式。因此该式子与三次模型式子(绿框内)是相等的。
为了将假设公式与三次模型公式对应起来,使
x1 = (size)
x2 = (size)^2
x3 = (size)^3
这种思想总结起来就是:将特征像上面这样设置,再应用线性回归(hθ(x) = θ0 +θ1x1 + θ2x2 + θ3x3)的方法,就可以
拟合三次函数模型。
如果像这样(x1 = ,x2 = ,x3 = )选择数据,那么特征值的归一化就更为重要了。因为
size ∈ [0,10^3] ,
size^2 ∈[1,10^6],
size^3 ∈[1,10^9],这三个特征的范围有很大不同。
正规方程法(又称闭合解),是一种区别于梯度下降法(迭代方法)的直接解法。
举例:
下面我们来讨论以下一般情况下的操作细节:
在一般情况下,假设有m个训练样本,每个样本有n个特征变量。所以每一个训练样本都有一个与之相对应的n+1维的特征向量。
接下来我们便构造特征矩阵X
因为:
所以:
关于此公式的推导及正规方程的相关细节参照
以上便是多变量线性回归的理论部分讲解。