第四章-多变量线性回归
多功能
我们探讨了单变量/特征的回归模型,现在我们对房价模型增加更多的特征,楼层数、卧室数、使用年数等会影响房屋的价格,构成一个含有多个变量的模型,模型中的特征为
(
x
1
,
x
2
,
x
3
,
.
.
.
,
x
n
)
\left( {x_{1}},{x_{2}},{x_{3}}, ... ,{x_{n}} \right)
(x1,x2,x3,...,xn)。
我们引入一系列新的标记:
- n n n 代表特征的数量
- x ( i ) {x^{\left( i \right)}} x(i) 代表第 i i i 个训练实例,是特征矩阵中的第 i i i 行,是一个向量(vector)。比如上图的 x ( 2 ) = [ 1416 3 2 40 ] {x}^{(2)}\text{=}\begin{bmatrix} 1416 \\\ 3 \\\ 2 \\\ 40 \end{bmatrix} x(2)=⎣⎢⎢⎡1416 3 2 40⎦⎥⎥⎤
- x j ( i ) {x}_{j}^{\left( i \right)} xj(i) 代表特征矩阵中第 i i i 行的第 j j j 个特征,也就是第 i i i 个训练实例的第 j j j 个特征。比如上图的 x 2 ( 2 ) = 3 x_{2}^{\left( 2 \right)}=3 x2(2)=3
单个特征变量的线性回归假设为
h
θ
(
x
)
=
θ
0
+
θ
1
x
h_\theta \left( x \right)=\theta_{0} + \theta_{1}x
hθ(x)=θ0+θ1x
多个特征变量的线性回归假设为
h
θ
(
x
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
.
.
.
+
θ
n
x
n
h_{\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+...+{\theta_{n}}{x_{n}}
hθ(x)=θ0+θ1x1+θ2x2+...+θnxn ,公式中有
n
+
1
n+1
n+1 个参数和
n
n
n 个变量
为了使得公式能够简化一些,引入
x
0
=
1
x_{0}=1
x0=1,则公式转化为:
h
θ
(
x
)
=
θ
0
x
0
+
θ
1
x
1
+
θ
2
x
2
+
.
.
.
+
θ
n
x
n
h_{\theta} \left( x \right)={\theta_{0}}{x_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+...+{\theta_{n}}{x_{n}}
hθ(x)=θ0x0+θ1x1+θ2x2+...+θnxn
现在,特征向量
x
x
x 是一个从 0开始标记的
n
+
1
n+1
n+1 维的向量,
x
=
[
x
0
x
1
x
2
.
.
.
x
n
]
∈
R
n
+
1
x=\left[ \begin{matrix} {{x}_{0}} \\ {{x}_{1}} \\ {{x}_{2}} \\ {...} \\ {{x}_{n}} \\\end{matrix} \right]∈R^ { n+1}
x=⎣⎢⎢⎢⎢⎡x0x1x2...xn⎦⎥⎥⎥⎥⎤∈Rn+1,
同时把参数
θ
θ
θ 也看做一个向量
θ
=
[
θ
0
θ
1
θ
2
.
.
.
θ
n
]
∈
R
n
+
1
\theta=\left[ \begin{matrix} {{\theta}_{0}} \\ {{\theta}_{1}} \\ {{\theta}_{2}} \\ {...} \\ {{\theta}_{n}} \\\end{matrix} \right]∈R^ { n+1}
θ=⎣⎢⎢⎢⎢⎡θ0θ1θ2...θn⎦⎥⎥⎥⎥⎤∈Rn+1
那么假设公式可以写为
h
θ
(
x
)
=
θ
0
x
0
+
θ
1
x
1
+
θ
2
x
2
+
.
.
.
+
θ
n
x
n
=
θ
T
X
h_{\theta} \left( x \right)={\theta_{0}}{x_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+...+{\theta_{n}}{x_{n}}={\theta^{T}}X
hθ(x)=θ0x0+θ1x1+θ2x2+...+θnxn=θTX,其中
x
0
=
1
x_{0}=1
x0=1,上标
T
T
T代表矩阵转置。
用多个特征量或变量来预测y,这就是多元线性回归( Multiple linear regression)
多元梯度下降法
梯度下降算法
与单变量线性回归类似,在多变量线性回归中,我们也构建一个代价函数,这个代价函数是所有建模误差的平方和,即: J ( θ 0 , θ 1 . . . θ n ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J\left( {\theta_{0}},{\theta_{1}}...{\theta_{n}} \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{\left( h_{\theta} \left({x}^{\left( i \right)} \right)-{y}^{\left( i \right)} \right)}^{2}}} J(θ0,θ1...θn)=2m1i=1∑m(hθ(x(i))−y(i))2,其中 h θ ( x ) = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n h_{\theta} \left( x \right)={\theta_{0}}{x_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+...+{\theta_{n}}{x_{n}} hθ(x)=θ0x0+θ1x1+θ2x2+...+θnxn
多变量线性回归的批量梯度下降算法为:
当
n
>
=
1
n>=1
n>=1时,
θ
0
:
=
θ
0
−
a
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
0
(
i
)
{{\theta }_{0}}:={{\theta }_{0}}-a\frac{1}{m}\sum\limits_{i=1}^{m}{({{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}})}x_{0}^{(i)}
θ0:=θ0−am1i=1∑m(hθ(x(i))−y(i))x0(i)
θ 1 : = θ 1 − a 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 1 ( i ) {{\theta }_{1}}:={{\theta }_{1}}-a\frac{1}{m}\sum\limits_{i=1}^{m}{({{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}})}x_{1}^{(i)} θ1:=θ1−am1i=1∑m(hθ(x(i))−y(i))x1(i)
θ 2 : = θ 2 − a 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 2 ( i ) {{\theta }_{2}}:={{\theta }_{2}}-a\frac{1}{m}\sum\limits_{i=1}^{m}{({{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}})}x_{2}^{(i)} θ2:=θ2−am1i=1∑m(hθ(x(i))−y(i))x2(i)
我们开始随机选择一系列的参数值,计算所有的预测结果后,再给所有的参数一个新的值,如此循环直到收敛。
Python 代码:
import numpy as np
def computeCost(X, y, theta):
inner = np.power(((X * theta.T) - y), 2)
return np.sum(inner) / (2 * len(X))
特征缩放
在我们面对多维特征问题的时候,如果你能确保这些特征都处在一个相近的范围,这样梯度下降就能更快的收敛,这就是特征缩放(Feature Scaling)
例如有两个特征值:
- x1 表示房屋面积的大小,取值在0~2000之间
- x2 表示卧室的数量,取值在1~5之间。
以两个参数分别为横纵坐标,绘制代价函数的等高线图能,看出图像会显得很扁,梯度下降算法需要非常多次的迭代才能收敛。解决的方法是尝试将所有特征的尺度都尽量缩放到-1到1之间。
通常,执行特征缩放的目的是将特征的取值约束到-1到+1的范围内。(-1,+1),这个范围可以灵活的选择,只要不是太大或太小是可接受的。
在特征缩放中,有时会进行称为 均值归一化(Mean normalization) 的工作。如果有一个特征
x
n
−
μ
n
x_{n}-{\mu}_{n}
xn−μn,用来替换
x
n
x_{n}
xn,让特征值具有为0的平均值。
例如,房屋的面积取值在0~2000之间, x 1 = s i z e − 1000 2000 {{x}_{1}}=\frac{{size}-{1000}}{{2000}} x1=2000size−1000 ;卧室的数量取值在1~5之间, x 2 = b e d r o o m − 2 5 {{x}_{2}}=\frac{{bedroom}-{2}}{{5}} x2=5bedroom−2 。其中 − 0.5 ≤ x 1 ≤ 0.5 -0.5≤x_{1}≤0.5 −0.5≤x1≤0.5, − 0.5 ≤ x 2 ≤ 0.5 -0.5≤x_{2}≤0.5 −0.5≤x2≤0.5 。注意这里不能应用于 x 0 x_{0} x0 ,因为 x 0 x_{0} x0 永远为 1。
更一般的规律: x j ( i ) = x j ( i ) − μ n s n {x}_{j}^{\left( i \right)}=\frac{{{x}_{j}^{\left( i \right)}}-{{\mu}_{n}}}{{{s}_{n}}} xj(i)=snxj(i)−μn 。其中 μ n {\mu_{n}} μn是特征 x j ( i ) {x}_{j}^{\left( i \right)} xj(i)的平均值 avg( x j x_{j} xj) ; s n {s_{n}} sn是该特征值的范围 max( x j x_{j} xj) - min( x j x_{j} xj) ,也可以把它设置为标准差。
特征缩放不必太精准,它只是为了让梯度下降能够运行的更快一点,让迭代的次数更少一点。
学习率
梯度下降算法收敛所需要的迭代次数根据模型的不同而不同,我们不能提前预知,我们可以绘制迭代次数和代价函数的图表来观测算法在何时趋于收敛。
横轴表示的是迭代次数,纵轴表示的是代价函数每次迭代之后的结果。
介绍一种自动测试是否收敛的方法,如果代价函数 J ( θ ) J({\theta}) J(θ) 一步迭代后的下降小于某个阀值 ε(一般ε ≤ 1 0 − 3 10^{-3} 10−3),这个测试就判断函数已经收敛。
但是通常要选择一个合适的阈值 ε 是非常困难的,所以通过上述的图像判断更加清晰可靠。
如果从图像中看到代价函数
J
(
θ
)
J({\theta})
J(θ) 一直在上升或者持续地先下降又上升,这意味着我们要选择更小的学习率
α
α
α
数学家已经证明,只要选择足够小的学习率
α
α
α ,那么每次迭代之后的代价函数
J
(
θ
)
J({\theta})
J(θ) 都会下降。
总结:
- 如果 α 太小,即学习速率太小,梯度下降法会收敛得很慢
- 如果 α 太大,梯度下降法每次下降很快,可能会越过最小值,甚至可能无法收敛
- 通常可以考虑尝试这些学习率: α = 0.01 , 0.03 , 0.1 , 0.3 , 1 \alpha=0.01, 0.03, 0.1, 0.3, 1 α=0.01,0.03,0.1,0.3,1
特征与多项式回归
房价问题
h θ ( x ) = θ 0 + θ 1 × f r o n t a g e + θ 2 × d e p t h h_{\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}\times{frontage}+{\theta_{2}}\times{depth} hθ(x)=θ0+θ1×frontage+θ2×depth
x 1 = f r o n t a g e {x_{1}}=frontage x1=frontage(临街宽度), x 2 = d e p t h {x_{2}}=depth x2=depth(纵向深度), x = f r o n t a g e ∗ d e p t h = a r e a x=frontage*depth=area x=frontage∗depth=area(面积),则: h θ ( x ) = θ 0 + θ 1 x {h_{\theta}}\left( x \right)={\theta_{0}}+{\theta_{1}}x hθ(x)=θ0+θ1x。
线性回归并不适用于所有数据,有时我们需要曲线来适应我们的数据,比如一个二次方模型:
h
θ
(
x
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
2
h_{\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}^2}
hθ(x)=θ0+θ1x1+θ2x22
或者三次方模型:
h
θ
(
x
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
2
+
θ
3
x
3
3
h_{\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}^2}+{\theta_{3}}{x_{3}^3}
hθ(x)=θ0+θ1x1+θ2x22+θ3x33
通常我们需要先观察数据然后再决定准备尝试怎样的模型。 另外,我们可以令: x 2 = x 2 2 , x 3 = x 3 3 {{x}_{2}}=x_{2}^{2},{{x}_{3}}=x_{3}^{3} x2=x22,x3=x33,从而将模型转化为线性回归模型。
根据函数图形特性,我们还可以使: h θ ( x ) = θ 0 + θ 1 ( s i z e ) + θ 2 ( s i z e ) 2 {{{h}}_{\theta}}(x)={{\theta }_{0}}\text{+}{{\theta }_{1}}(size)+{{\theta}_{2}}{{(size)}^{2}} hθ(x)=θ0+θ1(size)+θ2(size)2
或者: h θ ( x ) = θ 0 + θ 1 ( s i z e ) + θ 2 s i z e {{{h}}_{\theta}}(x)={{\theta }_{0}}\text{+}{{\theta }_{1}}(size)+{{\theta }_{2}}\sqrt{size} hθ(x)=θ0+θ1(size)+θ2size
注意:如果我们采用多项式回归模型,在运行梯度下降算法前,特征缩放非常有必要。
正规方程
正规方程的概念
正规方程提供了一种求θ的解析解法,可以不需要通过迭代一次性求得解,一步得到最优值。
假设对于一个代价函数: J ( θ ) = a θ 2 + b θ + c J ( \theta)=a{\theta}^{2} + b{\theta} + c J(θ)=aθ2+bθ+c,可以通过求导数的方法得到使 J ( θ ) J(\theta) J(θ) 的最小点 θ θ θ 值。
正规方程求最小值的方式则是让代价函数的导数为0,求出θ值。
假设我们的训练集特征矩阵为
X
X
X(包含了
x
0
=
1
{{x}_{0}}=1
x0=1)并且我们的训练集结果为向量
y
y
y,则利用正规方程解出向量
θ
=
(
X
T
X
)
−
1
X
T
y
\theta ={{\left( {X^T}X \right)}^{-1}}{X^{T}}y
θ=(XTX)−1XTy 。
上标T代表矩阵转置,上标-1 代表矩阵的逆。
正规方程的 python 实现:
import numpy as np
def normalEqn(X, y):
theta = np.linalg.inv(X.T@X)@X.T@y #X.T@X等价于X.T.dot(X)
return theta
公式的推导
θ = ( X T X ) − 1 X T y \theta ={{\left( {X^{T}}X \right)}^{-1}}{X^{T}}y θ=(XTX)−1XTy 的推导过程:
J
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J\left( \theta \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{\left( {h_{\theta}}\left( {x^{(i)}} \right)-{y^{(i)}} \right)}^{2}}}
J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2
其中:
h
θ
(
x
)
=
θ
T
X
=
θ
0
x
0
+
θ
1
x
1
+
θ
2
x
2
+
.
.
.
+
θ
n
x
n
{h_{\theta}}\left( x \right)={\theta^{T}}X={\theta_{0}}{x_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+...+{\theta_{n}}{x_{n}}
hθ(x)=θTX=θ0x0+θ1x1+θ2x2+...+θnxn
将向量表达形式转为矩阵表达形式,则有 J ( θ ) = 1 2 ( X θ − y ) 2 J(\theta )=\frac{1}{2}{{\left( X\theta -y\right)}^{2}} J(θ)=21(Xθ−y)2 ,其中 X X X 为 m m m 行 n n n 列的矩阵( m m m 为样本个数, n n n 为特征个数), θ \theta θ 为 n n n 行 1 列的矩阵, y y y 为 m m m 行 1 列的矩阵,对 J ( θ ) J(\theta ) J(θ)进行如下变换
J ( θ ) = 1 2 ( X θ − y ) T ( X θ − y ) J(\theta )=\frac{1}{2}{{\left( X\theta -y\right)}^{T}}\left( X\theta -y \right) J(θ)=21(Xθ−y)T(Xθ−y)
= 1 2 ( θ T X T − y T ) ( X θ − y ) =\frac{1}{2}\left( {{\theta }^{T}}{{X}^{T}}-{{y}^{T}} \right)\left(X\theta -y \right) =21(θTXT−yT)(Xθ−y)
= 1 2 ( θ T X T X θ − θ T X T y − y T X θ − y T y ) =\frac{1}{2}\left( {{\theta }^{T}}{{X}^{T}}X\theta -{{\theta}^{T}}{{X}^{T}}y-{{y}^{T}}X\theta -{{y}^{T}}y \right) =21(θTXTXθ−θTXTy−yTXθ−yTy)
接下来对 J ( θ ) J(\theta ) J(θ)偏导,需要用到以下几个矩阵的求导法则:
d A X d X = A T \frac{dAX}{dX}={{A}^{T}} dXdAX=AT
d X T A d X = A \frac{d{{X}^{T}}A}{dX}=A dXdXTA=A
d X T A X d X = 2 A X \frac{d{{X}^{T}}AX}{dX}=2AX dXdXTAX=2AX
所以有:
∂ J ( θ ) ∂ θ = 1 2 ( 2 X T X θ − X T y − ( y T X ) T − 0 ) \frac{\partial J\left( \theta \right)}{\partial \theta }=\frac{1}{2}\left(2{{X}^{T}}X\theta -{{X}^{T}}y -{}({{y}^{T}}X )^{T}-0 \right) ∂θ∂J(θ)=21(2XTXθ−XTy−(yTX)T−0)
= 1 2 ( 2 X T X θ − X T y − X T y − 0 ) =\frac{1}{2}\left(2{{X}^{T}}X\theta -{{X}^{T}}y -{{X}^{T}}y -0 \right) =21(2XTXθ−XTy−XTy−0)
= X T X θ − X T y ={{X}^{T}}X\theta -{{X}^{T}}y =XTXθ−XTy
令 ∂ J ( θ ) ∂ θ = 0 \frac{\partial J\left( \theta \right)}{\partial \theta }=0 ∂θ∂J(θ)=0,
则有 θ = ( X T X ) − 1 X T y \theta ={{\left( {X^{T}}X \right)}^{-1}}{X^{T}}y θ=(XTX)−1XTy
梯度下降法 VS 正规方程
梯度下降 | 正规方程 |
---|---|
需要选择学习率 α \alpha α | 不需要 α \alpha α |
需要多次迭代 | 一次运算即可 |
当特征数量 n n n 大时也能较好适用 | 需要计算 ( X T X ) − 1 {{\left( {{X}^{T}}X \right)}^{-1}} (XTX)−1 ,如果特征数量n较大则运算代价大,速度慢 |
适用于各种类型的模型 | 只适用于线性模型,不适合逻辑回归模型等其他模型 |
选择梯度下降法还是正规方程法,我们可以根据特征量n的多少来决定。只要特征变量的数目并不大,标准方程是一个很好的计算参数的替代方法。具体地说,只要特征变量数量小于一万,通常使用标准方程法,而不使用梯度下降法。
根据具体的问题,以及你的特征变量的数量,这两种算法都是值得学习的。
奇异矩阵的解决办法
在线性代数的知识中,有些矩阵可逆,而有些矩阵不可逆。我们称那些不可逆矩阵为 奇异矩阵 或 退化矩阵。
对于那些不可逆的矩阵,正规方程方法是不能用的。
矩阵不可逆的原因可能有:
- 特征之间不独立,如同时包含英尺为单位的尺寸和米为单位的尺寸两个特征
- 特征数量大于训练集的数量
对于第一类原因,即特征之间不独立的情况,尽量想办法让特征之间相互独立,比如统一单位 等。
对于第二类原因,即特征量大于训练集数目的情况,提出两种解决方法:
- 删除一些多余的或者不会影响到正规方程的特征
- 使用 正则化(Regularization) 方法(以后会提到)
在大多数线性回归问题中,出现不可逆矩阵的情况极少发生,通常情况下我们都能通过正规方程顺利解决问题。