线性回归
本章目录
学完后,你应能独立完成
- 推导含截距 OLS 的正规方程
- 解释秩不足时系数与预测的不同唯一性
- 用 lstsq 实现并核对残差正交性
前置建议:研究问题与数据约定
改变一个条件,观察发生什么
浏览器内即时教学计算;Python 实验结果另列于代码区。图形与数值一起核对。
线性是对参数线性
线性模型把各列特征的贡献相加。加入 x₁x₂、平方项或 log 变换后,它对原输入可以非线性,但对待估参数仍线性。先训练这个基线,能区分收益来自学权重、特征变换,还是复杂模型自动学习交互。
X(n,p) 默认不含截距,β 为 p 维向量,b 是标量,预测 ŷ=b1+Xβ。平方误差惩罚大残差,不要求 X 或误差正态才能定义最小二乘问题。
为什么可以先中心化
截距的一阶条件要求残差和为零,因此 b=ȳ−x̄ᵀβ。把它代回目标后,只需对中心化的数据求斜率。中心化是消去截距的一种代数方法;如果给设计矩阵显式加常数列,也可以一次性求解。
- 对 b 求导:1ᵀ(y−b1−Xβ)=0。
- 代入 b,把残差改写成 y_c−X_cβ。
- 对 β 求导:−X_cᵀ(y_c−X_cβ)/n=0。
- 满列秩时有唯一斜率;实现使用 QR/SVD 或 lstsq,避免显式求逆。
正规方程其实是投影条件
在中心化空间中,残差与 X_c 的每一列正交。拟合值是 y_c 到列空间的正交投影。对同一训练设计,即便 X 的列重复,投影仍唯一;只是可以有多组系数给出相同训练拟合。
若 x₂=2x₁,预测只识别 β₁+2β₂。新样本若仍遵循同一列关系,预测不受这类系数选择影响;若离开该关系,模型对新点的外推会依赖所选解。lstsq 返回最小范数解是一种明确的选择规则,不是补回不存在的信息。
估计与推断的条件不要混淆
最小二乘解是优化问题;把系数解释为总体线性关系,需要设定正确性或明确的线性投影目标。条件均值零支持经典无偏性;满秩、样本依赖与稳定性等影响识别和渐近性质。正态性用于特定有限样本推断,不是计算 OLS 的必要条件。
异方差或自相关不自动使外生条件下的系数有偏,但常规标准误可能错误。金融预测使用合法的未来验证检查误差,不能凭训练 R² 高或某个系数显著就确认选股增量。
量化研究中的实际用途
OLS 能提供透明的收益校准与因子权重基线。强共线会使权重在不同训练窗口中跳动;训练分布内预测仍可能比较稳定。未来因子相关结构改变时,预测也可能变坏,因此要同时看权重稳定和未来误差。
接下来给同一目标加正则,再比较显式交互与树自动学习的增量。不要把线性模型当作一个故意做差的对照组。
从算法到一次真实运行
代码在本地 Python 中执行,HTML 内展示参考实现和本轮运行结果。请先独立完成练习,再展开完整参考文件。
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)"""Standalone synthetic teaching example. Run locally with Python, not in the HTML."""
import json
import numpy as np
import pandas as pd
from scipy.special import expit
def clean(value):
if isinstance(value, dict): return {str(k):clean(v) for k,v in value.items()}
if isinstance(value,(list,tuple,np.ndarray)): return [clean(v) for v in value]
if isinstance(value,(np.integer,)): return int(value)
if isinstance(value,(float,np.floating)): return float(value) if np.isfinite(value) else None
if isinstance(value,(np.bool_,)): return bool(value)
return value
def print_result(result):
print(json.dumps(clean(result),ensure_ascii=False,allow_nan=False))
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)
if __name__ == "__main__":
X = np.array([[-2.,1.],[-1.,-1.],[0.,2.],[1.,0.],[2.,-2.]])
y = 3 + X@np.array([2.,-.5])
intercept, coef, rank = ols_fit(X,y)
residual = y-intercept-X@coef
np.testing.assert_allclose(coef,[2,-.5],atol=1e-12)
np.testing.assert_allclose((X-X.mean(0)).T@residual,0,atol=1e-12)
duplicated = np.column_stack([X[:,0],2*X[:,0]])
b2,w2,r2 = ols_fit(duplicated,3+4*X[:,0])
print_result({"intercept":intercept,"coef":coef,"rank":rank,
"max_residual":abs(residual).max(),"duplicate_column_rank":r2,
"duplicate_column_coef":w2})
查看本轮本地运行记录 · 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
]
}先回答,再看提示和答案
两个完全相同的因子列会让训练预测不唯一吗?
一级提示
把目标写成关于 β₁+β₂ 的函数。
参考答案与条件
列空间投影唯一,系数不唯一。列空间外的新样本预测需要明确解的选择或额外约束。
正态误差是求 OLS 的必要条件吗?
一级提示
先写出目标、信息集和所需条件。
参考答案与条件
不是。计算最小二乘只需要明确目标与数值输入;经典有限样本 t/F 推断有额外分布条件。
为什么不直接使用 inv(XᵀX)?
一级提示
先写出目标、信息集和所需条件。
参考答案与条件
形成 XᵀX 会放大条件数,显式求逆也没有必要。lstsq 用数值分解处理最小二乘和秩不足。
把知识迁移到一个新任务
不看参考代码实现含截距 OLS;用随机数据检查残差均值与 X_cᵀ残差;再加一列重复因子,说明 rank 与训练预测发生了什么。
这里保存学习笔记,不在浏览器执行 Python。A/B/C 由你按独立完成程度填写。
参考与进一步阅读
在线文档可能比本地固定版本更新;API 行为以已验证代码和版本记录为准。
掌握状态与复习
关掉资料独立完成后记 A;提示后完成记 B;需要重学记 C。
记录尽量保存在当前浏览器,建议定期导出备份。