查看全课大纲(第 35 / 82 节)
  1. 1.函数与数据泛化
  2. 2.向量:从几何直觉到高维空间
  3. 3.矩阵与张量
  4. 4.特征值与特征向量:矩阵变换的不动方向
  5. 5.凸函数:从向量求导的矩阵记号到好优化的函数形状
  6. 6.概率与统计:机器学习的数学基础
  7. 7.独立性与随机变量:贝叶斯公式与二项分布
  8. 8.期望、方差与协方差:随机变量的数字画像
  9. 9.联合概率:当一条轴不够用的时候
  10. 10.概率分布(一):从伯努利到伽马函数
  11. 11.概率分布(二):贝塔、泊松、正态与两个贝叶斯故事
  12. 12.机器学习的模型:找输入与输出的关系
  13. 13.机器学习的应用
  14. 14.过拟合
  15. 15.机器学习的分类
  16. 16.有监督学习:从房价预测说起
  17. 17.损失函数
  18. 18.梯度下降(上):更新规则与学习速率
  19. 19.梯度下降(2)
  20. 20.牛顿方法
  21. 21.KNN简介
  22. 22.距离测算
  23. 23.朴素贝叶斯
  24. 24.朴素贝叶斯的实际应用
  25. 25.信息熵:决策树构建的度量基础
  26. 26.信息增益与决策树的构建
  27. 27.ID3算法
  28. 28.决策树节点的划分
  29. 29.CART树
  30. 30.Bagging
  31. 31.Boosting:自适应提升算法
  32. 32.Gradient Boosting
  33. 33.线性模型:回归与分类的同一副骨架
  34. 34.最小二乘:把最优参数直接解出来
  35. 35.最小二乘法的几何与概率视角
  36. 36.极大似然:给最小二乘一个概率出身
  37. 37.逻辑回归(1):把线性模型接到分类上
  38. 38.逻辑回归(2):损失函数与多分类
  39. 39.---- 手造数据: 5 个样本, 2 个特征; x2 几乎 = 2*x1 (偏差手工指定, 无随机) ----
  40. 40.讲师例: 向量 "23014" -- 三把范数尺子量同一个向量
  41. 41.优化方法(1):坐标下降与前向选择
  42. 42.优化方法(2):前向策略与最小角回归
  43. 43.拉格朗日乘子法(1):从无约束到等式约束
  44. 44.拉格朗日乘子法(2):等式约束下的平行条件与拉格朗日函数
  45. 45.拉格朗日乘子法(3):不等式约束与 KKT 条件
  46. 46.最大间隔:把分类问题变成优化问题
  47. 47.拉格朗日对偶问题:把 w 和 b 全部换成 α
  48. 48.支持向量:边界上的少数派
  49. 49.SVM 计算过程:一笔到底算完,再走进核方法
  50. 50.贝叶斯公式:概率即信念
  51. 51.隐含变量和概率模型:给看不见的原因建模
  52. 52.EM 算法:期望与最大化的迭代
  53. 53.琴生不等式:EM 的数学钥匙
  54. 54.三个硬币问题:EM 的复盘与衔接
  55. 55.高斯混合模型:用隐变量解释双峰数据
  56. 56.隐马尔可夫模型
  57. 57.隐马尔可夫模型(2):前向算法与动态混合模型
  58. 58.隐马尔可夫模型在 NLP 中的运用
  59. 59.EM 算法:把「为什么收敛」推到底
  60. 60.HMM 在 NLP 中的运用:从分词到机器翻译
  61. 61.HMM 参数估计:Baum-Welch 的三块拉格朗日
  62. 62.高维下的高斯模型
  63. 63.主题模型:从词袋到隐含主题
  64. 64.Dirichlet 分布(1)
  65. 65.Dirichlet 分布(2)
  66. 66.统计学习内容回顾
  67. 67.K-means 算法
  68. 68.PCA 降维
  69. 69.SVD 降维
  70. 70.从聚类到流形
  71. 71.局部线性嵌入
  72. 72.随机邻域嵌入:SNE 与 t-SNE
  73. 73.无参模型:让数据自己说话
  74. 74.高斯过程:函数空间里的正态分布
  75. 75.高斯过程(2):噪声、正则化与核的线性组合
  76. 76.神经网络简介:从感知器到自编码器
  77. 77.反向传播:把误差一层层传回去
  78. 78.卷积神经网络(CNN):让特征自己学出来
  79. 79.循环神经网络(RNN):给网络装上记忆
  80. 80.深度学习回顾:静态一类,动态一类
  81. 81.增强学习(1):蒙特卡洛、树搜索与 Q-learning
  82. 82.强化学习(2):从乌鸦吃核桃到井字棋的 value 回传

最小二乘法的几何与概率视角

约 38 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · 机器学习算法精讲

上一节我们得到了最小二乘的解析解 θ=(XTX)−1XTy\theta = (X^TX)^{-1}X^Ty。本节先回答一个现实问题——有了它,什么时候还需要梯度下降?然后换一副眼镜重新看最小二乘:在几何上,它是把目标向量投影到特征张成的空间;在概率上,它对应着一个关于噪声分布的假设。这两副眼镜,将陪我们看懂后面的岭回归、逻辑回归与极大似然。

💡 核心导读

  • 选型:解析解与梯度下降各自的适用场景——瓶颈在矩阵求逆。
  • 两种视角看方程组:行视角(每个方程一条线,解是交点)与列视角(解是列向量的线性组合)。
  • 无解时的最优近似:三点拟合一条直线为什么”无解”?答案是把 yy 投影到列空间,残差垂直于整个空间。
  • 正交出正规方程:ATe=0A^T e = 0 一步推出 θ∗=(ATA)−1ATy\theta^* = (A^TA)^{-1}A^Ty,与求导法殊途同归。
  • 概率视角:把残差看作噪声,假设 ε∼N(0,σ2)\varepsilon \sim \mathcal{N}(0, \sigma^2)——下一节极大似然将证明最小二乘解恰好是这个模型的最优估计。

解析解还是梯度下降?

上一节的两个工具——最小二乘(LMS 解析解)与梯度下降(GD)——都能求线性模型,什么时候用哪个?

  • 数据量与维度都不大时(几千几万个样本、特征不多),直接用解析解。矩阵转置、矩阵相乘的计算量都与矩阵规模成多项式关系,现代计算机对付它们毫无压力。
  • 真正的瓶颈是求逆。θ=(XTX)−1XTy\theta = (X^TX)^{-1}X^Ty 中最难的一步就是 (XTX)−1(X^TX)^{-1}——矩阵求逆需要大量的计算步骤,矩阵一大,代价急剧上升。
  • 梯度下降是万能牌,但麻烦事不少:它对任何规模的数据都能用,但收敛可能慢,还面临收敛性问题,要选学习速率 α\alpha——α\alpha 学不好还会震荡。
  • 讲师的实用经验:对普通线性问题,数据不超过百万级时,现在的计算能力直接用矩阵解析解就好,不必上梯度下降;真正数据量巨大、或者以后遇到更复杂的模型(没有解析解)时,梯度下降才是更好的选择。

从方程组到向量空间:两种视角

行视角:解是交点

看一个最简单的方程组:

{x1+x2=3−x1+x2=1\begin{cases} x_1 + x_2 = 3 \\ -x_1 + x_2 = 1 \end{cases}

两式相加得 2x2=42x_2 = 4,故 x2=2x_2 = 2、x1=1x_1 = 1。画图看:每个方程是平面上的一条直线(x1+x2=3x_1+x_2=3 过 (0,3)(0,3) 与 (3,0)(3,0);−x1+x2=1-x_1+x_2=1 过 (0,1)(0,1) 与 (−1,0)(-1,0)),两条线相交于 (1,2)(1, 2)——解就是交点。

列视角:解是线性组合的系数

把它写成矩阵形式 Ax=yA\mathbf{x} = \mathbf{y}:

[11−11][x1x2]=[31]\begin{bmatrix} 1 & 1 \\ -1 & 1 \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} = \begin{bmatrix} 3 \\ 1 \end{bmatrix}

把 AA 的两列各看作一个向量:a1=(1,−1)T\mathbf{a}_1 = (1, -1)^T、a2=(1,1)T\mathbf{a}_2 = (1, 1)^T,方程就变成了

x1a1+x2a2=yx_1 \mathbf{a}_1 + x_2 \mathbf{a}_2 = \mathbf{y}

换了个问法:把 a1\mathbf{a}_1 拉伸 x1x_1 倍、a2\mathbf{a}_2 拉伸 x2x_2 倍,什么时候两者相加恰好等于 y=(3,1)T\mathbf{y} = (3,1)^T?我们要求的就是这组”拉伸系数”。如果有解,说明 y\mathbf{y} 一定落在 a1\mathbf{a}_1、a2\mathbf{a}_2 张成的向量空间里。讲师现场画了这张图:a1\mathbf{a}_1 拉伸 1 倍、a2\mathbf{a}_2 拉伸 2 倍,合成出 y\mathbf{y}——解 (1,2)(1, 2) 的几何含义一目了然。

(顺带一提:国内教材习惯把向量写成行向量,而西方——比如 MIT 的线性代数课——默认列向量。本课程沿用列向量约定。)

无解时怎么办:投影

实际问题里,“恰好有解”是奢望。取三个点 (0,2)(0, 2)、(1,2)(1, 2)、(2,3)(2, 3),想拟合直线 y=θ1x+θ0y = \theta_1 x + \theta_0(我们一直记 hθ(x)=θ0+θ1xh_\theta(x) = \theta_0 + \theta_1 x)。把三个条件写成方程组:

[101112][θ0θ1]=[223]\begin{bmatrix} 1 & 0 \\ 1 & 1 \\ 1 & 2 \end{bmatrix} \begin{bmatrix} \theta_0 \\ \theta_1 \end{bmatrix} = \begin{bmatrix} 2 \\ 2 \\ 3 \end{bmatrix}

三个点不在同一条直线上,无论怎么画线都不可能同时穿过三点——方程无解。用列视角说:y=(2,2,3)T\mathbf{y} = (2,2,3)^T 是三维空间里的一个向量,而 AA 的两个列向量 a1=(1,1,1)T\mathbf{a}_1 = (1,1,1)^T、a2=(0,1,2)T\mathbf{a}_2 = (0,1,2)^T 只能张成三维空间里的一个平面(二维子空间);不幸的是,y\mathbf{y} 恰好不在这个平面里。

那退而求其次:在平面里找一个离 y\mathbf{y} 最近的向量 y^\hat{\mathbf{y}},用它代替 y\mathbf{y}。几何常识告诉我们:点到平面最短的线段是垂线——按三角原则,平面上任何其他点到 y\mathbf{y} 的距离都比垂足远。这个垂足就是 y\mathbf{y} 在列空间上的投影 y^\hat{\mathbf{y}},而垂线段本身就是一个新向量:

e=y−y^\mathbf{e} = \mathbf{y} - \hat{\mathbf{y}}

它就是”误差向量”(残差)。最小二乘法的几何意义就此登场:在列空间中找 y\mathbf{y} 的投影,使残差向量最短。

正交性条件与正规方程

投影有一个天然的副产品:残差垂直于整个列空间。既然 e\mathbf{e} 垂直于平面里的每一个方向,它自然与 AA 的每一列正交:

a1Te=0,a2Te=0\mathbf{a}_1^T \mathbf{e} = 0, \qquad \mathbf{a}_2^T \mathbf{e} = 0

两条合并成矩阵形式,就是著名的正交性条件:

ATe=AT(y−Aθ∗)=0A^T \mathbf{e} = A^T(\mathbf{y} - A\theta^*) = 0

移项整理,得到正规方程:

ATA θ∗=ATy⟹θ∗=(ATA)−1ATyA^T A\, \theta^* = A^T \mathbf{y} \quad\Longrightarrow\quad \theta^* = (A^T A)^{-1} A^T \mathbf{y}

与我们上节辛苦求导得到的是同一个公式——但它不需要从零开始一步步推导,只需要把最小二乘”翻译”成几何语言,答案自己浮现出来。用列向量形式理解方程组、把无解问题化成投影问题、让残差与列空间垂直——这三步是讲师反复强调的关键点。

数值验证:残差真的与列正交吗

用一小段纯 Python(手写矩阵运算,不依赖任何第三方库)验证正交性:生成带高斯噪声的线性数据,用 OLS 求解,检查残差与设计矩阵两列的点积是否为零。

import math
import random

# 固定随机种子保证可复现
random.seed(42)

# 生成小规模数据:y = 1.0*x + 0.8 + 噪声
true_theta1 = 1.0
true_theta0 = 0.8
n_points = 5
x_vals = [i * 0.5 for i in range(n_points)]  # [0, 0.5, 1.0, 1.5, 2.0]

y_vals = []
for x in x_vals:
    noise = random.gauss(0, 0.1)  # 均值为0、标准差0.1的正态噪声
    y_vals.append(true_theta1 * x + true_theta0 + noise)

# 设计矩阵 A:第一列全1(截距),第二列为 x
A = [[1, x] for x in x_vals]

def mat_transpose(mat):
    n_rows, n_cols = len(mat), len(mat[0])
    return [[mat[i][j] for i in range(n_rows)] for j in range(n_cols)]

def mat_mult(M, N):
    n, m, p = len(M), len(N), len(N[0])
    result = [[0.0] * p for _ in range(n)]
    for i in range(n):
        for j in range(p):
            result[i][j] = sum(M[i][k] * N[k][j] for k in range(m))
    return result

def vec_dot(v1, v2):
    return sum(a * b for a, b in zip(v1, v2))

def inv_2x2(mat):
    a, b, c, d = mat[0][0], mat[0][1], mat[1][0], mat[1][1]
    det = a * d - b * c
    return [[d/det, -b/det], [-c/det, a/det]]

# OLS 三步走:A^T A、A^T y、求逆相乘
A_T = mat_transpose(A)
theta_vec = mat_mult(inv_2x2(mat_mult(A_T, A)), mat_mult(A_T, [[yi] for yi in y_vals]))
theta0_ols, theta1_ols = theta_vec[0][0], theta_vec[1][0]

# 预测与残差
y_hat = [theta0_ols + theta1_ols * x for x in x_vals]
residuals = [y_vals[i] - y_hat[i] for i in range(n_points)]

# 正交性验证:残差 · A 的两列
col1 = [1] * n_points
col2 = x_vals

print("生成的数据点 (x, y):")
for i in range(n_points):
    print(f"  ({x_vals[i]:.2f}, {y_vals[i]:.4f})")
print(f"\n真实参数: theta1 = {true_theta1}, theta0 = {true_theta0}")
print(f"OLS估计参数: theta1 = {theta1_ols:.4f}, theta0 = {theta0_ols:.4f}")
print("\n预测值及残差:")
for i in range(n_points):
    print(f"  x={x_vals[i]:.2f}, y_true={y_vals[i]:.4f}, y_pred={y_hat[i]:.4f}, residual={residuals[i]:.6f}")
print("\n验证正交性(应接近0):")
print(f"  残差 · 列1(全1) = {vec_dot(residuals, col1):.10f}")
print(f"  残差 · 列2(x值) = {vec_dot(residuals, col2):.10f}")
生成的数据点 (x, y):
  (0.00, 0.7856)
  (0.50, 1.2827)
  (1.00, 1.7889)
  (1.50, 2.3702)
  (2.00, 2.7872)

真实参数: theta1 = 1.0, theta0 = 0.8
OLS估计参数: theta1 = 1.0182, theta0 = 0.7848

预测值及残差:
  x=0.00, y_true=0.7856, y_pred=0.7848, residual=0.000827
  x=0.50, y_true=1.2827, y_pred=1.2938, residual=-0.011133
  x=1.00, y_true=1.7889, y_pred=1.8029, residual=-0.014053
  x=1.50, y_true=2.3702, y_pred=2.3120, residual=0.058198
  x=2.00, y_true=2.7872, y_pred=2.8211, residual=-0.033838

验证正交性(应接近0):
  残差 · 列1(全1) = 0.0000000000
  残差 · 列2(x值) = -0.0000000000

噪声把点拽离了真实直线(估计值 1.0182/0.7848 与真值 1.0/0.8 有小偏差),但两个点积严格为零——注意第二个点积显示为 -0.0000000000,这不是笔误:它实际是约 −10−17-10^{-17} 的浮点残渣,格式化后带上了负号。这正是”数学上为零、机器上有毛边”的真实样子。无论数据怎么带噪声,最小二乘解的残差永远与列空间正交——几何视角给的不是近似,是构造保证。

概率视角:给误差安一个分布

几何视角回答了最小二乘”在做什么”,概率视角回答”凭什么合理”。我们重新看待手头的数据:现实观测从来不是一条完美的直线,每个观测点都上下浮动——讲师把这些浮动直接建模成噪声。给每个样本写上误差项:

y(i)=θTx(i)+ε(i)y^{(i)} = \theta^T \mathbf{x}^{(i)} + \varepsilon^{(i)}

并做一个关键假设:

ε(i)∼N(0,σ2)\varepsilon^{(i)} \sim \mathcal{N}(0, \sigma^2)

即噪声独立同分布、服从均值为 0、方差为 σ2\sigma^2 的正态分布——均值为 0 意味着噪声不偏不倚地上下扰动,而不是系统性地把预测抬高或压低。

这个假设一旦立起来,一个漂亮的结论就等在前头:在这个正态噪声模型下,最小二乘解恰好就是参数的极大似然估计。“平方损失”不再是拍脑袋选的——它是正态假设的自然产物。这个结论的完整推导,正是下一节《极大似然》的主角。

📝 动手练一练

  1. 几何理解巩固:设计矩阵 A=[121212]A = \begin{bmatrix}1 & 2 \\ 1 & 2 \\ 1 & 2\end{bmatrix},目标 y=[1,2,3]T\mathbf{y} = [1, 2, 3]^T。AA 的列空间是什么?y\mathbf{y} 在列空间上的投影是多少?残差向量是什么?验证残差与列空间正交。
👉 点击查看参考答案

AA 的两列线性相关(第二列是第一列的 2 倍),列空间只有一维,由 (1,1,1)T(1,1,1)^T 张成。

y\mathbf{y} 在其上的投影:

y^=y⋅(1,1,1)T(1,1,1)T⋅(1,1,1)T(1,1,1)T=63(1,1,1)T=(2,2,2)T\hat{\mathbf{y}} = \frac{\mathbf{y}\cdot(1,1,1)^T}{(1,1,1)^T\cdot(1,1,1)^T}(1,1,1)^T = \frac{6}{3}(1,1,1)^T = (2,2,2)^T

残差 e=y−y^=(−1,0,1)T\mathbf{e} = \mathbf{y} - \hat{\mathbf{y}} = (-1, 0, 1)^T。验证:e⋅(1,1,1)T=−1+0+1=0\mathbf{e}\cdot(1,1,1)^T = -1+0+1 = 0 ✓ 正交。

注意:ATAA^TA 此时是奇异矩阵,正规方程没有唯一解——这正是”特征完全共线”的几何形态(第 9 章岭回归将正面处理它)。

  1. 投影计算:观测三个点 (0,1.1)(0, 1.1)、(1,1.9)(1, 1.9)、(2,3.2)(2, 3.2)。构造设计矩阵,解正规方程求最小二乘直线,并验证残差与两列正交。
👉 点击查看参考答案

设计矩阵 X=[101112]X = \begin{bmatrix}1 & 0 \\ 1 & 1 \\ 1 & 2\end{bmatrix},y=(1.1,1.9,3.2)T\mathbf{y} = (1.1, 1.9, 3.2)^T。

XTX=[3335],XTy=[6.20×1.1+1×1.9+2×3.2]=[6.28.3]X^TX = \begin{bmatrix}3 & 3 \\ 3 & 5\end{bmatrix}, \qquad X^T\mathbf{y} = \begin{bmatrix}6.2 \\ 0\times1.1 + 1\times1.9 + 2\times3.2\end{bmatrix} = \begin{bmatrix}6.2 \\ 8.3\end{bmatrix}

解 [3335][θ0θ1]=[6.28.3]\begin{bmatrix}3 & 3 \\ 3 & 5\end{bmatrix}\begin{bmatrix}\theta_0 \\ \theta_1\end{bmatrix} = \begin{bmatrix}6.2 \\ 8.3\end{bmatrix}:行列式为 6,θ0=5×6.2−3×8.36=6.16≈1.0167\theta_0 = \frac{5\times6.2 - 3\times8.3}{6} = \frac{6.1}{6} \approx 1.0167,θ1=3×8.3−3×6.26=6.36=1.05\theta_1 = \frac{3\times8.3 - 3\times6.2}{6} = \frac{6.3}{6} = 1.05。

拟合直线 y=1.0167+1.05xy = 1.0167 + 1.05x。残差 (0.083, −0.167, 0.083)(0.083,\ -0.167,\ 0.083):求和为 0(与全 1 列正交 ✓),与 (0,1,2)(0,1,2) 的点积 0−0.167+0.166≈00 - 0.167 + 0.166 \approx 0 ✓。下一节将会看到:这条直线同时是噪声假设 ε∼N(0,σ2)\varepsilon\sim\mathcal{N}(0,\sigma^2) 下的极大似然估计。

本章小结

  • 选型:数据量在百万级以内、特征不多时直接用解析解;瓶颈在 (XTX)−1(X^TX)^{-1} 的求逆。数据巨大或模型复杂(无解析解)时才轮到梯度下降。
  • 几何视角:方程组有两种读法——行视角解是交点,列视角解是线性组合系数。无解时,最小二乘 = 在列空间找 y\mathbf{y} 的投影,残差垂直于整个列空间(点到平面,垂线最短)。
  • 正规方程的几何出身:ATe=0A^T\mathbf{e}=0 一步推出 θ∗=(ATA)−1ATy\theta^* = (A^TA)^{-1}A^T\mathbf{y},与求导法殊途同归;数值实验确认残差与列向量点积严格为零。
  • 概率视角:把残差建模为 ε∼N(0,σ2)\varepsilon \sim \mathcal{N}(0, \sigma^2) 的噪声。平方损失为何合理?——下一节极大似然揭晓它与正态假设的血缘关系。

📋 行动清单

  • 用列向量视角重写一个二元方程组,把”解”读成”线性组合的系数”,直到两种读法能自由切换
  • 在纸上画三维草图:列空间平面、平面外的 y\mathbf{y}、投影 y^\hat{\mathbf{y}}、垂直的残差 e\mathbf{e}——四者的关系就是本节全部
  • 运行正交性验证代码,把噪声标准差从 0.1 改成 1.0,观察估计参数的漂移与”点积仍为零”的不变
  • 带着”平方损失凭什么”的问题预习下一节《极大似然》

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第8章课件:线性模型
    下载
  • 第8章笔记:普通最小二乘(OLS)
    下载
  • 第8章代码包(Logistic Regression)
    下载