Skip to content

线性回归

用一条直线拟合数据、预测数值——最简单的机器学习算法,也是理解所有深度学习模型的起点。

线性回归就像用尺子量趋势。你有一组"面积 → 房价"的数据,线性回归帮你画出那条最贴合数据的直线,然后用这条线去预测新房子的价格。它虽然简单,但 MSE 损失、梯度下降、正则化这些核心概念贯穿了整个机器学习和深度学习,面试中几乎必问。

模型公式

线性回归的模型就一行:

y^=wx+b
  • w(权重 / weight):直线的斜率,表示特征对结果的影响程度
  • b(偏置 / bias):直线的截距,表示基准值
  • y^(预测值):模型的输出

类比:出租车计费 = 单价 × 公里数 + 起步价。单价就是 w,起步价就是 b,总费用就是 y^

面积 x(m²)真实房价 y(万)预测 y^=2x+50
50160150
80200210
100260250

预测值和真实值之间有差距——怎么衡量这个差距,以及怎么让它尽可能小,就是接下来要解决的问题。

MSE 损失函数

损失函数 = 衡量模型预测有多"偏"的指标。线性回归用 MSE(Mean Squared Error,均方误差):

MSE=1ni=1n(y^iyi)2

直觉理解:

  1. 每个样本的误差 = 预测值 - 真实值
  2. 取平方(防止正负抵消,且放大大误差)
  3. 求平均

类比:射箭。每支箭到靶心的距离取平方再平均,就是你的"偏离程度"。MSE 越小,说明你的箭(预测)越集中在靶心(真实值)附近。

为什么用平方而不用绝对值?

|x|x=0 处不可导,不方便求梯度。x2 处处可导,且对大误差惩罚更重——一个偏 10 的样本比十个偏 1 的样本"更该被修正"。

梯度下降

有了损失函数,怎么找到让 MSE 最小的 wb?答案是梯度下降

类比:你蒙着眼站在山上,想走到最低点(谷底)。策略:用脚感受地面倾斜方向(梯度),然后朝下坡方向迈一步。每步都朝"最陡的下坡方向"走,最终就能到达谷底。

更新公式:

wwαMSEwbbαMSEb

其中 α学习率(步长)。

MSE 对 w 和 b 的梯度

对 MSE 求偏导,推导过程:

MSEw=2ni=1n(y^iyi)xiMSEb=2ni=1n(y^iyi)

直觉解读:

  • 误差 (y^iyi) 越大,梯度越大,参数更新幅度越大——错得越多,改得越狠
  • 梯度方向指向"上坡",更新时取负号朝"下坡"走

学习率的选择

学习率表现类比
太大(如 1.0)来回震荡,甚至发散下山时跨太大步,直接跨过谷底翻到对面山上
太小(如 0.00001)收敛极慢下山时一次挪一厘米
合适(如 0.01)稳定收敛到最优每步都在缩短与谷底的距离
python
import numpy as np

# 模拟梯度下降求解 y = 3x + 2
np.random.seed(42)
X = np.random.rand(100)
y = 3 * X + 2 + np.random.randn(100) * 0.1  # 加噪声

w, b = 0.0, 0.0
lr = 0.1  # 学习率
epochs = 100

for epoch in range(epochs):
    y_hat = w * X + b
    error = y_hat - y

    # 计算梯度
    dw = (2 / len(X)) * np.sum(error * X)
    db = (2 / len(X)) * np.sum(error)

    # 更新参数
    w -= lr * dw
    b -= lr * db

print(f"w = {w:.4f}, b = {b:.4f}")  # 接近 w=3, b=2

梯度下降的三种变体

变体每次用多少数据算梯度特点
BGD(批量梯度下降)全部数据稳定但慢,大数据集不实用
SGD(随机梯度下降)1 条数据快但震荡大,方向不稳定
Mini-batch GD一小批(如 32/64 条)兼顾速度和稳定性,实际最常用

实际工作中

几乎没有人用纯 BGD 或纯 SGD。深度学习框架默认都用 Mini-batch GD,配合 Adam 等自适应学习率优化器效果更好。

正规方程

梯度下降是"一步步逼近"最优解。但线性回归有个特殊优势:存在直接算出最优解的公式(闭式解)。

w=(XTX)1XTy

这叫正规方程(Normal Equation),也是最小二乘法(OLS, Ordinary Least Squares)的核心。

对比梯度下降正规方程
过程迭代逼近一步算出
需要调学习率
特征多(>10000)时更快矩阵求逆太慢(O(n3)
特征少(<10000)时较慢更快
适用范围所有模型仅线性回归等少数模型
python
# 正规方程的 numpy 实现
X_b = np.c_[np.ones((len(X), 1)), X.reshape(-1, 1)]  # 加偏置列
w_best = np.linalg.inv(X_b.T @ X_b) @ X_b.T @ y

print(f"b = {w_best[0]:.4f}, w = {w_best[1]:.4f}")  # 直接算出最优解

正规方程的局限

XTX 不可逆(特征之间高度相关)时,正规方程失效。实际中可以用伪逆 np.linalg.pinv 代替,或者直接用梯度下降 + 正则化。

多元线性回归

现实中房价不只取决于面积,还有楼层、朝向、地段等多个特征。多元线性回归把公式从一维扩展到多维:

y^=w1x1+w2x2++wnxn+b=wTx+b

每个特征对应一个权重,权重的大小反映该特征的重要程度。

python
from sklearn.linear_model import LinearRegression

# 多特征:面积、楼层、到地铁距离
X_train = np.array([
    [50, 3, 500],
    [80, 10, 200],
    [100, 15, 100],
    [70, 5, 800],
])
y_train = np.array([160, 250, 300, 180])

model = LinearRegression()
model.fit(X_train, y_train)

print(f"权重: {model.coef_}")       # 每个特征的影响程度
print(f"截距: {model.intercept_}")   # 基准值

多项式回归

数据不是线性关系怎么办?例如抛物线形的数据,画直线拟合效果很差。

多项式回归 = 给特征"加幂次",让直线变成曲线

x 扩展为 [x,x2,x3,],再做线性回归。模型对新特征仍然是"线性"的,但对原始特征 x 是非线性的。

python
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline

# 用二次多项式拟合
poly_model = Pipeline([
    ("poly", PolynomialFeatures(degree=2)),  # x -> [1, x, x²]
    ("lr", LinearRegression()),
])

poly_model.fit(X_train.reshape(-1, 1), y_train)

阶数不要太高

degree=23 通常够用。阶数太高会过拟合——模型会拟合每一个噪声点,在新数据上表现很差。

正则化:Ridge 与 Lasso

当特征很多时,模型容易过拟合(权重太大,对噪声过度敏感)。正则化通过惩罚过大的权重来约束模型复杂度。

Ridge 回归(L2 正则化)

Loss=MSE+λj=1nwj2
  • 在 MSE 基础上加了权重的平方和
  • 让权重趋向于小值,但不会变成 0
  • λ(正则化系数)控制惩罚力度

Lasso 回归(L1 正则化)

Loss=MSE+λj=1n|wj|
  • 加的是权重的绝对值之和
  • 会让不重要的特征权重变成 0——自动做特征选择

对比

对比项Ridge(L2)Lasso(L1)
惩罚项λwj2$\lambda \sum
权重趋势趋向于小但不为 0不重要的权重直接变 0
特征选择不会会(自动剔除不重要特征)
适用场景特征都有用,只是要压缩特征很多,想自动筛选
python
from sklearn.linear_model import Ridge, Lasso

# Ridge 回归
ridge = Ridge(alpha=1.0)  # alpha 就是 λ
ridge.fit(X_train, y_train)

# Lasso 回归
lasso = Lasso(alpha=0.1)
lasso.fit(X_train, y_train)

print(f"Lasso 权重: {lasso.coef_}")  # 部分权重可能为 0

R² 评估指标

除了 MSE,回归模型常用 R2(决定系数)来评估:

R2=1(y^iyi)2(y¯yi)2

直觉理解:

  • R2=1:完美预测,模型解释了所有变化
  • R2=0:模型和直接用平均值预测一样差
  • R2<0:模型比用平均值还差(通常说明模型有问题)
python
from sklearn.metrics import r2_score

y_pred = model.predict(X_test)
print(f"R² = {r2_score(y_test, y_pred):.4f}")

R² vs MSE

MSE 的值取决于数据的量纲(房价的 MSE 和温度的 MSE 没法比),而 R2 始终在 0~1 之间,更适合跨任务比较模型好坏。

线性回归的假设

线性回归不是万能的,它有四个隐含假设:

假设含义违反时的后果
线性关系yx 之间是线性的直线拟合不了曲线数据
误差独立各样本的误差互不影响参数估计不准
方差齐性不同 x 处误差的方差相同置信区间不可靠
误差正态误差服从正态分布统计检验失效
面试中怎么答?

不需要背诵这四个假设的学术名称。面试时说"线性回归假设数据是线性的、误差是随机且均匀分布的"就够了。如果面试官追问,再提线性、独立、等方差、正态这四点。

面试高频问题

Q1: 线性回归和逻辑回归的区别?⭐⭐⭐

答题思路

  1. 线性回归预测连续值(房价),逻辑回归预测概率 / 类别(是否垃圾邮件)
  2. 线性回归输出 y^=wx+b,逻辑回归在外面包了一个 Sigmoid 函数 σ(wx+b)
  3. 损失函数不同:MSE vs 交叉熵
  4. 加分:逻辑回归虽然叫"回归",但它是分类算法

Q2: 梯度下降和正规方程怎么选?⭐⭐

答题思路

  1. 正规方程一步算出最优解,不用调学习率
  2. 但矩阵求逆的复杂度是 O(n3),特征超过 10000 维就很慢
  3. 梯度下降适合大规模数据和高维特征,且适用于所有模型
  4. 加分:深度学习模型只能用梯度下降,没有闭式解

Q3: L1 和 L2 正则化有什么区别?⭐⭐⭐

答题思路

  1. L1(Lasso)惩罚权重绝对值,会让部分权重变成 0 → 自动特征选择
  2. L2(Ridge)惩罚权重平方,让权重趋向小值但不为 0
  3. 想筛特征用 L1,想整体压缩用 L2
  4. 加分:ElasticNet 结合了 L1 和 L2

Q4: 为什么 MSE 用平方而不用绝对值?⭐⭐

答题思路

  1. 平方函数处处可导,方便用梯度下降优化
  2. 绝对值在 x=0 处不可导
  3. 平方对大误差惩罚更重(误差 10 的损失是误差 1 的 100 倍)
  4. 加分:MAE(绝对值)对异常值更鲁棒,但优化更复杂

Q5: 线性回归能处理非线性数据吗?⭐⭐

答题思路

  1. 原生的线性回归只能拟合直线
  2. 但可以通过多项式特征扩展(x[x,x2,x3])让模型拟合曲线
  3. 扩展后模型对新特征仍然是线性的,可以复用线性回归的优化方法
  4. 加分:阶数太高会过拟合,需要配合正则化

一张表回顾

知识点核心要义掌握程度
模型公式y^=wx+b,权重 + 偏置⭐⭐⭐ 必须
MSE 损失1n(y^y)2,平方放大大误差⭐⭐⭐ 必须
梯度下降沿梯度反方向更新参数,学习率控制步长⭐⭐⭐ 必须
梯度下降变体BGD / SGD / Mini-batch,实际用 Mini-batch⭐⭐ 理解
正规方程(XTX)1XTy,一步求解但高维慢⭐⭐ 理解
多元线性回归多特征各一个权重,y^=wTx+b⭐⭐ 理解
多项式回归加幂次特征让直线变曲线,阶数太高会过拟合⭐ 了解
Ridge(L2)惩罚权重平方和,权重趋向小但不为 0⭐⭐⭐ 必须
Lasso(L1)惩罚权重绝对值,不重要的权重变 0(特征选择)⭐⭐⭐ 必须
R² 决定系数衡量模型解释了多少变化,0~1 之间越大越好⭐⭐ 理解
线性假设线性、独立、等方差、正态⭐ 了解