线性回归中正规方程法介绍

序言

在数学的广袤领域中,线性方程作为最基本的数学模型之一,承载着无数的实际问题和科学理论。而在求解线性方程组的过程中,正规方程(Normal Equation)以其独特的地位和作用,为我们提供了一种高效且准确的解法。正规方程,作为线性最小二乘问题的基石,不仅在数学理论研究中占据重要位置,更在数据分析、机器学习、物理建模等领域发挥着不可替代的作用。接下来,我们将一同探索正规方程的奥秘,领略其在解决实际问题中的独特魅力。

概述

我们知道线性回归模型是一种参数化模型,这意味着模型的行为和预测是由模型中的一组参数或系数决定的。然而,我们使用正规方程(Normal Equation)这样的方法来寻找这些参数,这些参数在我们的数据集上给出最低的误差。

正规方程

  • 正规方程是用最小二乘代价函数求解线性回归的一种解析方法。我们可以使用正规方程直接计算模型的参数,使实际项与预测项之间的平方差之和最小。当数据集很小时,这种方法非常有用。然而,对于一个大的数据集,它可能无法给我们模型的最佳参数。
  • 正规方程,公式如: θ = ( X ⊤ X ) − 1 ⋅ ( X ⊤ y ) \theta = (X^\top X)^{-1} \cdot (X^\top y) θ=(XX)1(Xy)
    • 说明:
      • θ \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=1m[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) y0y1ym
      • 说明:这里忽略 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 y
      • 但是每个剩余值都是平方的。我们不能简单地把上面的表达式平方。作为向量/矩阵的平方不等于它的每个值的平方。
      • 我们要获得平方值,需要将向量/矩阵与其转置相乘。所以,最后推导出的方程是: ( X θ − y ) ⊤ ( X θ − y ) (X\theta-y)^\top (X\theta-y) (y)(y)
      • 因此,成本函数为: J ( θ ) = ( X θ − y ) ⊤ ( X θ − y ) J(\theta) = (X\theta-y)^\top (X\theta-y) J(θ)=(y)(y)
  • 使用正规方程的偏导数来计算 θ \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=θ((y)(y))=2X(y)

    • 我们知道,要找到任何偏导数方程的最佳值,就必须使其等于 0 0 0,即 J ( θ ) = 2 X ⊤ ( X θ − y ) = 0 J(\theta)=2X^\top(X\theta-y)=0 J(θ)=2X(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(y)=02X=2Xy两边乘以2XX的倒数,即θ=XX1Xyθ=(XX)1Xy

正规方程实现案例

# 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.")

总结

正规方程是线性回归问题中一种直接求解最优参数的方法,通过构建并解一个线性方程组来找到最优解,无需迭代。这种方法在小型数据集上较为高效,但计算量大且可能遇到数值稳定性问题,如矩阵不可逆。

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绎岚科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值