查看全课大纲(第 35 / 82 节)
- 1.函数与数据泛化
- 2.向量:从几何直觉到高维空间
- 3.矩阵与张量
- 4.特征值与特征向量:矩阵变换的不动方向
- 5.凸函数:从向量求导的矩阵记号到好优化的函数形状
- 6.概率与统计:机器学习的数学基础
- 7.独立性与随机变量:贝叶斯公式与二项分布
- 8.期望、方差与协方差:随机变量的数字画像
- 9.联合概率:当一条轴不够用的时候
- 10.概率分布(一):从伯努利到伽马函数
- 11.概率分布(二):贝塔、泊松、正态与两个贝叶斯故事
- 12.机器学习的模型:找输入与输出的关系
- 13.机器学习的应用
- 14.过拟合
- 15.机器学习的分类
- 16.有监督学习:从房价预测说起
- 17.损失函数
- 18.梯度下降(上):更新规则与学习速率
- 19.梯度下降(2)
- 20.牛顿方法
- 21.KNN简介
- 22.距离测算
- 23.朴素贝叶斯
- 24.朴素贝叶斯的实际应用
- 25.信息熵:决策树构建的度量基础
- 26.信息增益与决策树的构建
- 27.ID3算法
- 28.决策树节点的划分
- 29.CART树
- 30.Bagging
- 31.Boosting:自适应提升算法
- 32.Gradient Boosting
- 33.线性模型:回归与分类的同一副骨架
- 34.最小二乘:把最优参数直接解出来
- 35.最小二乘法的几何与概率视角
- 36.极大似然:给最小二乘一个概率出身
- 37.逻辑回归(1):把线性模型接到分类上
- 38.逻辑回归(2):损失函数与多分类
- 39.---- 手造数据: 5 个样本, 2 个特征; x2 几乎 = 2*x1 (偏差手工指定, 无随机) ----
- 40.讲师例: 向量 "23014" -- 三把范数尺子量同一个向量
- 41.优化方法(1):坐标下降与前向选择
- 42.优化方法(2):前向策略与最小角回归
- 43.拉格朗日乘子法(1):从无约束到等式约束
- 44.拉格朗日乘子法(2):等式约束下的平行条件与拉格朗日函数
- 45.拉格朗日乘子法(3):不等式约束与 KKT 条件
- 46.最大间隔:把分类问题变成优化问题
- 47.拉格朗日对偶问题:把 w 和 b 全部换成 α
- 48.支持向量:边界上的少数派
- 49.SVM 计算过程:一笔到底算完,再走进核方法
- 50.贝叶斯公式:概率即信念
- 51.隐含变量和概率模型:给看不见的原因建模
- 52.EM 算法:期望与最大化的迭代
- 53.琴生不等式:EM 的数学钥匙
- 54.三个硬币问题:EM 的复盘与衔接
- 55.高斯混合模型:用隐变量解释双峰数据
- 56.隐马尔可夫模型
- 57.隐马尔可夫模型(2):前向算法与动态混合模型
- 58.隐马尔可夫模型在 NLP 中的运用
- 59.EM 算法:把「为什么收敛」推到底
- 60.HMM 在 NLP 中的运用:从分词到机器翻译
- 61.HMM 参数估计:Baum-Welch 的三块拉格朗日
- 62.高维下的高斯模型
- 63.主题模型:从词袋到隐含主题
- 64.Dirichlet 分布(1)
- 65.Dirichlet 分布(2)
- 66.统计学习内容回顾
- 67.K-means 算法
- 68.PCA 降维
- 69.SVD 降维
- 70.从聚类到流形
- 71.局部线性嵌入
- 72.随机邻域嵌入:SNE 与 t-SNE
- 73.无参模型:让数据自己说话
- 74.高斯过程:函数空间里的正态分布
- 75.高斯过程(2):噪声、正则化与核的线性组合
- 76.神经网络简介:从感知器到自编码器
- 77.反向传播:把误差一层层传回去
- 78.卷积神经网络(CNN):让特征自己学出来
- 79.循环神经网络(RNN):给网络装上记忆
- 80.深度学习回顾:静态一类,动态一类
- 81.增强学习(1):蒙特卡洛、树搜索与 Q-learning
- 82.强化学习(2):从乌鸦吃核桃到井字棋的 value 回传
最小二乘法的几何与概率视角
约 38 分钟
小象实战讲义 · 机器学习算法精讲
上一节我们得到了最小二乘的解析解 。本节先回答一个现实问题——有了它,什么时候还需要梯度下降?然后换一副眼镜重新看最小二乘:在几何上,它是把目标向量投影到特征张成的空间;在概率上,它对应着一个关于噪声分布的假设。这两副眼镜,将陪我们看懂后面的岭回归、逻辑回归与极大似然。
💡 核心导读
- 选型:解析解与梯度下降各自的适用场景——瓶颈在矩阵求逆。
- 两种视角看方程组:行视角(每个方程一条线,解是交点)与列视角(解是列向量的线性组合)。
- 无解时的最优近似:三点拟合一条直线为什么”无解”?答案是把 投影到列空间,残差垂直于整个空间。
- 正交出正规方程: 一步推出 ,与求导法殊途同归。
- 概率视角:把残差看作噪声,假设 ——下一节极大似然将证明最小二乘解恰好是这个模型的最优估计。
解析解还是梯度下降?
上一节的两个工具——最小二乘(LMS 解析解)与梯度下降(GD)——都能求线性模型,什么时候用哪个?
- 数据量与维度都不大时(几千几万个样本、特征不多),直接用解析解。矩阵转置、矩阵相乘的计算量都与矩阵规模成多项式关系,现代计算机对付它们毫无压力。
- 真正的瓶颈是求逆。 中最难的一步就是 ——矩阵求逆需要大量的计算步骤,矩阵一大,代价急剧上升。
- 梯度下降是万能牌,但麻烦事不少:它对任何规模的数据都能用,但收敛可能慢,还面临收敛性问题,要选学习速率 —— 学不好还会震荡。
- 讲师的实用经验:对普通线性问题,数据不超过百万级时,现在的计算能力直接用矩阵解析解就好,不必上梯度下降;真正数据量巨大、或者以后遇到更复杂的模型(没有解析解)时,梯度下降才是更好的选择。
从方程组到向量空间:两种视角
行视角:解是交点
看一个最简单的方程组:
两式相加得 ,故 、。画图看:每个方程是平面上的一条直线( 过 与 ; 过 与 ),两条线相交于 ——解就是交点。
列视角:解是线性组合的系数
把它写成矩阵形式 :
把 的两列各看作一个向量:、,方程就变成了
换了个问法:把 拉伸 倍、 拉伸 倍,什么时候两者相加恰好等于 ?我们要求的就是这组”拉伸系数”。如果有解,说明 一定落在 、 张成的向量空间里。讲师现场画了这张图: 拉伸 1 倍、 拉伸 2 倍,合成出 ——解 的几何含义一目了然。
(顺带一提:国内教材习惯把向量写成行向量,而西方——比如 MIT 的线性代数课——默认列向量。本课程沿用列向量约定。)
无解时怎么办:投影
实际问题里,“恰好有解”是奢望。取三个点 、、,想拟合直线 (我们一直记 )。把三个条件写成方程组:
三个点不在同一条直线上,无论怎么画线都不可能同时穿过三点——方程无解。用列视角说: 是三维空间里的一个向量,而 的两个列向量 、 只能张成三维空间里的一个平面(二维子空间);不幸的是, 恰好不在这个平面里。
那退而求其次:在平面里找一个离 最近的向量 ,用它代替 。几何常识告诉我们:点到平面最短的线段是垂线——按三角原则,平面上任何其他点到 的距离都比垂足远。这个垂足就是 在列空间上的投影 ,而垂线段本身就是一个新向量:
它就是”误差向量”(残差)。最小二乘法的几何意义就此登场:在列空间中找 的投影,使残差向量最短。
正交性条件与正规方程
投影有一个天然的副产品:残差垂直于整个列空间。既然 垂直于平面里的每一个方向,它自然与 的每一列正交:
两条合并成矩阵形式,就是著名的正交性条件:
移项整理,得到正规方程:
与我们上节辛苦求导得到的是同一个公式——但它不需要从零开始一步步推导,只需要把最小二乘”翻译”成几何语言,答案自己浮现出来。用列向量形式理解方程组、把无解问题化成投影问题、让残差与列空间垂直——这三步是讲师反复强调的关键点。
数值验证:残差真的与列正交吗
用一小段纯 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,这不是笔误:它实际是约 的浮点残渣,格式化后带上了负号。这正是”数学上为零、机器上有毛边”的真实样子。无论数据怎么带噪声,最小二乘解的残差永远与列空间正交——几何视角给的不是近似,是构造保证。
概率视角:给误差安一个分布
几何视角回答了最小二乘”在做什么”,概率视角回答”凭什么合理”。我们重新看待手头的数据:现实观测从来不是一条完美的直线,每个观测点都上下浮动——讲师把这些浮动直接建模成噪声。给每个样本写上误差项:
并做一个关键假设:
即噪声独立同分布、服从均值为 0、方差为 的正态分布——均值为 0 意味着噪声不偏不倚地上下扰动,而不是系统性地把预测抬高或压低。
这个假设一旦立起来,一个漂亮的结论就等在前头:在这个正态噪声模型下,最小二乘解恰好就是参数的极大似然估计。“平方损失”不再是拍脑袋选的——它是正态假设的自然产物。这个结论的完整推导,正是下一节《极大似然》的主角。
📝 动手练一练
- 几何理解巩固:设计矩阵 ,目标 。 的列空间是什么? 在列空间上的投影是多少?残差向量是什么?验证残差与列空间正交。
👉 点击查看参考答案
的两列线性相关(第二列是第一列的 2 倍),列空间只有一维,由 张成。
在其上的投影:
残差 。验证: ✓ 正交。
注意: 此时是奇异矩阵,正规方程没有唯一解——这正是”特征完全共线”的几何形态(第 9 章岭回归将正面处理它)。
- 投影计算:观测三个点 、、。构造设计矩阵,解正规方程求最小二乘直线,并验证残差与两列正交。
👉 点击查看参考答案
设计矩阵 ,。
解 :行列式为 6,,。
拟合直线 。残差 :求和为 0(与全 1 列正交 ✓),与 的点积 ✓。下一节将会看到:这条直线同时是噪声假设 下的极大似然估计。
本章小结
- 选型:数据量在百万级以内、特征不多时直接用解析解;瓶颈在 的求逆。数据巨大或模型复杂(无解析解)时才轮到梯度下降。
- 几何视角:方程组有两种读法——行视角解是交点,列视角解是线性组合系数。无解时,最小二乘 = 在列空间找 的投影,残差垂直于整个列空间(点到平面,垂线最短)。
- 正规方程的几何出身: 一步推出 ,与求导法殊途同归;数值实验确认残差与列向量点积严格为零。
- 概率视角:把残差建模为 的噪声。平方损失为何合理?——下一节极大似然揭晓它与正态假设的血缘关系。
📋 行动清单
- 用列向量视角重写一个二元方程组,把”解”读成”线性组合的系数”,直到两种读法能自由切换
- 在纸上画三维草图:列空间平面、平面外的 、投影 、垂直的残差 ——四者的关系就是本节全部
- 运行正交性验证代码,把噪声标准差从 0.1 改成 1.0,观察估计参数的漂移与”点积仍为零”的不变
- 带着”平方损失凭什么”的问题预习下一节《极大似然》
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。