吴恩达机器学习笔记(4)—多变量线性回归:正规方程(附代码)

到目前为止,我们都在使用梯度下降算法来求得参数 θ \theta θ 的最优解,但是对于某些线性回归问题,最小二乘法的矩阵解法——正规方程则是更好的解决方案,不用再通过迭代算法,而是可以直接一次性求解 θ \theta θ 的最优解。

一、正规方程

利用多元微分学知识,我们知道对于代价函数:
J ( θ ) = J ( θ 0 , θ 1 , . . . , θ n ) J(\theta) = J(\theta_0, \theta_1, ..., \theta_n) J(θ)=J(θ0,θ1,...,θn)

如果它是连续的,则要求出它的最小值,只需要令各偏导为零:
∂ J ∂ θ j = 0 , j = 0 , 1 , 2 , . . . , n \frac{\partial J}{\partial \theta_j} = 0, j = 0,1,2,...,n θjJ=0,j=0,1,2,...,n

或写作向量形式:
∂ J ∂ θ = 0 ⃗ \frac{\partial J}{\partial \theta} = \vec{0} θJ=0

就能解出令 J ( θ ) J(\theta) J(θ) 最小化的 θ \theta θ 值。如果真的做完微积分并且求解出参数 θ 0 \theta_0 θ0 θ n \theta_n θn ,这个偏微分最终可能很复杂,并且遍历所有的偏微分也很耗费时间。

由此,我们将代价函数转化为有确定解的代数方程组(其方程式数目正好等于未知数的个数),这个方程组就是正规方程。正规方程如下:
θ = ( X T X ) − 1 X T y \theta=(X^{T}X)^{-1}X^{T}y θ=(XTX)1XTy

求解例子:
在这里插入图片描述

运用正规方程方法求解 θ \theta θ 值:
在这里插入图片描述

二、数学推导1

下面我们就对多元线性回归的代价函数进行求解:
J ( θ ) = 1 2 m ∑ i = 1 m ( θ T x ( i ) − y ( i ) ) 2 J(\theta) = \frac{1}{2m} \sum_{i=1}^{m} \left(\theta^{T}x^{(i)} - y^{(i)} \right)^2 J(θ)=2m1i=1m(θTx(i)y(i))2

于是其偏导函数为:
∂ J ∂ θ = 1 m ∑ i = 1 m ( θ T x ( i ) − y ( i ) ) x ( i ) \frac{\partial J}{\partial \theta} = \frac{1}{m} \sum_{i=1}^{m} \left(\theta^{T}x^{(i)} - y^{(i)} \right) x^{(i)} θJ=m1i=1m(θTx(i)y(i))x(i)

要使之为零向量,只能是:
θ T x ( i ) = y ( i ) , i = 1 , 2 , . . . , m \theta^{T}x^{(i)} = y^{(i)},i=1,2,...,m θTx(i)=y(i),i=1,2,...,m

恒成立。写作矩阵为:
θ T X T = y T 或 X θ = y \theta^{T}X^{T} = y^{T} 或 X\theta = y θTXT=yT=y

其中,
X m × ( n + 1 ) = [ 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 ) ] = [ x ( 1 ) T x ( 2 ) T ⋮ x ( m ) T ] , y = [ y ( 1 ) y ( 2 ) ⋮ y ( m ) ] X_{m \times (n+1)} = \begin{bmatrix} x_0^{(1)} & x_1^{(1)} & \cdots & x_n^{(1)}\\ x_0^{(2)} & x_1^{(2)} & \cdots & x_n^{(2)} \\ \vdots & \vdots & \ddots & \vdots\\ x_0^{(m)} & x_1^{(m)} & \cdots & x_n^{(m)} \end{bmatrix} = \begin{bmatrix} x^{(1)^T}\\ x^{(2)^T} \\ \vdots \\ x^{(m)^T} \end{bmatrix},y= \begin{bmatrix} y^{(1)}\\ y^{(2)} \\ \vdots \\ y^{(m)} \end{bmatrix} Xm×(n+1)= x0(1)x0(2)x0(m)x1(1)x1(2)x1(m)xn(1)xn(2)xn(m) = x(1)Tx(2)Tx(m)T ,y= y(1)y(2)y(m)

两边同时乘以 X T X^{T} XT,假设 X T X X^{T}X XTX 可逆,解得:
θ = ( X T X ) − 1 X T y \theta=(X^{T}X)^{-1}X^{T}y θ=(XTX)1XTy

三、数学推导2

前面的推导中,在向量形式的偏导函数中发现了简化条件,将零向量提出来单独求解。下面介绍另一个纯矩阵形式的解法。

首先将代价函数表示为:
J ( θ ) = 1 2 m ( X θ − y ) T ( X θ − y ) = 1 2 ( θ T X T − y T ) ( X θ − y ) = 1 2 ( θ T X T X θ − θ T X T y − y T X θ + y T y ) \begin{aligned} J(\theta) &= \frac{1}{2m} (X\theta - y)^T(X\theta - y) \\ &= \frac{1}{2} (\theta^TX^T - y^T)(X\theta - y) \\ &= \frac{1}{2} (\theta^TX^TX\theta - \theta^TX^Ty - y^TX\theta + y^Ty)\end{aligned} J(θ)=2m1(y)T(y)=21(θTXTyT)(y)=21(θTXTθTXTyyT+yTy)

接下来对 J ( θ ) J(\theta) J(θ) 求偏导,需要用到矩阵的求导法则(证明过程略去不表):

  1. f ( x ) = A x f(x)=Ax f(x)=Ax 时,
    ∂ f ( x ) ∂ x T = ∂ ( A x ) ∂ x T = A \frac{\partial f(x)}{\partial x^T} = \frac{\partial (Ax)}{\partial x^T} = A xTf(x)=xT(Ax)=A
  2. f ( x ) = x T A x f(x)=x^TAx f(x)=xTAx 时,
    ∂ f ( x ) ∂ x = ∂ ( x T A x ) ∂ x = A x + A T x \frac{\partial f(x)}{\partial x} = \frac{\partial (x^TAx)}{\partial x} = Ax+A^Tx xf(x)=x(xTAx)=Ax+ATx
  3. f ( x ) = a T x f(x)=a^Tx f(x)=aTx 时,
    ∂ a T x ∂ x = ∂ x T a ∂ x = a \frac{\partial a^Tx}{\partial x} = \frac{\partial x^Ta}{\partial x} = a xaTx=xxTa=a
  4. f ( x ) = x T A y f(x)=x^TAy f(x)=xTAy 时,
    ∂ x T A y ∂ x = A y \frac{\partial x^TAy}{\partial x} = Ay xxTAy=Ay

分别用法则 2、4、3 求导,得到:
∂ J ( θ ) ∂ θ = 1 2 m ( 2 X T X θ − X T y − ( y T X ) T + 0 ) = 1 2 m ( 2 X T X θ − X T y − X T y + 0 ) = 1 m ( X T X θ − X T y ) \begin{aligned} \frac{\partial J(\theta)}{\partial \theta} &= \frac{1}{2m} (2X^TX\theta - X^Ty - (y^TX)^T + 0) \\ &= \frac{1}{2m} (2X^TX\theta - X^Ty - X^Ty + 0) \\ &= \frac{1}{m} (X^TX\theta - X^Ty)\end{aligned} θJ(θ)=2m1(2XTXTy(yTX)T+0)=2m1(2XTXTyXTy+0)=m1(XTXTy)

令偏导为零,解得:
θ = ( X T X ) − 1 X T y \theta=(X^{T}X)^{-1}X^{T}y θ=(XTX)1XTy

四、梯度下降 vs. 正规方程

观察到在正规方程的结果中, X T X X^{T}X XTX 是一个 ( n + 1 ) × ( n + 1 ) (n+1) \times (n+1) (n+1)×(n+1) 的矩阵,因此直接取逆计算 θ \theta θ 的复杂度是 O ( n 3 ) O(n^3) O(n3) 。如果 n n n 不是很大,这是有效的,但是如果 n n n 达到了 1 0 4 , 1 0 5 10^4,10^5 104,105 或更高,就需要使用梯度下降了。

下面从其他方面对两种算法进行比较:

区别梯度下降正规方程
学习率 α \alpha α需要选择不需要
迭代需要多次迭代一次运算得出
n n n 的取值 n n n 大时也能较好适用 n n n 小于 1 0 4 10^4 104 时还是可以接受的
特征缩放特征取值范围相差大时需要不需要缩放
适用情形适用于各种类型的模型只适用于线性模型

这里提及适用情形,是因为随着问题的深入,算法将越发复杂。例如在分类算法中的逻辑回归等模型,就无法使用正规方程求解。

五、代码实现

下面仍以 Coursera 上的多元线性回归数据集 ex1data2.txt 为例实现,代码非常简洁:

import numpy as np

# load data, data.shape = (47, 3)
data = np.genfromtxt("ex1data2.txt", delimiter=',')
(m, n) = data.shape
X = np.c_[np.ones(m), data[:, :-1]]
y = data[:, -1]

# Normal Equation
theta = np.linalg.inv(X.T @ X) @ X.T @ y
print(theta)

# predict
predict = np.array([1, 1650, 3])
print(predict @ theta)

​很快就计算完了,预测在 ( x 1 = 1650 , x 2 = 3 ) (x_1=1650,x_2=3) (x1=1650,x2=3) 时的房价为 293081.46433489426 293081.46433489426 293081.46433489426。大约相当于 3000 3000 3000 次梯度下降迭代的精度。

六、不可逆情形

前一节的推导基于 X T X X^{T}X XTX 可逆的假设,如若不可逆,我们只需将代码中的 inv() 换成 pinv() 求出伪逆矩阵即可。在 python 中有两个函数可以求解矩阵的逆,一个被称为pinv(),另一个是inv(),这两者之间的差异是技术性的,一个是所谓的伪逆,另一个被称为逆。使用pinv() 函数可以计算出 θ \theta θ 的值,即便矩阵是不可逆的。

通常导致矩阵不可逆的原因可能有:

  • 存在冗余特征(特征之间不相互独立);
  • 特征数 n n n 远大于样本数 m m m(样本数不足以刻画这么多特征)。

解决方法对应为:

  • 删除冗余特征(线性相关特征只保留其一);
  • 削减非必要的特征,或正则化方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值