跳到正文
本地阅读 · 线性回归

线性回归

机器学习 · 机器学习 · P0
本章目录

学完后,你应能独立完成

  • 推导含截距 OLS 的正规方程
  • 解释秩不足时系数与预测的不同唯一性
  • 用 lstsq 实现并核对残差正交性

前置建议:研究问题与数据约定

改变一个条件,观察发生什么

浏览器内即时教学计算;Python 实验结果另列于代码区。图形与数值一起核对。

01

线性是对参数线性

线性模型把各列特征的贡献相加。加入 x₁x₂、平方项或 log 变换后,它对原输入可以非线性,但对待估参数仍线性。先训练这个基线,能区分收益来自学权重、特征变换,还是复杂模型自动学习交互。

X(n,p) 默认不含截距,β 为 p 维向量,b 是标量,预测 ŷ=b1+Xβ。平方误差惩罚大残差,不要求 X 或误差正态才能定义最小二乘问题。

\[J(b,\beta)=\frac{1}{2n}\|y-b\mathbf1-X\beta\|_2^2\]
02

为什么可以先中心化

截距的一阶条件要求残差和为零,因此 b=ȳ−x̄ᵀβ。把它代回目标后,只需对中心化的数据求斜率。中心化是消去截距的一种代数方法;如果给设计矩阵显式加常数列,也可以一次性求解。

\[X_c=X-\mathbf1\bar x^T,\quad y_c=y-\bar y\mathbf1,\quad X_c^TX_c\hat\beta=X_c^Ty_c\]
  1. 对 b 求导:1ᵀ(y−b1−Xβ)=0。
  2. 代入 b,把残差改写成 y_c−X_cβ。
  3. 对 β 求导:−X_cᵀ(y_c−X_cβ)/n=0。
  4. 满列秩时有唯一斜率;实现使用 QR/SVD 或 lstsq,避免显式求逆。
03

正规方程其实是投影条件

在中心化空间中,残差与 X_c 的每一列正交。拟合值是 y_c 到列空间的正交投影。对同一训练设计,即便 X 的列重复,投影仍唯一;只是可以有多组系数给出相同训练拟合。

若 x₂=2x₁,预测只识别 β₁+2β₂。新样本若仍遵循同一列关系,预测不受这类系数选择影响;若离开该关系,模型对新点的外推会依赖所选解。lstsq 返回最小范数解是一种明确的选择规则,不是补回不存在的信息。

04

估计与推断的条件不要混淆

最小二乘解是优化问题;把系数解释为总体线性关系,需要设定正确性或明确的线性投影目标。条件均值零支持经典无偏性;满秩、样本依赖与稳定性等影响识别和渐近性质。正态性用于特定有限样本推断,不是计算 OLS 的必要条件。

异方差或自相关不自动使外生条件下的系数有偏,但常规标准误可能错误。金融预测使用合法的未来验证检查误差,不能凭训练 R² 高或某个系数显著就确认选股增量。

05

量化研究中的实际用途

OLS 能提供透明的收益校准与因子权重基线。强共线会使权重在不同训练窗口中跳动;训练分布内预测仍可能比较稳定。未来因子相关结构改变时,预测也可能变坏,因此要同时看权重稳定和未来误差。

接下来给同一目标加正则,再比较显式交互与树自动学习的增量。不要把线性模型当作一个故意做差的对照组。

从算法到一次真实运行

代码在本地 Python 中执行,HTML 内展示参考实现和本轮运行结果。请先独立完成练习,再展开完整参考文件。

linear.py / 核心函数
def ols_fit(X, y):
    """X excludes intercept. Return intercept, slopes, rank of centered X."""
    X, y = np.asarray(X, float), np.asarray(y, float)
    if X.ndim != 2 or y.shape != (len(X),) or len(X) == 0:
        raise ValueError("Expected nonempty X(n,p) and y(n)")
    if not np.isfinite(X).all() or not np.isfinite(y).all():
        raise ValueError("Resolve nonfinite data first")
    mean = X.mean(axis=0)
    coef, _, rank, _ = np.linalg.lstsq(X-mean, y-y.mean(), rcond=None)
    return float(y.mean()-mean@coef), coef, int(rank)
下载本节 .pypython linear.py依赖版本见首页,示例只使用合成数据。
查看本轮本地运行记录 · 2026-10-12
{
  "intercept": 3.0,
  "coef": [
    2.0,
    -0.5000000000000006
  ],
  "rank": 2,
  "max_residual": 1.1102230246251565e-15,
  "duplicate_column_rank": 1,
  "duplicate_column_coef": [
    0.7999999999999995,
    1.5999999999999992
  ]
}

先回答,再看提示和答案

Q01

两个完全相同的因子列会让训练预测不唯一吗?

一级提示

把目标写成关于 β₁+β₂ 的函数。

参考答案与条件

列空间投影唯一,系数不唯一。列空间外的新样本预测需要明确解的选择或额外约束。

Q02

正态误差是求 OLS 的必要条件吗?

一级提示

先写出目标、信息集和所需条件。

参考答案与条件

不是。计算最小二乘只需要明确目标与数值输入;经典有限样本 t/F 推断有额外分布条件。

Q03

为什么不直接使用 inv(XᵀX)?

一级提示

先写出目标、信息集和所需条件。

参考答案与条件

形成 XᵀX 会放大条件数,显式求逆也没有必要。lstsq 用数值分解处理最小二乘和秩不足。

把知识迁移到一个新任务

不看参考代码实现含截距 OLS;用随机数据检查残差均值与 X_cᵀ残差;再加一列重复因子,说明 rank 与训练预测发生了什么。

这里保存学习笔记,不在浏览器执行 Python。A/B/C 由你按独立完成程度填写。

参考与进一步阅读

在线文档可能比本地固定版本更新;API 行为以已验证代码和版本记录为准。

掌握状态与复习

关掉资料独立完成后记 A;提示后完成记 B;需要重学记 C。

记录尽量保存在当前浏览器,建议定期导出备份。