2198 字
11 分钟
多元线性回归算法

多元线性回归 (Multiple Linear Regression)#

1. 从一元到多元#

  • 类比:预测房价时,不只看面积(一元),还要综合考虑楼层、地段、房龄等多个因素——这就是多元线性回归。它试图在多维空间中找到一个超平面1来拟合数据。
  • 模型形式y^=w1x1+w2x2++wnxn+b\hat{y} = w_1x_1 + w_2x_2 + \cdots + w_nx_n + b2
  • 向量形式y^=wTx+b\hat{y} = \mathbf{w}^T\mathbf{x} + b(其中 w\mathbf{w} 是权重向量,x\mathbf{x} 是特征向量,均为列向量)

2. 损失函数 (Loss Function)#

使用均方误差 (MSE) 作为损失函数,衡量所有样本预测值与真实值差值的平方和的平均值:

L(w,b)=1mi=1m(y^(i)y(i))2L(\mathbf{w}, b) = \frac{1}{m}\sum_{i=1}^{m}(\hat{y}^{(i)} - y^{(i)})^2

  • 目标:找到使 LL 最小的 w\mathbf{w}bb

3. 求解方法#

3.1 正规方程(解析解 Normal Equation)#

若将偏置项 bb 并入参数向量,令 X~=[1,X]\tilde{\mathbf{X}} = [\mathbf{1}, \mathbf{X}]3(在特征矩阵前加一列全为1的列),令 θ=[b,wT]T\boldsymbol{\theta} = [b, \mathbf{w}^T]^T,则可以直接通过矩阵运算求得最优解:

θ=(X~TX~)1X~Ty\boldsymbol{\theta} = (\tilde{\mathbf{X}}^T\tilde{\mathbf{X}})^{-1}\tilde{\mathbf{X}}^T\mathbf{y}

  • 优点:数学上一分为二,一步到位求出全局最优解,无需设置学习率,无需迭代。

  • 缺点:特征数量 nn 很大时,计算矩阵逆45的时间复杂度约为 O(n3)O(n^3),极度消耗算力(通常 n>10000n > 10000 时不建议使用)。

  • 工程注意:若 X~TX~\tilde{\mathbf{X}}^T\tilde{\mathbf{X}} 不可逆(如特征存在完全共线性6,或样本量少于特征数),工程上常通过计算伪逆 (Pseudo-inverse)7 或引入正则化 (如岭回归)8 来解决。

3.2 梯度下降(迭代解 Gradient Descent)#

  • 适用场景:当特征维度极高、数据量极大,正规方程算不动时使用。

  • 原理:初始化参数后,沿着损失函数梯度的反方向逐步迭代更新参数,直到收敛。需要谨慎选择学习率 (Learning Rate)9,且强烈建议在训练前对特征进行标准化/归一化101112处理。

4. 核心评估指标:为什么需要 Adjusted R2R^2#

在多元回归中,如果我们不断加入新的特征,即使是毫无关系的垃圾特征(比如预测房价时加入了“房主抛硬币的结果”),普通的 R2R^2 也只会增加或保持不变,这会带来虚假的“拟合变好”的错觉。

  • 校正决定系数 (Adjusted R2R^2) 引入了对特征数量的惩罚项:

    Adjusted R2=1(1R2)(m1)mn1Adjusted\ R^2 = 1 - \frac{(1 - R^2)(m - 1)}{m - n - 1}

    (其中 mm 是样本量,nn 是特征数量)

  • 作用:只有当新加入的特征对模型的提升大于纯概率带来的提升时,Adjusted R2R^2 才会增加。因此,在多元回归中,必须参考 Adjusted R2R^2 而不仅是 R2R^2

5. 线性回归的四大基本假设 (LINE)#

进行严谨的多元回归分析时,数据需要满足以下假设:

  1. Linearity(线性):特征与目标变量之间存在线性关系。

  2. Independence(独立性):样本之间相互独立,残差之间不相关。

  3. Normality(正态性):残差服从正态分布13

  4. Equal Variance(等方差性/同方差性):残差1415的方差保持恒定,不随特征值的变化而变化。

6. 注意事项与常见问题排查#

问题症状解决方案
多重共线性 (特征间高度相关,如“面积”与“卧室数”)模型权重方差大、极不稳定,甚至出现符号与常识相反。1. 采用岭回归 (L2 正则化)
2. 删除冗余特征 (如用 PCA 降维)
特征量纲不一 (如“面积”是 100,“房龄”是 5)梯度下降呈“之字形”震荡,收敛极慢。对特征进行 归一化 (Min-Max)标准化 (Z-score)
非线性关系 (实际关系是曲线)散点图不呈直线,残差分布有明显的规律(非随机散落)。进行升维操作(如引入多项式特征 x2,x1x2x^2, x_1x_2 等),转化为线性可解问题。

7. Python 示例 (Scikit-Learn)#

from sklearn.linear_model import LinearRegression
import numpy as np
# 训练数据:X = [面积(m²), 楼层, 房龄(年)]
X = np.array([
[80, 5, 3],
[120, 10, 8],
[60, 2, 1],
[150, 15, 10]
])
y = np.array([300, 500, 200, 600]) # 房价(万元)
model = LinearRegression()
model.fit(X, y)
print("特征权重 (w1, w2, w3):", model.coef_)
print("截距项 (b):", model.intercept_)
print("新数据预测:", model.predict([[100, 7, 5]]))

Footnotes#

  1. 如果你的特征有 4 个、100 个(比如看房子的面积、楼层、朝向、学区等 100 个指标),这是 101 维空间,人类的脑子已经想象不出来了。数学家就统称这种高维空间里用来切分数据的“平整界面”叫做超平面

  2. 这里加粗的 w\mathbf{w}x\mathbf{x} 代表它们不是单个数字,而是一串数字(叫做向量)。右上角的 TT 叫做“转置”(就是把竖着写的一串数字横过来)。

  3. 千万别被这堆符号吓到。你只需要知道,普通的方程是 3x=63x = 6,求 xx 就是用 6÷3=26 \div 3 = 2。但在多元回归里,我们面对的是一个巨大的 Excel 表格(这就是矩阵 X\mathbf{X})。

  4. 矩阵是不能直接做除法的,所以数学家发明了矩阵的**“逆”**(右上角的 1-1

  5. 乘以一个矩阵的逆,就相当于在做“除法”。

  6. 详细解释:刚才讲过“多重共线性”是信息重复。完全共线性是它的极端致命版本。

    • 比如你预测房价,特征A是“房屋面积(平方米)”,特征B是“房屋面积(平方分米)”。

    • 在数学上,特征B永远等于特征A乘以100(即 B=100×AB = 100 \times A),两者形成了100%的完美线性关系。

    • 为什么致命? 当计算机去解方程(求逆矩阵)寻找最优权重时,它会彻底精神分裂。因为它可以把所有权重都给A(比如A的权重是10000,B是0),也可以都给B(A是0,B是100),甚至一人一半。因为有无限多种可能的正确答案,计算机的底层数学公式就会直接崩溃报错(矩阵奇异)。

  7. 当矩阵是“奇异”的(分母变成了 0 算不下去时),计算机科学家写了一个算法,找一个“最接近、最合理的替代品”来完成这步除法,保证程序不会报错崩溃。

    • 大白话翻译“给模型套上紧箍咒,防止它走极端”
    • 有时候模型为了强行拿满分(过拟合),会给出非常夸张的权重,比如“面积每多1平米,房价加1个亿,同时楼层每高1层,房价减1个亿”。
    • L2 正则化就是给损失函数加上一条规则:“权重数值越庞大,扣分越狠”。这样就逼着模型老老实实地给出温和、符合常理的权重。
  8. 详细解释:在刚才笔记的“梯度下降”算法中,计算机就像一个被蒙上眼睛的人,被丢在一个山坡上。它的目标是走到“谷底”(也就是误差最小的地方)。

    • 每次它都会用脚探一探路,感知哪边是下坡(计算梯度),然后迈出一步。这一步跨得有多远,就是“学习率”决定的。

    • 步子太小(学习率太低):就像蚂蚁爬,虽然肯定能安全走到谷底,但要花几个月(训练极其缓慢,浪费大量时间)。

    • 步子太大(学习率太高):就像绿巨人瞎跳,本来离谷底只剩十米,他一跳五十米,直接跳到了对面的山坡上;再往回一跳,又过了头。最后在山谷两边反复横跳,永远找不到最低点(这叫“模型无法收敛”,甚至“发散”)。

    • 结论:找一个不多不少的“合适步子”,是炼丹师(算法工程师)的日常工作之一。

  9. 这就是为了强行把所有特征拉到“同一个起跑线”上,消除单位(量纲)带来的不公平对待

  10. 归一化: 把所有数据按比例压缩到 0011 之间(或者 1-111

  11. 标准化: 不强求固定范围,而是把数据的“平均值”强行变成 00,“标准差”强行变成 11

  12. 正态分布: 一个中间高、两边低、左右完美对称的形状

    • 残差 = 真实值 - 预测值
  13. 残差与损失的区别:

    • 几十上百个残差(零碎的差距) 组合、加工、求平均\xrightarrow{\text{组合、加工、求平均}} 变成了 1 个 Loss(模型的最终总成绩)。

    • 我们之前学的 MSE(均方误差),它的全称其实就是:(求平均)(求平方)误差(其实就是残差)。所以 MSE 就是把所有残差的平方加起来求平均