线性回归
用一条直线拟合数据、预测数值——最简单的机器学习算法,也是理解所有深度学习模型的起点。
线性回归就像用尺子量趋势。你有一组"面积 → 房价"的数据,线性回归帮你画出那条最贴合数据的直线,然后用这条线去预测新房子的价格。它虽然简单,但 MSE 损失、梯度下降、正则化这些核心概念贯穿了整个机器学习和深度学习,面试中几乎必问。
模型公式
线性回归的模型就一行:
(权重 / weight):直线的斜率,表示特征对结果的影响程度 (偏置 / bias):直线的截距,表示基准值 (预测值):模型的输出
类比:出租车计费 = 单价 × 公里数 + 起步价。单价就是
| 面积 | 真实房价 | 预测 |
|---|---|---|
| 50 | 160 | 150 |
| 80 | 200 | 210 |
| 100 | 260 | 250 |
预测值和真实值之间有差距——怎么衡量这个差距,以及怎么让它尽可能小,就是接下来要解决的问题。
MSE 损失函数
损失函数 = 衡量模型预测有多"偏"的指标。线性回归用 MSE(Mean Squared Error,均方误差):
直觉理解:
- 每个样本的误差 = 预测值 - 真实值
- 取平方(防止正负抵消,且放大大误差)
- 求平均
类比:射箭。每支箭到靶心的距离取平方再平均,就是你的"偏离程度"。MSE 越小,说明你的箭(预测)越集中在靶心(真实值)附近。
为什么用平方而不用绝对值?
梯度下降
有了损失函数,怎么找到让 MSE 最小的
类比:你蒙着眼站在山上,想走到最低点(谷底)。策略:用脚感受地面倾斜方向(梯度),然后朝下坡方向迈一步。每步都朝"最陡的下坡方向"走,最终就能到达谷底。
更新公式:
其中
MSE 对 w 和 b 的梯度
对 MSE 求偏导,推导过程:
直觉解读:
- 误差
越大,梯度越大,参数更新幅度越大——错得越多,改得越狠 - 梯度方向指向"上坡",更新时取负号朝"下坡"走
学习率的选择
| 学习率 | 表现 | 类比 |
|---|---|---|
| 太大(如 1.0) | 来回震荡,甚至发散 | 下山时跨太大步,直接跨过谷底翻到对面山上 |
| 太小(如 0.00001) | 收敛极慢 | 下山时一次挪一厘米 |
| 合适(如 0.01) | 稳定收敛到最优 | 每步都在缩短与谷底的距离 |
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 等自适应学习率优化器效果更好。
正规方程
梯度下降是"一步步逼近"最优解。但线性回归有个特殊优势:存在直接算出最优解的公式(闭式解)。
这叫正规方程(Normal Equation),也是最小二乘法(OLS, Ordinary Least Squares)的核心。
| 对比 | 梯度下降 | 正规方程 |
|---|---|---|
| 过程 | 迭代逼近 | 一步算出 |
| 需要调学习率 | 是 | 否 |
| 特征多(>10000)时 | 更快 | 矩阵求逆太慢( |
| 特征少(<10000)时 | 较慢 | 更快 |
| 适用范围 | 所有模型 | 仅线性回归等少数模型 |
# 正规方程的 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}") # 直接算出最优解正规方程的局限
当 np.linalg.pinv 代替,或者直接用梯度下降 + 正则化。
多元线性回归
现实中房价不只取决于面积,还有楼层、朝向、地段等多个特征。多元线性回归把公式从一维扩展到多维:
每个特征对应一个权重,权重的大小反映该特征的重要程度。
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_}") # 基准值多项式回归
数据不是线性关系怎么办?例如抛物线形的数据,画直线拟合效果很差。
多项式回归 = 给特征"加幂次",让直线变成曲线。
把
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=2 或 3 通常够用。阶数太高会过拟合——模型会拟合每一个噪声点,在新数据上表现很差。
正则化:Ridge 与 Lasso
当特征很多时,模型容易过拟合(权重太大,对噪声过度敏感)。正则化通过惩罚过大的权重来约束模型复杂度。
Ridge 回归(L2 正则化)
- 在 MSE 基础上加了权重的平方和
- 让权重趋向于小值,但不会变成 0
(正则化系数)控制惩罚力度
Lasso 回归(L1 正则化)
- 加的是权重的绝对值之和
- 会让不重要的特征权重变成 0——自动做特征选择
对比
| 对比项 | Ridge(L2) | Lasso(L1) |
|---|---|---|
| 惩罚项 | $\lambda \sum | |
| 权重趋势 | 趋向于小但不为 0 | 不重要的权重直接变 0 |
| 特征选择 | 不会 | 会(自动剔除不重要特征) |
| 适用场景 | 特征都有用,只是要压缩 | 特征很多,想自动筛选 |
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_}") # 部分权重可能为 0R² 评估指标
除了 MSE,回归模型常用
直觉理解:
:完美预测,模型解释了所有变化 :模型和直接用平均值预测一样差 :模型比用平均值还差(通常说明模型有问题)
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 没法比),而
线性回归的假设
线性回归不是万能的,它有四个隐含假设:
| 假设 | 含义 | 违反时的后果 |
|---|---|---|
| 线性关系 | 直线拟合不了曲线数据 | |
| 误差独立 | 各样本的误差互不影响 | 参数估计不准 |
| 方差齐性 | 不同 | 置信区间不可靠 |
| 误差正态 | 误差服从正态分布 | 统计检验失效 |
面试中怎么答?
不需要背诵这四个假设的学术名称。面试时说"线性回归假设数据是线性的、误差是随机且均匀分布的"就够了。如果面试官追问,再提线性、独立、等方差、正态这四点。
面试高频问题
Q1: 线性回归和逻辑回归的区别?⭐⭐⭐
答题思路:
- 线性回归预测连续值(房价),逻辑回归预测概率 / 类别(是否垃圾邮件)
- 线性回归输出
,逻辑回归在外面包了一个 Sigmoid 函数 - 损失函数不同:MSE vs 交叉熵
- 加分:逻辑回归虽然叫"回归",但它是分类算法
Q2: 梯度下降和正规方程怎么选?⭐⭐
答题思路:
- 正规方程一步算出最优解,不用调学习率
- 但矩阵求逆的复杂度是
,特征超过 10000 维就很慢 - 梯度下降适合大规模数据和高维特征,且适用于所有模型
- 加分:深度学习模型只能用梯度下降,没有闭式解
Q3: L1 和 L2 正则化有什么区别?⭐⭐⭐
答题思路:
- L1(Lasso)惩罚权重绝对值,会让部分权重变成 0 → 自动特征选择
- L2(Ridge)惩罚权重平方,让权重趋向小值但不为 0
- 想筛特征用 L1,想整体压缩用 L2
- 加分:ElasticNet 结合了 L1 和 L2
Q4: 为什么 MSE 用平方而不用绝对值?⭐⭐
答题思路:
- 平方函数处处可导,方便用梯度下降优化
- 绝对值在
处不可导 - 平方对大误差惩罚更重(误差 10 的损失是误差 1 的 100 倍)
- 加分:MAE(绝对值)对异常值更鲁棒,但优化更复杂
Q5: 线性回归能处理非线性数据吗?⭐⭐
答题思路:
- 原生的线性回归只能拟合直线
- 但可以通过多项式特征扩展(
)让模型拟合曲线 - 扩展后模型对新特征仍然是线性的,可以复用线性回归的优化方法
- 加分:阶数太高会过拟合,需要配合正则化
一张表回顾
| 知识点 | 核心要义 | 掌握程度 |
|---|---|---|
| 模型公式 | ⭐⭐⭐ 必须 | |
| MSE 损失 | ⭐⭐⭐ 必须 | |
| 梯度下降 | 沿梯度反方向更新参数,学习率控制步长 | ⭐⭐⭐ 必须 |
| 梯度下降变体 | BGD / SGD / Mini-batch,实际用 Mini-batch | ⭐⭐ 理解 |
| 正规方程 | ⭐⭐ 理解 | |
| 多元线性回归 | 多特征各一个权重, | ⭐⭐ 理解 |
| 多项式回归 | 加幂次特征让直线变曲线,阶数太高会过拟合 | ⭐ 了解 |
| Ridge(L2) | 惩罚权重平方和,权重趋向小但不为 0 | ⭐⭐⭐ 必须 |
| Lasso(L1) | 惩罚权重绝对值,不重要的权重变 0(特征选择) | ⭐⭐⭐ 必须 |
| R² 决定系数 | 衡量模型解释了多少变化,0~1 之间越大越好 | ⭐⭐ 理解 |
| 线性假设 | 线性、独立、等方差、正态 | ⭐ 了解 |