机器学习(三)- normal equation

本文介绍了线性回归中正规方程与梯度下降两种求解方法的区别与应用场景。正规方程能够一步求解参数,适用于特征数量不多的情况;而梯度下降则适合于大数据集且特征数量庞大的情形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

normal equation

对于线性规划问题来说,除了使用梯度下降,我们还是可以使用normal equation(正规方程),非常简单的函数完成一步求解,不需要反复迭代:
θ=(XTX)−1XTy\theta=(X^TX)^{-1}X^Tyθ=(XTX)1XTy
接下来举个例子就一目了然了。
这里写图片描述
既然有如此简洁的方法,相比之下梯度下降算法一下就落于下风。
当然对于这两种方法,各有各的优势和适用场景。

Gradient DescentNormal Equation
需要手动设置 α\alphaα不需要设置 α\alphaα
需要反复迭代不需要迭代
O(kn2)O(kn^2)O(kn2)O(n3)O(n^3)O(n3) 需要计算 (XTX)−1(X^TX)^{-1}(XTX)1
xxx很大的时候,速度优于normal equationxxx很大的时候,速度就会变得缓慢

Andrew Ng教授指出,一般当n大于10000才需要考虑摒弃正规方程,在此之前正规方程的用时是少于梯度下降的。
但是对于classification,比如逻辑回归或者更复杂的学习算法,正规方程并不适用,我们还是不得不选择使用梯度下降。

Noninvertibility

对于矩阵 XTXX^TXXTX 来说,如果它是奇异矩阵或者退化矩阵,那么它是不可逆的,这将导致无法求得(XTX)−1(X^TX)^{-1}(XTX)1。在这里对应了两种情况:
第一种就是对应了下图中的第一点,选取了冗余的特征然后导致矩阵存在线性相关的列,导致矩阵不满秩。
第二种对应下图中的第二点,对于矩阵 AAA 来说,它的row小于column,这样就说明我们选取了太多的特征,导致我们没有足够多的sample去fit这些特征,这就好比我们在求解线性方程时,我们的方程数比我们所要求的未知数还有少,导致我们有无穷多解,同理,sample数小于特征数,我们很难很好的fit这些特征。
这里写图片描述
对于以上的情况,我们可以先检查是否存在冗余的特征量,如果存在就删除冗余特征,然后再检查我们是否存在过多的特征,如果存在就删除一些或者使用正则化手段。


### 关于线性回归的正规方程解 在线性回归问题中,正规方程是一种解析方法,用于直接计算最优参数 \( \theta \),而无需迭代优化。这种方法通过使代价函数 \( J(\theta) \) 的偏导数等于零来获得闭合形式的解决方案。 #### 一、正规方程的核心思想 正规方程的目标是最小化线性回归中的平方误差损失函数 \( J(\theta) \)[^1]。假设输入数据矩阵为 \( X \in \mathbb{R}^{m \times (n+1)} \),其中每一行代表一个训练样本,目标向量为 \( y \in \mathbb{R}^m \),则可以通过以下公式得到最佳参数: \[ \theta = (X^T X)^{-1} X^T y \] 此公式的推导基于对损失函数 \( J(\theta) \) 进行最小化的条件,即令其梯度为零[^2]。 --- #### 二、正规方程的推导过程 以下是正规方程的具体推导步骤: 1. **定义损失函数** 多元线性回归的损失函数通常被定义为: \[ J(\theta) = \frac{1}{2m} \sum_{i=1}^m (\hat{y}^{(i)} - y^{(i)})^2 \] 其中 \( \hat{y}^{(i)} = h_\theta(x^{(i)}) = \theta^T x^{(i)} \) 是预测值,\( y^{(i)} \) 是真实值[^4]。 2. **转换为矩阵形式** 将上述表达式改写成矩阵形式以便简化运算: \[ J(\theta) = \frac{1}{2m} \| X\theta - y \|^2 \] 其中 \( \| a \|^2 = a^T a \) 表示向量 \( a \) 的欧几里得范数平方。 3. **求导并设置为零** 对 \( J(\theta) \) 关于 \( \theta \) 求导,并将其设为零以寻找极小值点: \[ \nabla_\theta J(\theta) = \frac{1}{m} X^T(X\theta - y) = 0 \] 解该方程可得: \[ X^T X \theta = X^T y \] 4. **求解参数 \( \theta \)** 如果 \( X^T X \) 可逆,则可以直接得出: \[ \theta = (X^T X)^{-1} X^T y \][^3] --- #### 、Python 实现代码 下面是使用 Python 和 NumPy 库实现正规方程的方法: ```python import numpy as np def normal_equation(X, y): """ 使用正规方程法求解线性回归参数 theta 参数: X -- 输入特征矩阵 (形状: m x (n+1)) y -- 输出标签列向量 (形状: m x 1) 返回: theta -- 计算出的最佳参数 (形状: (n+1) x 1) """ # 添加截距项到 X 中 ones_column = np.ones((X.shape[0], 1)) X_b = np.hstack([ones_column, X]) # 计算 theta try: theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y) except np.linalg.LinAlgError: raise ValueError("矩阵不可逆,请检查是否存在多重共线性或其他问题") return theta # 测试数据 X = np.array([[1], [2], [3]]) y = np.array([[1], [2], [3]]) theta = normal_equation(X, y) print("Theta:", theta) ``` --- #### 四、注意事项 1. **矩阵不可逆的情况** 若 \( X^T X \) 不可逆,可能是因为特征间存在完全线性依赖关系或者样本数量少于特征数量。此时可通过删除冗余特征或采用正则化技术解决[^2]。 2. **适用范围** 正规方程适用于中小型数据集,因为当特征维度较高时,计算 \( (X^T X)^{-1} \) 的复杂度会显著增加。对于大规模数据集,推荐使用梯度下降等数值优化方法。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值