一、线性回归
1、多元线性回归
1.1、训练集
面积 |
卧室数量 |
层数 |
年份 |
价格 |
2104 |
5 |
1 |
45 |
460 |
1416 |
3 |
2 |
40 |
232 |
1534 |
3 |
2 |
30 |
315 |
852 |
2 |
1 |
36 |
178 |
其中,
n=4表示特征(面积\ 卧室数量 \ 层数 \ 年份)组数量。
x(i)表示第
i个样本。
xj(i)表示第
i个样本的第
j个特征。
1.2、假设函数
假设训练集中的特征贴合以下函数:
hθ(x)=θ0+θ1x1+θ2x2+⋯+θnxn
上述假设函数也可以用矩阵乘法表示,先令
x0=1,则输入变量
x和模型参数
θ可表示为:
x
=⎣⎢⎢⎢⎢⎢⎡x0x1x2⋮xn⎦⎥⎥⎥⎥⎥⎤θ
=⎣⎢⎢⎢⎢⎢⎡θ0θ1θ2⋮θn⎦⎥⎥⎥⎥⎥⎤
依据上式,有
hθ(x)=θTx
1.3、代价函数
根据上面提到的向量
θ
,代价函数为:
J(θ
)=2m1i=1∑m(hθ(x(i)−y(i)))2
据上式,模型参数的迭代公式(梯度下降)为:
θj:=θj−α∂θj∂J(θ
)(foreveryj)
将代价函数代入上式,可得:
θj:=θj−αm1i=1∑m(hθ(x(i)−y(i)))(xj(i))(foreveryj)
PS:
x0(i)=1;j为0至n
2、特征缩放和均值归一化
2.1、背景
如果输入变量
x的数值范围较大,那么代价函数的轮廓图变得细长,梯度下降过程曲折费时,如下所示:
如果样本中的特征
x的数值范围合理,那么代价函数的轮廓图变圆,梯度下降顺畅,如下所示:
2.2、具体实现
- 特征缩放
通过调整每个特征的比例:
xmax(i)−xmin(i)xj(i),其中分母是指各特征的最大值减最小值,使样本中的特征
x在【-1,1】范围附近,太小如【-0.0001,0.0001】或太大如【-100,100都不可以】。
- 均值归一化
通过
sixj(i)−μi代替
xj(i),使样本中的特征
x在【-0.5,0.5】范围附近。
3、选择学习速率
α
- 如果学习速率选择合适,则代价函数在迭代过程中的取值曲线图如下:
PS:可以在进行自动收敛测试时,设定迭代在下降值小于
10−3时,则声明收敛,结束迭代。
-
α过小,则曲线图下降缓慢,如下:
-
α过大,则曲线图可能来回波动甚至一直上升,如下:
-
具体实践中,可以取0.001、0.01、0.1和1等不同数量级的数进行尝试。
4、慎重选择特征
现有长和宽两组特征的样本e,但是任务T是根据面积预测价格,所以应该将长和宽两组特征组合(长×宽=面积),得到面积,再将得到的面积作为新特征,组成新的样本进行回归。
5、合理选择模型(假设函数)
如下图,因为随着面积的增大,价格是不会降低的,所以选择下方的多项式回归模型可能更加贴切:
同时,下方的模型也可以表示为线性:
hθ(x)=θ0+θ1x1+θ2x2+⋯+θnxnxn=(size)n
除此以外,还可以使用下面的模型:
hθ(x)=θ0+θ1(size)+θ2(size)
6、正规方程法
6.1、用途
与梯度下降算法目的相同,均是求得模型参数
θ。
6.2、求解思路
基于微积分,令代价函数的各个偏导数为0,直接求出极值点
α∂θj∂J(θ)=0(foreveryj)
但是,当特征较多时,上面的计算极为复杂,在具体实践中,多数采用如下过程进行求解:
x0 |
面积 |
卧室数量 |
层数 |
年份 |
价格 |
1 |
2104 |
5 |
1 |
45 |
460 |
1 |
1416 |
3 |
2 |
40 |
232 |
1 |
1534 |
3 |
2 |
30 |
315 |
1 |
852 |
2 |
1 |
36 |
178 |
- 设计矩阵
X
由各样本
x(i)转置组合得到,其中
x0(i)=1
X=⎣⎢⎢⎡11112104141615348525332122145403036⎦⎥⎥⎤y
=⎣⎢⎢⎡460232315178⎦⎥⎥⎤
- 模型参数向量
θ
θ
=(XTX)−1XTy
上式推导如下:
Xθ
=y
⇒X−1Xθ
=X−1y
⇒θ
=X−1((X−1)TXT)y
⇒θ
=(XTX)−1XTy
6.3、与梯度下降相比较
梯度下降 |
正规方程 |
需要迭代多次 |
不需要迭代 |
需要选择合适的
α |
不需要选择参数 |
计算量小,在样本中特征组数量过多时(
n>10000)也能较好运行 |
计算量大,
0(n3),在样本中特征组数量较少(
n<10000)才能较好运行 |
6.4、潜在的不可逆性
如果
XTX不可逆,则无法求解模型参数向量,解决方法有:
- 去掉多余的特征组,比如一个特征组是关于平方米,另一个是平方厘米,则取其中一个即可。
- 如m=10,n=100,特征太多,删除一些不必要的特征或者正则化(下篇文章中学习)
- 用octave中pinv()命令,求伪逆矩阵(其求解思路可见上一篇博文《机器学习第一周》)