0 概述
在week 1中,我们学习了单变量线性回归,但现实世界往往不是简单的一元函数就能够表示的,因此基于Week 1的基础上,Week 2 将对多变量线性回归,进行深入的讲解。
并且通过调整学习率,特征缩放,特征构造,均值归一化,来使我们更好地进行迭代回归。
1. 课程大纲
本周课程大纲如下图所示:

2. 课程内容
2.1 多元线性回归
在week 1中我们通过假设模型hθ(x)=θ0+θ1x去预测房价和面积之间的关系。但实际生活中房价不仅仅与面积有关,与新旧等多个因素相关,如下图所示:

决定房价的因素,从单变量变成了一个向量。
x=⎣⎢⎢⎢⎢⎡x0x1x2...xn⎦⎥⎥⎥⎥⎤
因此,假设模型就定义为:
hθ(x)=θ0+θ1x1+θ2x2+⋯+θnxn
这就是多变量线性回归。
注:这里需要说一下,什么样的函数可以被称为线性函数?
当函数满足以下两个性质,就被称为线性函数
齐次性:f(ax)=af(x)
可加性:f(x+y)=f(x)+f(y)
2.2 多元线性回归的梯度下降
假设函数:
hθ(x)=θTx=θ0x0+θ1x1+θ2x2+⋯+θnxn
损失函数:
J(θ0,θ1,…,θn)=2m1∑i=1m(hθ(x(i))−y(i))2
其中,x(i)第i个训练数据的输入变量,现在是一个向量。
优化目标:
minθJ(θ0,θ1,⋯,θn)
迭代步骤:
θj:=θj−α∂θj∂J(θ0,…,θn)=θj−αm1∑i=1m(hθ(x(i))−y(i))xj(i)
直到收敛(一般我们认为一次迭代J(θ0,θ1,⋯,θn)小于一个数值,比如10^-3,就可以认为收敛了)。
注意:所有参数都要以同个costFunction当前参数来进行运算更新(不能更新一个θj替换一个),最后替换生成新的costFunction。
2.3 特征缩放
从2.1节中的房价表,可以发现面积、房间数、年限都不在一个数量级上,这样会导致θi的数值也不能在一个数量级,最终导致不能够简单快速的收敛。
因此,提出了特征缩放来解决这个问题。
特征缩放:将所有的特征变量压缩到大致为[-1, 1]的范围。
比如:
xi=sixi 其中,si是最大值-最小值,这样就缩放到[0-1]范围。
或者采用均值归一化,
xi=sixi−μi, 其中,μi是X向量元素的平均值,si是最大值-最小值或者可以用标准偏差。
通过特征缩放,能够使得训练过程更加有效的收敛。
2.4 学习率
每一次迭代更新θ,都会用到α,它被称为学习率。一般情况下:
α过小:收敛速度过慢
α过大:不能收敛,甚至可能发散,有时候也会出现收敛过慢。
一般α可以从 0.001,0.003,0.01,0.03,0.1,0.3,1 这几个值去尝试,选一个最优的。
2.5 构造特征以及多项式回归
到目前为止,我们仅仅通过图表知道房价和面积,年代,房间数…特征有关系,但是并不明确知道为什么会是这些特征,是否还有其他特征。往往如果这些简单的特征无法正确表达房价,是否能够尝试构造一个特征呢?
答案是肯定的。
比如构造特征x1/x2,表示房间总面积除以房间数,表征每个房间的平均面积,作为新的特征,或者对面积进行开方的到新的特征。
hθ(x)=θ0+θ1(size)+θ2(size)
关于如何去选取和构造特征:这只能通过观察和推测了,需要在相关领域有足够的经验。在机器学习中,有专门的特征工程,就是为了能够找到比较好的feature。
2.6 正规方程法
2.6.1 正规方程的推导
在初中的时候,学习解方程组,老师常说:有几个方程就能解出几个变量,其实那就是正规方程的开端。然而真实情况并非如此,这里必须有一个前提,所有的方程的系数是线性无关的。
现在引入的正规方程,同样是根据初中时候的思想,不用不断迭代,一次就能够求解出最优的θ。
如下图所示,我们引入x0列,作为θ0,也就是偏移量固定系数。

对于矩阵 X的每一行,相当于一个训练数据的输入变量,记为x(i),
x(i)=⎣⎢⎢⎢⎢⎡x0(i)x1(i)⋮xn(i)⎦⎥⎥⎥⎥⎤,其中i表示第i个训练数据,i∈[1,m]; n表示输入变量x(i)第n个特征;x(i)有n+1维。
因此可以将矩阵X表示为:
X=⎣⎢⎢⎢⎡(x(1))T(x(2))T⋮(x(m))T⎦⎥⎥⎥⎤,可以看到矩阵X是m∗(n+1)维的。
可以将向量θ表示为:
Θ=⎣⎢⎢⎢⎡θ0θ1⋮θn⎦⎥⎥⎥⎤
可以将输出向量Y表示为:
Y=⎣⎢⎢⎢⎡y(1)y(2)⋮y(m)⎦⎥⎥⎥⎤
综上可以得到正规方程组:
假设模型:
hΘ(X)=X∗Θ
损失函数:
F(Θ)=2m1∑i=1m(hθ(x(i))−y(i))2,用矩阵X和向量Θ,Y,简化损失函数,
X⋅Θ−Y=⎣⎢⎢⎡(x(1))T⋮(x(m))T⎦⎥⎥⎤⋅⎣⎢⎢⎢⎡θ0θ1⋮θn⎦⎥⎥⎥⎤−⎣⎢⎢⎢⎡y(1)y(2)⋮y(m)⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡hθ(x(1))−y(1)hθ(x(2))−y(2)⋮hθ(x(m))−y(m)⎦⎥⎥⎥⎤
因此,可简化损失函数为:
F(Θ)=2m1(X⋅Θ−Y)T(X⋅Θ−Y)
这就是矩阵和向量优雅的表示。
经过推到,可得结论:
Θ=(XTX)−1XTY
其中前提条件是 XTX 是非奇异(非退化)矩阵, 即∣∣XTX∣∣!=0
2.6.2 可逆性分析
求解Θ=(XTX)−1XTY,需要求解XTX的逆。
一般出现不可逆有两种情况:
(1) 列向量线性相关,即训练集中存在冗余特征,此时应该剔除掉多余特征;
(2) 特征过多,此时应该去掉影响较小的特征,或使用“正则化”;当样本总数 m 小于等于特征数量 n 时,XTX 一定不可逆。
正则化处理:

当λ>0时,可以保证矩阵可逆。
在octave中有两个方法,一个pinv()求解伪逆矩阵,一个inv()求解逆矩阵,我们通常使用pinv()来求解,因为即使矩阵不可逆,也依然能计算得结果。
2.6.3 梯度下降和正规方程的比较
梯度下降法,
优点:梯度下降在超大数据集的训练中,表现依然良好;适用于各种模型。
缺点:需要选择学习率α,需要很多次迭代计算才能收敛
正规方程法,
优点:不用多次迭代,不用选择学习率α
缺点:需要计算 XTX,且其时间复杂度为O(n3),一般情况下,当n>10000的时候,就不考虑使用正规方程了;无法计算Logistic Regression 的classification问题
2.7 Octave 简明教程
本课程所有的代码,都是使用octave完成的,octave可以理解为对Matlab的GUN免费版,基本的语法都和Matlab一致。当然如果你有盗版的Matlab,也可以直接使用。不过由于语法的些许不同,可能会耽误调试和提交代码,Octave同样很好用建议直接下载使用。
Octave教程内容较多,可以参考我总结的一篇《Octave/Matlab 简明教程》,内容很详细:
https://blog.****.net/****_SUSAN/article/details/90266610
3. 课后编程作业
我将课后编程作业的参考答案上传到了github上,包括了octave版本和python版本,大家可参考使用。
github地址:https://github.com/GH-SUSAN/Machine-Learning-MarkDown/tree/master/week2
4. 总结
多变量线性回归以及多项式回归,让我们进一步的对复杂的回归问题有了了解。
同时学习工具octave也可以帮助我们快速的完成编码实现回归的工作。
在以后的工作中,octave会成为有力的工具,因为它能够快速实现你的想法,当你实现了这些想法并发现有效后,再用java或者c或者python做进一步部署,这将是一个很好的工作思路。