1.多功能
在单变量线性回归问题中,我们只有一个特征量x;比如经典的房价预测问题,当时我们只有一个特征量:即房屋的面积x,曾设预测函数为:
h
(
θ
)
=
θ
0
+
θ
1
x
h(θ) = θ_0 + θ_1x
h(θ)=θ0+θ1x
但是,在真实情况下,房子的价值并不仅仅只受面积的影响,还受到其他的许多因素的影响:比如说房屋的楼层数、卧室的数量、交通的便利指数、房屋的使用时间等等共同决定,因此,引入多变量就非常具有实际意义。
下面介绍我们的符号约定(也是吴恩达老师未来会在课程中使用的符号):
我们令:
x
(
i
)
x^{(i)}
x(i)表示第i个样本;令
x
j
x_j
xj表示每一个样本所具有的特征,
x
j
(
i
)
x^{(i)}_j
xj(i)表示第i个样本的第j个特征量。例如:
x
(
2
)
=
[
x
1
x
2
⋮
x
n
]
x^{(2)} = \begin{bmatrix}x_1 \\ x_2\\ \vdots \\x_n\end{bmatrix}
x(2)=⎣⎢⎢⎢⎡x1x2⋮xn⎦⎥⎥⎥⎤
就表示第二个样本所具有的全部特征量
有了多变量,那么我们的预测函数就变为了:
h
θ
(
x
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
⋯
+
θ
n
x
n
h_θ(x) = θ_0 + θ_1x_1 + θ_2x_2 + \cdots + θ_nx_n
hθ(x)=θ0+θ1x1+θ2x2+⋯+θnxn
这里,为了后面的方便,我们令
x
0
(
i
)
x_0^{(i)}
x0(i) = 1(即增加一个为1的第0个特征)
那么,对于某一个样本而言,其向量形式就变成了这样:
X
⃗
=
[
x
0
x
1
x
2
⋮
x
n
]
\vec{X} = \begin{bmatrix}x_0 \\ x_1 \\ x_2\\ \vdots \\x_n\end{bmatrix}
X=⎣⎢⎢⎢⎢⎢⎡x0x1x2⋮xn⎦⎥⎥⎥⎥⎥⎤
n+1维
同理,θ的向量形式就变成了:
θ
⃗
=
[
θ
0
θ
1
θ
2
⋮
θ
n
]
\vec{θ} = \begin{bmatrix}θ_0 \\ θ_1 \\ θ_2\\ \vdots \\θ_n\end{bmatrix}
θ=⎣⎢⎢⎢⎢⎢⎡θ0θ1θ2⋮θn⎦⎥⎥⎥⎥⎥⎤
也是n+1维
那么,我们来看看
h
θ
(
x
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
⋯
+
θ
n
x
n
h_θ(x) = θ_0 + θ_1x_1 + θ_2x_2 + \cdots + θ_nx_n
hθ(x)=θ0+θ1x1+θ2x2+⋯+θnxn能否换成下面的形式:
h
θ
(
x
)
=
θ
⃗
T
X
h_θ(x) = \vec{θ}^TX
hθ(x)=θTX(用矩阵乘法的形式表达,非常简洁)
θ
T
X
=
[
θ
0
,
θ
1
,
⋯
,
θ
n
]
[
x
0
x
1
x
2
⋮
x
n
]
θ^TX = [θ_0, θ_1, \cdots, θ_n] \begin{bmatrix}x_0 \\ x_1 \\ x_2\\ \vdots \\x_n\end{bmatrix}
θTX=[θ0,θ1,⋯,θn]⎣⎢⎢⎢⎢⎢⎡x0x1x2⋮xn⎦⎥⎥⎥⎥⎥⎤
2.多元梯度下降法
还记得我们的损失函数:cost:
J
(
θ
0
,
θ
1
,
⋯
,
θ
n
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
−
y
(
i
)
)
2
J(θ_0, θ_1, \cdots, θ_n) = \frac{1}{2m}\sum_{i = 1}^m(h_θ(x^{(i)} - y^{(i)})^2
J(θ0,θ1,⋯,θn)=2m1i=1∑m(hθ(x(i)−y(i))2
当然,我们现在可以用:
J
(
θ
⃗
)
J(\vec{θ})
J(θ)来代替
J
(
θ
0
,
θ
1
,
⋯
,
θ
n
)
J(θ_0, θ_1, \cdots, θ_n)
J(θ0,θ1,⋯,θn)
那么,我们的梯度下降法是这样的:
θ
j
:
=
θ
j
−
α
∂
J
(
θ
⃗
)
∂
θ
j
θ_j := θ_j - α\frac{\partial{J(\vec{θ})}}{\partial{θ_j}}
θj:=θj−α∂θj∂J(θ)
这里的求导并不复杂,我就简单介绍一下步骤:
- 计算: ∂ J ( θ ⃗ ) ∂ h θ ( x ( i ) ) \frac{\partial{J(\vec{θ})}}{\partial{h_θ(x^{(i)})}} ∂hθ(x(i))∂J(θ); ∂ J ( θ ⃗ ) ∂ h θ ( x ( i ) ) = 1 m ∑ i = 1 m ( h θ ( x ( i ) − y ( i ) ) \frac{\partial{J(\vec{θ})}}{\partial{h_θ(x^{(i)})}} = \frac{1}{m} \sum_{i = 1}^m(h_θ(x^{(i)} - y^{(i)}) ∂hθ(x(i))∂J(θ)=m1i=1∑m(hθ(x(i)−y(i))
- 计算:
∂
h
θ
(
x
(
i
)
)
∂
θ
j
\frac{\partial{h_θ(x^{(i)})}}{\partial{θ_j}}
∂θj∂hθ(x(i)),由上面的预测函数:
h
θ
(
x
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
⋯
+
θ
n
x
n
h_θ(x) = θ_0 + θ_1x_1 + θ_2x_2 + \cdots + θ_nx_n
hθ(x)=θ0+θ1x1+θ2x2+⋯+θnxn可知:
∂
h
θ
(
x
(
i
)
)
∂
θ
j
=
x
j
\frac{\partial{h_θ(x^{(i)})}}{\partial{θ_j}} = x_j
∂θj∂hθ(x(i))=xj
因此, ∂ J ( θ ⃗ ) ∂ θ j = 1 m ∑ i = 1 m ( h θ ( x ( i ) − y ( i ) ) x j \frac{\partial{J(\vec{θ})}}{\partial{θ_j}} = \frac{1}{m} \sum_{i = 1}^m(h_θ(x^{(i)} - y^{(i)})x_j ∂θj∂J(θ)=m1i=1∑m(hθ(x(i)−y(i))xj
2.1.多元梯度下降法演练Ⅰ- 特征缩放
我们想要不同的特征的取值在相近的范围内。这样做的目的是使得梯度下降法能够更快地收敛
比如在房价预测的例子中:
如果有两个特征:1.房子的面积;2.卧室的数量
如果第一个特征的取值范围在0~ 2000,而第二个特征的取值范围只是0~5,那么,我们我们的
θ
1
,
θ
2
θ_1,θ_2
θ1,θ2的等值曲线可以就非常曲折瘦高。这样梯度下降法可能会花上很长的时间去逼近最优解
但是,如果我们进行一下特征缩放,也就是将这两个取值范围相差很大的特征通过一些处理,使得它们的取值范围接近,比如我们可以这样做:
x
1
=
s
i
z
e
2000
x
2
=
n
u
m
b
e
r
o
f
b
e
d
r
o
o
m
5
x_1 = \frac{size}{2000}\\ x_2 = \frac{number \space of \space bedroom}{5}
x1=2000sizex2=5number of bedroom
那么,此时
x
1
x_1
x1的取值范围被缩放成了[0,1],
x
2
x_2
x2的取值范围也被缩放成了[0,1],那么
θ
1
,
θ
2
θ_1,θ_2
θ1,θ2的等值曲线就变成了长和宽都接近的近似的同心圆,这样我们梯度下降可以快速收敛
我们喜欢将特征缩放到-1和1的范围内,对于其他不同的x,可能需要通过乘以或除以不同的数,让他们缩放到合适的区间,当然,不一定非要等于-1和1,接近就行
下面介绍一下特征缩放的常用方法:均值归一化
均值归一化:即如果特征是
x
j
x_j
xj,我们就用
x
j
−
μ
j
S
i
\frac{x_j - μ_j}{S_i}
Sixj−μj去替换
x
j
x_j
xj,让新的
x
j
x_j
xj的均值为0,下面解释一下这些符号的意思:
μ
j
μ_j
μj:是所有样本中
x
j
x_j
xj的均值
S
j
S_j
Sj:是特征值
x
j
x_j
xj的取值范围[min, max]的长度,即max - min
其实,在实际编程中,还有几个常用的缩放范围,比如[-3,+3],[- 1 3 , + 1 3 \frac{1}{3}, +\frac{1}{3} 31,+31]…
2.2.多元梯度下降法Ⅱ - 学习率α
在我们梯度下降中变量更新的式子中,用到了学习率α(我们需要在一开始自己设定)
通常,我们会画出 J ( θ ⃗ ) J(\vec{θ}) J(θ)的曲线图,通过曲线的变化情况来判断我们的算法有没有正常工作,一般来讲, J ( θ ⃗ ) J(\vec{θ}) J(θ)的值会随着迭代次数慢慢下降,但是我们也可能会遇到下面的情况:
也就是我们的损失函数的曲线不降反升:这时我们可以尝试换用更小的学习率
为什么呢?
假设我们的cost function是二次函数,我们需要找到最小值,假设一开始我们的点在最小值右侧附近,如果学习率过大,那么该点可能在下一次迭代中会冲过最小值点,到达右侧上端,在后面的迭代中又会继续冲到更上面,这就导致cost值越来越大
还有一种情况,就是cost值一会降,一会升,一会又降,一会又升…
这种情况下,也是尝试降低学习率,但在吴恩老师的课程中没有给出证明,因此,用下面的图总结一下:
事实证明:如果α取得足够小,那么每一次的cost应该都会下降,但是我们也不希望α特别小,否则你的算法将收敛得很慢
3.特征和多项式回归
4. 正规方程(区别于迭代方法的直接解法)
首先,如果我们的cost function:
J
(
θ
⃗
)
J(\vec{θ})
J(θ) =
a
θ
2
+
b
θ
+
c
aθ^2 + bθ + c
aθ2+bθ+c
那么,我们知道要找最小值就是对
θ
θ
θ求导,然后让导数置零
对于复杂的cost function:
J
(
θ
0
,
θ
1
,
⋯
,
θ
n
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
−
y
(
i
)
)
2
J(θ_0, θ_1, \cdots, θ_n) = \frac{1}{2m}\sum_{i = 1}^m(h_θ(x^{(i)} - y^{(i)})^2
J(θ0,θ1,⋯,θn)=2m1i=1∑m(hθ(x(i)−y(i))2
我们也可以分别对不同的
θ
θ
θ求偏导,然后令导数等于0,迭代计算不同
θ
θ
θ的最优值
但是,今天所介绍的正规化方法,是对于多变量线性回归的快捷解法:
首先,我们构造设计矩阵:每一行包含一个不同的样本。每一列对应于不同的特征。
原本以恶搞样本的矩阵是这样的:
x
=
[
x
0
(
i
0
x
1
(
i
)
⋮
x
n
(
i
)
]
x = \begin{bmatrix}x_0^{(i0}\\x_1^{(i)}\\ \vdots \\ x_n^{(i)}\end{bmatrix}
x=⎣⎢⎢⎢⎢⎡x0(i0x1(i)⋮xn(i)⎦⎥⎥⎥⎥⎤
那么,全体样本的X矩阵就是这样的:
X
⃗
=
[
—
—
(
x
(
1
)
)
T
—
—
—
—
(
x
(
2
)
)
T
—
—
⋮
—
—
(
x
(
m
)
)
T
—
—
]
\vec{X} = \begin{bmatrix}——& (x^{(1)})^T & —— \\ ——& (x^{(2)})^T & —— \\ & \vdots \\——& (x^{(m)})^T & ——\end{bmatrix}
X=⎣⎢⎢⎢⎡——————(x(1))T(x(2))T⋮(x(m))T——————⎦⎥⎥⎥⎤
这和我们之前所学习的神经网络的输入矩阵有一点不同
然后,对于y,我们这样构造: Y ⃗ = [ y ( 1 ) y ( 2 ) ⋮ y ( i ) ] \vec{Y} = \begin{bmatrix}y^{(1)}\\y^{(2)}\\ \vdots \\ y^{(i)}\end{bmatrix} Y=⎣⎢⎢⎢⎡y(1)y(2)⋮y(i)⎦⎥⎥⎥⎤
那么, θ θ θ的最优解可以通过下面的式子一步到位地求出来: θ ⃗ = ( X ⃗ T X ⃗ ) − 1 X ⃗ T Y ⃗ \vec{θ} = (\vec{X}^T\vec{X})^{-1}\vec{X}^T\vec{Y} θ=(XTX)−1XTY
下面介绍特征方程和梯度下降各自的优缺点:
Gradient Descent:
优点:即使特征数n非常大的时候也非常有效
缺点:需要自己选择学习率;需要很多次的迭代
Normal Equation:
优点:不需要选择学习率;不需要多次迭代
缺点:需要计算
(
X
⃗
T
X
⃗
)
−
1
(\vec{X}^T\vec{X})^{-1}
(XTX)−1,所以当n很大的时候非常浪费时间
说明:
- 正规方程只适用于线性回归,而梯度下降适用于大部分场合
- 如果使用了正规方程,那么可以不需要做特征缩放
- 如果特征数n是几百个(或者上千个),选择特征方程;如果特征数非常大比如 1 0 6 10^6 106…,那么选择梯度下降法