序言
在数学的广袤领域中,线性方程作为最基本的数学模型之一,承载着无数的实际问题和科学理论。而在求解线性方程组的过程中,正规方程(Normal Equation)以其独特的地位和作用,为我们提供了一种高效且准确的解法。正规方程,作为线性最小二乘问题的基石,不仅在数学理论研究中占据重要位置,更在数据分析、机器学习、物理建模等领域发挥着不可替代的作用。接下来,我们将一同探索正规方程的奥秘,领略其在解决实际问题中的独特魅力。
概述
我们知道线性回归模型是一种参数化模型,这意味着模型的行为和预测是由模型中的一组参数或系数决定的。然而,我们使用正规方程(Normal Equation)这样的方法来寻找这些参数,这些参数在我们的数据集上给出最低的误差。
正规方程
- 正规方程是用最小二乘代价函数求解线性回归的一种解析方法。我们可以使用正规方程直接计算模型的参数,使实际项与预测项之间的平方差之和最小。当数据集很小时,这种方法非常有用。然而,对于一个大的数据集,它可能无法给我们模型的最佳参数。
- 正规方程,公式如:
θ
=
(
X
⊤
X
)
−
1
⋅
(
X
⊤
y
)
\theta = (X^\top X)^{-1} \cdot (X^\top y)
θ=(X⊤X)−1⋅(X⊤y)
- 说明:
- θ \theta θ:最佳的假设参数
- X X X:特征矩阵,即输入每个实例的特征值
- y y y:目标向量,即每个实例的输出值
- 说明:
- 方程式背后的数学:
- 给定假设函数:
h
(
θ
)
=
θ
0
x
0
+
θ
1
x
1
+
⋯
+
θ
n
x
n
h(\theta)=\theta_0x_0+\theta_1x_1+\dots+\theta_nx_n
h(θ)=θ0x0+θ1x1+⋯+θnxn
- 说明:
- n n n:特征数量
- x 0 x_0 x0:1(常数,用于向量乘法)
- 说明:
- 上式是 θ \theta θ和 x x x值之间的点积。因此,为了方便求解,我们可以将其写成: h ( θ ) = θ ⊤ X h(\theta)=\theta^\top X h(θ)=θ⊤X
- 线性回归的目的是最小化成本函数:
J
(
θ
)
=
1
2
m
∑
i
=
1
m
[
h
θ
(
x
(
i
)
)
−
y
(
i
)
]
2
J(\theta)=\displaystyle\frac{1}{2m}\sum\limits_{i=1}^m [h_{\theta}(x^{(i)})-y^{(i)}]^2
J(θ)=2m1i=1∑m[hθ(x(i))−y(i)]2
- 说明:
- x ( i ) x^{(i)} x(i):第 i i i个训练样本的输入值
- m m m:训练实例的数量
- y ( i ) y^{(i)} y(i):第 i i i个训练样本的输出值
- 说明:
- 以向量形式来表示成本函数:
∣
h
θ
(
x
0
)
h
θ
(
x
1
)
⋮
h
θ
(
x
m
)
∣
−
∣
y
0
y
1
⋮
y
m
∣
\left|\begin{array}{c} h_{\theta}(x^0)\\h_{\theta}(x^1)\\ \vdots\\h_{\theta}(x^m) \end{array}\right| - \left|\begin{array}{c} y^0\\y^1\\\vdots\\y^m \end{array}\right|
hθ(x0)hθ(x1)⋮hθ(xm)
−
y0y1⋮ym
- 说明:这里忽略 1 2 m \displaystyle\frac{1}{2m} 2m1,因为它不会产生任何影响。在计算梯度下降时,使用它是为了数学上的方便。但这里不再需要了。
- 上式解释,如下:
∣ θ ⊤ ( x 0 ) θ ⊤ ( x 1 ) ⋮ θ ⊤ ( x m ) ∣ − y \left|\begin{array}{c} \theta^\top(x^0)\\ \theta^\top(x^1)\\ \vdots\\ \theta^\top(x^m) \end{array}\right| - y θ⊤(x0)θ⊤(x1)⋮θ⊤(xm) −y ∣ θ 0 ( x 0 0 ) + θ 1 ( x 1 0 ) + ⋯ + θ n ( x n 0 ) θ 0 ( x 0 1 ) + θ 1 ( x 1 1 ) + ⋯ + θ n ( x n 1 ) ⋮ θ 0 ( x 0 m ) + θ 1 ( x 1 m ) + ⋯ + θ n ( x n m ) ∣ − y \qquad\quad\left|\begin{array}{c} \theta_0(x_0^0)+\theta_1(x_1^0)+\dots+\theta_n(x_n^0)\\ \theta_0(x_0^1)+\theta_1(x_1^1)+\dots+\theta_n(x_n^1)\\ \vdots\\ \theta_0(x_0^m)+\theta_1(x_1^m)+\dots+\theta_n(x_n^m) \end{array}\right| - y θ0(x00)+θ1(x10)+⋯+θn(xn0)θ0(x01)+θ1(x11)+⋯+θn(xn1)⋮θ0(x0m)+θ1(x1m)+⋯+θn(xnm) −y- 说明: x n m x_n^m xnm:第 m m m个训练样本的第 n n n个特征值
- 可以进一步简化为:
X
θ
−
y
X\theta - y
Xθ−y
- 但是每个剩余值都是平方的。我们不能简单地把上面的表达式平方。作为向量/矩阵的平方不等于它的每个值的平方。
- 我们要获得平方值,需要将向量/矩阵与其转置相乘。所以,最后推导出的方程是: ( X θ − y ) ⊤ ( X θ − y ) (X\theta-y)^\top (X\theta-y) (Xθ−y)⊤(Xθ−y)。
- 因此,成本函数为: J ( θ ) = ( X θ − y ) ⊤ ( X θ − y ) J(\theta) = (X\theta-y)^\top (X\theta-y) J(θ)=(Xθ−y)⊤(Xθ−y)
- 给定假设函数:
h
(
θ
)
=
θ
0
x
0
+
θ
1
x
1
+
⋯
+
θ
n
x
n
h(\theta)=\theta_0x_0+\theta_1x_1+\dots+\theta_nx_n
h(θ)=θ0x0+θ1x1+⋯+θnxn
- 使用正规方程的偏导数来计算
θ
\theta
θ的值
-
我们将取成本函数关于参数 θ \theta θ的偏导数(即将除参数 θ \theta θ外的所有变量看作常数)。
{ ∂ J ∂ θ = ∂ ∂ θ ( ( X θ − y ) ⊤ ( X θ − y ) ) = 2 X ⊤ ( X θ − y ) \begin{cases}\begin{array}{l} \frac{\partial{J}}{\partial{\theta}}=\frac{\partial}{\partial{\theta}}\left((X\theta-y)^\top(X\theta-y)\right)\\\\ \quad\quad= 2X^\top(X\theta-y) \end{array}\end{cases} ⎩ ⎨ ⎧∂θ∂J=∂θ∂((Xθ−y)⊤(Xθ−y))=2X⊤(Xθ−y) -
我们知道,要找到任何偏导数方程的最佳值,就必须使其等于 0 0 0,即 J ( θ ) = 2 X ⊤ ( X θ − y ) = 0 J(\theta)=2X^\top(X\theta-y)=0 J(θ)=2X⊤(Xθ−y)=0。
{ 2 X ⊤ ( X θ − y ) = 0 ⇒ 2 X ⊤ X θ = 2 X ⊤ y 两边乘以 2 X ⊤ X 的倒数,即 ⇒ θ = 1 X ⊤ X X ⊤ y ⇒ θ = ( X ⊤ X ) − 1 X ⊤ y \begin{cases}\begin{array}{l} 2X^\top(X\theta-y)=0\\\\ \Rightarrow 2X^\top X\theta=2X^\top y\\\\ 两边乘以2X^\top X的倒数,即\\\\ \Rightarrow \theta = \frac{1}{X^\top X} X^\top y\\\\ \Rightarrow \theta=(X^\top X)^{-1}X^\top y \end{array}\end{cases} ⎩ ⎨ ⎧2X⊤(Xθ−y)=0⇒2X⊤Xθ=2X⊤y两边乘以2X⊤X的倒数,即⇒θ=X⊤X1X⊤y⇒θ=(X⊤X)−1X⊤y
-
正规方程实现案例
# coding: utf-8
'''
线性回归中正规方程法介绍
下面代码将用于生成一个简单的线性回归数据集,并使用正规方程法计算线性回归系数。
首先,通过调用make_regression函数生成了一个包含100个样本和1个特征的线性回归数据集,其中有一个相关信息,噪声为10,随机状态为10。
然后,定义了linear_regression_normal_equation函数,该函数使用正规方程法计算线性回归系数。
函数接受独立变量矩阵X和依赖变量向量y作为输入,并返回回归系数向量theta。具体步骤如下:
步骤1:计算X的转置。
步骤2:计算X转置与X的点积,存储在X_transpose_X中。
步骤3:计算X转置与y的点积,存储在X_transpose_y中。
步骤4:使用线性代数求解器解出theta,即X_transpose_X的逆乘以X_transpose_y。
步骤5:如果X_transpose_X是奇异矩阵,则返回None。
接下来,为了在回归模型中包含截距项,向X中添加一列全为1的向量,并将结果存储在X_with_intercept中。
最后,调用linear_regression_normal_equation函数计算回归系数,并根据返回值是否为None打印出回归系数或错误消息。
'''
import numpy as np
from sklearn.datasets import make_regression
'''
该函数用于生成一个回归问题的样本数据集。其中:
n_samples指定样本数量为100;
n_features指定特征数量为1;
n_informative指定有效特征数量为1,即只有一个特征对目标变量有影响;
noise指定噪声水平为10,表示目标变量中添加的高斯噪声的均值为0,标准差为10;
random_state指定随机种子数为10,以确保每次运行生成相同的数据集。
函数返回生成的样本数据集,其中X为特征矩阵,y为目标变量向量。
'''
X, y = make_regression(n_samples=100, n_features=1,
n_informative=1, noise=10, random_state=10)
def linear_regression_normal_equation(X, y):
"""
使用正规方程(正态方程)方法计算线性回归系数。
参数:
X -- 形状为 (n_samples, n_features) 的自变量矩阵(independent variable matrix)
y -- 形状为 (n_samples,) 的因变量向量(dependent variable vector)
返回:
theta -- 形状为(n_features,)的回归系数
"""
# 计算矩阵X的转置
X_transpose = np.transpose(X)
# 计算矩阵X转置和矩阵X的点积
X_transpose_X = np.dot(X_transpose, X)
# 计算矩阵X转置和向量y的点积
X_transpose_y = np.dot(X_transpose, y)
try:
# 使用线性代数求解器求解θ
theta = np.linalg.solve(X_transpose_X, X_transpose_y)
return theta
except np.linalg.LinAlgError:
# 如果X_transpose_X是单数,则返回None
return None
'''
该函数用于在特征矩阵X的前面添加一列值为1的常数列,用于构建包含截距项的多元线性回归模型。
具体实现中,使用np.ones函数生成与X行数相同、列数为1的常数矩阵,
再使用np.c_函数将常数矩阵与X进行列拼接,
得到包含截距项的特征矩阵X_with_intercept。
'''
X_with_intercept = np.c_[np.ones((X.shape[0], 1)), X]
'''
该函数使用线性回归的正规方程方法,计算给定带截距项的特征矩阵X_with_intercept和目标变量y的最优参数theta。
正规方程通过求解最小二乘问题得到参数估计,避免了迭代优化过程。函数返回参数theta,用于预测新数据。
'''
theta = linear_regression_normal_equation(X_with_intercept, y)
if theta is not None:
# 如果计算成功,打印系数
print(theta)
else:
# 如果由于奇异矩阵导致计算失败,则打印错误消息
print("Unable to compute theta. The matrix X_transpose_X is singular.")
总结
正规方程是线性回归问题中一种直接求解最优参数的方法,通过构建并解一个线性方程组来找到最优解,无需迭代。这种方法在小型数据集上较为高效,但计算量大且可能遇到数值稳定性问题,如矩阵不可逆。