文章目录
- 4 多变量线性回归(Linear Regression with Multiple Variables)
-
- 4-1 多个特征(Multiple Features)
- 4-2 多变量的梯度下降(Gradient Descent for Multiple Variables)
- 4-3 梯度下降实践1:特征缩放(Gradient Descent in Practice I: Feature Scaling)
- 4-4 梯度下降实践2:学习率(Gradient Descent in Practice II: Learning Rate)
- 4-5 特征与多项式回归(Features and Polynomial Regression)
- 4-6 正规方程(Normal Equation)
- 4-7 正规方程的不可逆性(Normal Equation Non-invertibility)
4 多变量线性回归(Linear Regression with Multiple Variables)
4-1 多个特征(Multiple Features)
符号定义:
- n n n:特征的数量
- x ( i ) x^{(i)} x(i):第 i i i 个训练样本的输入(包含多个特征,因此是个向量)
- x j ( i ) x_j^{(i)} xj(i):第 i i i 个训练样本的特征 j j j 的值
- Hypothesis h: h θ ( x ) = θ 0 + θ 1 x 1 + ⋯ + θ n x n = θ 0 + ∑ i = 1 n θ i x n h_\theta(x)=\theta_0+\theta_1 x_1+\dots+\theta_n x_n=\theta_0+\displaystyle\sum_{i=1}^n \theta_i x_n hθ(x)=θ0+θ1x1+⋯+θnxn=θ0+i=1∑nθixn
- 简便起见,令 x 0 = 1 x_0=1 x0=1,有: x = [ x 0 x 1 ⋮ x n ] ∈ R n + 1 x=\begin{bmatrix} x_0 \\ x_1 \\ \vdots \\ x_n \end{bmatrix}\in\R^{n+1} x=⎣⎢⎢⎢⎡x0x1⋮xn⎦⎥⎥⎥⎤∈Rn+1, θ = [ θ 0 θ 1 ⋮ θ n ] ∈ R n + 1 \theta=\begin{bmatrix} \theta_0 \\ \theta_1 \\ \vdots \\ \theta_n \end{bmatrix}\in\R^{n+1} θ=⎣⎢⎢⎢⎡θ0θ1⋮θn⎦⎥⎥⎥⎤∈Rn+1,则: h θ ( x ) = θ T x h_\theta(x)=\theta^Tx hθ(x)=θTx
多变量线性回归,也叫多元线性回归(multivariate linear regression)
4-2 多变量的梯度下降(Gradient Descent for Multiple Variables)
代价函数:
J ( θ ) = J ( θ 0 , θ 1 , … , θ n ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta)=J(\theta_0,\theta_1,\dots,\theta_n)=\frac{1}{2m}\displaystyle\sum_{i=1}^m(h_{\theta}(x^{(i)})-y^{(i)})^2 J(θ)=J(θ0,θ1,…,θn)=2m1i=1∑m(hθ(x(i))−y(i))2
梯度下降算法:
repeat until convergence {
θ j ≔ θ j − α ∂ ∂ θ j J ( θ 0 , θ 1 , … , θ n ) \theta_j\coloneqq\theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\theta_0,\theta_1,\dots,\theta_n) θj:=θj−α∂θj∂J(θ0,θ1,…,θn) (simultaneously update for every j = 0 , 1 , … , n j=0,1,\dots,n j=0,1,…,n)
}
参数更新公式:
θ j ≔ θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x j ( i ) \theta_j\coloneqq\theta_j-\alpha\frac{1}{m}\displaystyle\sum_{i=1}^m(h_{\theta}(x^{(i)})-y^{(i)})\cdot x_j^{(i)} θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))⋅xj(i)
(simultaneously update θ j \theta_j θj for j = 0 , 1 , … , n j=0,1,\dots,n j=0,1,…,n)
4-3 梯度下降实践1:特征缩放(Gradient Descent in Practice I: Feature Scaling)
为了使梯度下降快速收敛,应该确保各个特征具有相似的规模(similar scale),因此要进行特征缩放
- 通常, 将每个特征的取值限制在 − 1 ≤ x i ≤ 1 -1\leq x_i\leq1 −1≤xi≤1的范围内(或较为接近的范围内)
均值归一化(mean normalization):在进行特征缩放时,将 x i x_i xi 替换为 x i − μ i x_i-\mu i xi−μi,使得特征的均值近似于0
- 不要对 x 0 = 1 x_0=1 x0=1 进行归一化
- 更通常的变换: x i ← x i − μ i s i x_i\gets\frac{x_i-\mu i}{s_i} xi←sixi−μi,其中 μ i \mu i μi 为训练样本中 x i x_i xi 的均值, s i s_i si 为 x i x_i xi 的范围(最大值与最小值之差,即 max x i − min x i \max x_i-\min x_i maxxi−minxi)或 x i x_i xi 的标准差
4-4 梯度下降实践2:学习率(Gradient Descent in Practice II: Learning Rate)
1.如何确保梯度下降正常工作?
- 画出 J ( θ ) J(\theta) J(θ) 随迭代次数变化的曲线:若 J ( θ ) J(\theta) J(θ) 随迭代次数一直减少,则梯度下降运行正常;若 J ( θ ) J(\theta) J(θ) 的下降趋于平缓,则梯度下降接近收敛
- *不同问题的梯度下降收敛速度不同
- 【常见错误】若 J ( θ ) J(\theta) J(θ) 的曲线保持上升(或循环上升下降),则可能是越过了最低点,需要一个较小的学习率(排除程序错误)
- 自动收敛测试:若 J ( θ ) < ϵ J(\theta)<\epsilon J(θ)<ϵ( ϵ \epsilon ϵ 很小,如 1 0 − 3 10^{-3} 10−3),则可认为已经收敛
- *实际中, ϵ \epsilon ϵ 的值较难确定
2.如何选择学习率?
- 若学习率 α \alpha α 足够小,那么每次迭代 J ( θ ) J(\theta) J(θ) 都会下降
- 但是若 α \alpha α 太小,梯度下降可能收敛很慢
太小的学习率导致收敛过慢,太大的学习率导致 J ( θ ) J(\theta) J(θ) 不随着迭代次数下降,甚至不收敛
实践中,可以尝试一系列的学习率取值,以选取能使 J ( θ ) J(\theta) J(θ) 快速下降的学习率,如:0.001,0.003,0.01,0.03,0.1,0.3,1……(3倍间隔)
4-5 特征与多项式回归(Features and Polynomial Regression)
不一定要把原始数据直接当作特征,有时构造新的特征,能够得到更好的模型
可以将多项式回归看作多元线性回归进行建模和求解
- 例:对于三次函数 h θ ( x ) = θ 0 + θ 1 x + θ 1 x 2 + θ 3 x 3 h_\theta(x)=\theta_0+\theta_1 x+\theta_1 x^2+\theta_3 x^3 hθ(x)=θ0+θ1x+θ1x2+θ3x3,令 x 1 = x x_1=x x1=x, x 2 = x 2 x_2=x^2 x2=x2, x 3 = x 3 x_3=x^3 x3=x3,则可以看作是多元线性回归,即: h θ ( x ) = θ 0 + θ 1 x 1 + θ 1 x 2 + θ 3 x 3 h_\theta(x)=\theta_0+\theta_1 x_1+\theta_1 x_2+\theta_3 x_3 hθ(x)=θ0+θ1x1+θ1x2+θ3x3
- 注意:使用多元线性回归拟合多项式回归时,注意各个特征的取值范围因为次方的不同而存在较大差异,需进行特征缩放
4-6 正规方程(Normal Equation)
正规方程提供了一种 θ \theta θ 的解析解法,不需要迭代,即可取得 J ( θ ) J(\theta) J(θ) 的最小值
- 当 θ ∈ R \theta\in\R θ∈R(只有一个参数, θ \theta θ 为实数)时, J ( θ ) J(\theta) J(θ) 是关于 θ \theta θ 的二次函数,只需对 J ( θ ) J(\theta) J(θ) 求导,令 d d θ J ( θ ) = 0 \frac{\mathrm{d}}{\mathrm{d}\theta}J(\theta)=0 dθdJ(θ)=0,即可求解
- 当 θ ∈ R n + 1 \theta\in\R^{n+1} θ∈Rn+1(多个参数, θ \theta θ 为向量)时,对 J ( θ ) J(\theta) J(θ) 求偏导,令 ∂ ∂ θ j J ( θ ) = 0 \frac{\partial}{\partial\theta_j}J(\theta)=0 ∂θj∂J(θ)=0 (for every j),依次求解每个参数的值
正规方程求解参数方法:
对于 m m m 个包含 n n n 个特征的训练样本,记: x ( i ) = [ x 0 ( i ) x 1 ( i ) ⋮ x n ( i ) ] ∈ R n + 1 x^{(i)}=\begin{bmatrix} x_0^{(i)} \\ x_1^{(i)} \\ \vdots \\ x_n^{(i)} \end{bmatrix}\in\R^{n+1} x(i)=⎣⎢⎢⎢⎢⎡x0(i)x1(i)⋮xn(i)⎦⎥⎥⎥⎥⎤∈Rn+1, y = [ y ( 1 ) y ( 2 ) ⋮ y ( m ) ] ∈ R m y=\begin{bmatrix} y^{(1)} \\ y^{(2)} \\ \vdots \\ y^{(m)} \end{bmatrix}\in\R^{m} y=⎣⎢⎢⎢⎡y(1)y(2)⋮y(m)⎦⎥⎥⎥⎤∈Rm,
设计矩阵(the design matrix)为: X = [ ( x ( 1 ) ) T ( x ( 2 ) ) T ⋮ ( x ( m ) ) T ] = [ x 0 ( 1 ) x 1 ( 1 ) … x n ( 1 ) x 0 ( 2 ) x 1 ( 2 ) … x n ( 2 ) ⋮ ⋮ ⋮ x 0 ( m ) x 1 ( m ) … x n ( m ) ] ∈ R m × ( n + 1 ) X=\begin{bmatrix} (x^{(1)})^T \\ (x^{(2)})^T \\ \vdots \\ (x^{(m)})^T \end{bmatrix}=\begin{bmatrix} x_0^{(1)} & x_1^{(1)} & \dots & x_n^{(1)} \\ x_0^{(2)} & x_1^{(2)} & \dots & x_n^{(2)} \\ \vdots & \vdots & & \vdots \\ x_0^{(m)} & x_1^{(m)} & \dots & x_n^{(m)} \end{bmatrix}\in\R^{m\times(n+1)} X=⎣⎢⎢⎢⎡(x(1))T(x(2))T⋮(x(m))T⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡x0(1)x0(2)⋮x0(m)x1(1)x1(2)⋮x1(m)………xn(1)xn(2)⋮xn(m)⎦⎥⎥⎥⎥⎤∈Rm×(n+1),
有:
θ = ( X T X ) − 1 X T y \theta=(X^TX)^{-1}X^Ty θ=(XTX)−1XTy
对应的 Octave 语句:pinv(X'*X)*X'*y
*使用正规方程法进行求解时,不需要进行特征缩放
梯度下降和正规方程的比较:
|
梯度下降 |
正规方程 |
优点 |
适用于多种模型 特征数量 n n n 很大(如上万)时效果依然可以正常运行 |
不需要选择学习率 一次求解,不需要多次迭代 |
缺点 |
需要选择学习率 需要多次迭代 |
适用模型受限 需要计算 ( X T X ) − 1 (X^TX)^{-1} (XTX)−1(复杂度接近O( n 3 n^3 n3)), n n n 较大时非常慢 |
总结:对于线性回归,特征数量较少时用正规方程,较多时用梯度下降
4-7 正规方程的不可逆性(Normal Equation Non-invertibility)
如果 X T X X^TX XTX 不可逆(奇异矩阵),如何求解 θ = ( X T X ) − 1 X T y \theta=(X^TX)^{-1}X^Ty θ=(XTX)−1XTy?
- 这种情况较为罕见,如果发生的话,有两种原因
- 冗余特征/线性相关(redundant features / linearly dependent):如 x 1 = 2 x 2 x_1=2x_2 x1=2x2
- 特征数量过多(too many features):如 m ≤ n m\leq n m≤n,即特征数多于训练样本数
- 解决:删除一些特征,或使用正则化(regularization)技术
- 在 Octave 中,使用
pinv()
而非inv()
函数会得到正确的结果,即使是在 X T X X^TX XTX 不可逆的情况下
pinv()
:pseudo-inverse;inv()
:inverse,引入了数值计算