查看全课大纲(第 34 / 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 回传
最小二乘:把最优参数直接解出来
约 32 分钟
小象实战讲义 · 机器学习算法精讲
上一节末尾留了一个悬念:求线性模型的参数,其实可以不走梯度下降——把问题写成向量形式,直接解出来。本节兑现这个承诺。我们把 个训练样本看成一个线性方程组,装进三个矩阵;把损失函数展开成一条三项式;再借助向量求导的阶梯公式,一步走到著名的正规方程与最小二乘解析解。推导不短,但每一步只用转置、乘法与求导——跟上节奏,你会发现”直接解”比想象中平易近人。
💡 核心导读
- 残差量的是哪个方向:y 方向的差与垂直距离之间只差一个由夹角决定的常数,两种量法不改变对 的估计。
- 从方程组到矩阵三件套: 个样本就是 个方程;设计矩阵 (,行=样本、列=特征)、参数 、目标 ,一行矩阵乘法 写尽全部方程。
- 展开与合并: 展开成三项,中间两项靠”标量的转置还是自己”合并成 。
- 求导三级阶梯:从乘积法则 出发,经特例 ,推广到 ——一路通往正规方程 与解析解。
先回答一个问题:残差量的是哪个方向
回顾一下损失函数。对于线性拟合,cost function 是:
画图看:给定输入 ,预测值 是函数图像上的一个点, 是真实目标点,两者的误差是竖直方向上的一小段——每一次都这样量。
可能有同学会问:实际上的点到直线的距离并不是这么算的,还可以求 perpendicular distance——垂直距离。那我们为什么不算”真正的距离”?
讲师的回答分两层。第一,求垂直距离当然也完全没有问题;第二,竖直方向的差与垂直距离之间满足一个常数倍数关系,这个常数由这条线的夹角决定。关键在于:给定了一个 的方程, 就定了,夹角也随之固定——所以无论算直线距离还是垂线距离,两种目标对 的”排序”完全一致,不会改变关于 的估计。所以不必执着于垂直距离;几何上”点到线”讲究垂直,而我们每次实际算的,就是 y 轴方向上的差。
记号约定:以讲义为准
动手推导前,先声明记号。本课程所有章节统一 notation: 从 1 到大 ,代表 组数据;每一个 属于 维向量空间——这一点每一节课都强调。课件里偶尔借用网上或其他来源的图,那些图的记号与我们的不完全一样;遇到不一致时,以讲义里写的为准。
这套记号从第 4 章一路用到现在:大 记样本数,小 记特征维度, 收编偏置 。
从数据到线性方程组
现在从头开始推:如果不用梯度下降,我们怎么解出最优估计?
给定数据 :。给定一个线性函数 。如果我们”奢望”模型完美命中每一个样本—— 输进来得到 、 输进来得到 、一直到大 ——那我们实际上列出了一个线性方程组:
个方程、 个未知数。我们一直在做的事——不断调整 使输入对上输出——本质上就是解这个线性方程组。
装进矩阵:三件套
方程组写起来啰啰嗦嗦、麻麻烦烦。为了把它收拢,我们给 也配上一个 ——而 ,取值不变,纯粹为了形式统一、矩阵看着完整。于是定义三个矩阵:
称为设计矩阵。读它的方式:每一行代表一个数据(第一行是第一个 example,第二行是第二个……第 行是第 个);每一列代表一个特征部分——第一列全是 1( 的部分),第二列是 的部分,依此类推。
做一遍维度检查: 是 (第一列 ,加上 到 共 列); 是 的列向量; 是 。于是:
完全符合矩阵乘法,整条方程组被一行式子收编:
损失函数的矩阵形式
我们想解出 ,但心里始终记着:这个方程组未必有解,我们真正要的是损失最小。以前的损失函数是每个样本误差的平方和:
换成矩阵记号,它有一个更紧凑的写法。 乘出来是一个 的列向量,减去 还是列向量——每一行都是一个误差;误差的平方和,恰好就是这个向量的模的平方:
这里的模取的是 范数。范数家族——、、、——第 5 章讲距离测算时已经学过。而 模的平方有个方便的性质:向量乘上自己的转置。对列向量 , 就是各分量的平方和。
展开:三条路走成一条
现在把 展开成能求导的形式。先把模平方写成转置相乘:
把转置放进括号里——记住转置要倒序:,于是:
像普通代数一样展开(但矩阵分左乘右乘,顺序不能搞混):
看中间两项。 的维度流转: 是 , 是 , 是 —— 相消、 相消,最后是 ,一个标量。标量的转置等于它自己:
所以中间两项是同一个数,合并:
二次项、一次项、常数项——一条标准的三项式。
求导置零:三级阶梯
想求 的最优解,回到最朴素的微积分:给定一个函数,最优解基本停留在导数为 0 的位置。梯度下降的走法是先随机放一个 ,看梯度方向,不断调整,一步步逼近最完美的结果;而我们现在直接求”导数为 0”——殊途同归,但一步到位。
对 求导,三项里最难的正是二次项 。讲师为此搭了一座三级阶梯(公式的严格证明属于数学课的范围,本课直接使用,细节可参考数学基础部分)。
第一级:向量版的乘积法则。 若 、 都是关于 的函数:
这就是”两个变量相乘的组合函数怎么求导”在向量世界的翻版。
第二级:特例 。 把 、 都取成 :
第三级:中间垫一个方阵 。 把 换成 ( 是方阵):
为什么 必须是方阵?因为矩阵与它的转置要能相加,必须同形——行列相等,只有方阵满足。
现在把阶梯搭到我们的二次项上。取 、:它恰好是方阵,而且对称——,转置翻过来还是它自己。于是 :
一次项里 与 无关,常数项求导为零。三项合起来:
正规方程与解析解
令导数为零:
系数 2 直接约掉,得到正规方程(Normal Equation):
若 可逆,两边左乘它的逆,最优参数一步解出:
不需要学习速率、不需要迭代、不需要初值——只要 与 本身,矩阵运算直接给出最好估计的 。
数值验证:推导的每一环都亲手过一遍
用一小段纯 Python(手写矩阵运算,零第三方库)验证本节推导的每个环节:构造 5 个样本( 大致沿 分布、带手工噪声),解正规方程,检查三种写法的 是否相等、解处梯度是否为零、以及扰动后损失是否上升。
# 数值验证:正规方程推导的每一步
# 数据:5 个样本(x 从 0 到 4),y 大致沿 y = 2x + 1 分布,带少量手工噪声
x = [0, 1, 2, 3, 4]
y = [1.0, 2.9, 5.2, 6.8, 9.1]
# 设计矩阵 A:第一列全 1(对应 x0 = 1 的约定),第二列为 x
A = [[1.0, xi] for xi in x]
# 矩阵运算三件套(纯 Python 手写,不依赖任何库)
def transpose(M):
return [list(col) for col in zip(*M)]
def mat_mult(M, N):
return [[sum(M[i][k] * N[k][j] for k in range(len(N)))
for j in range(len(N[0]))] for i in range(len(M))]
def mat_vec(M, v):
return [sum(M[i][k] * v[k] for k in range(len(v))) for i in range(len(M))]
def dot(v1, v2):
return sum(a * b for a, b in zip(v1, v2))
# ---- 第一步:正规方程的两个构件 A^T A 与 A^T y ----
AT = transpose(A)
ATA = mat_mult(AT, A)
ATy = [dot(row, y) for row in AT]
print("设计矩阵 A(5 行 2 列,行=样本,列=[x0, x1]):")
for row in A:
print(" ", row)
print("A^T A =", ATA)
print("A^T y =", ATy)
# ---- 第二步:解 2x2 正规方程(克莱姆法则)----
det = ATA[0][0] * ATA[1][1] - ATA[0][1] * ATA[1][0]
theta0 = (ATA[1][1] * ATy[0] - ATA[0][1] * ATy[1]) / det
theta1 = (ATA[0][0] * ATy[1] - ATA[1][0] * ATy[0]) / det
theta = [theta0, theta1]
print(f"\ndet(A^T A) = {det}")
print(f"最小二乘解: theta0 = {theta0}, theta1 = {theta1}")
# ---- 第三步:三种写法的 J(theta) 必须相等 ----
# 写法一:残差平方和(定义)
y_hat = [theta0 + theta1 * xi for xi in x]
resid = [yi - h for yi, h in zip(y, y_hat)]
J1 = sum(r * r for r in resid)
# 写法二:||A*theta - y||^2(范数形式)
r_vec = [row[0] * theta[0] + row[1] * theta[1] - yi for row, yi in zip(A, y)]
J2 = dot(r_vec, r_vec)
# 写法三:theta^T A^T A theta - 2 theta^T A^T y + y^T y(推导中的展开式)
J3 = dot(theta, mat_vec(ATA, theta)) - 2 * dot(theta, ATy) + dot(y, y)
print(f"\n三种写法的 J(theta_hat):")
print(f" 残差平方和 = {J1:.10f}")
print(f" ||A*theta - y||^2 = {J2:.10f}")
print(f" 展开式(三项代数式) = {J3:.10f}")
# ---- 第四步:梯度在 theta_hat 处应为零向量 ----
grad = [2 * g for g in [ATA[0][0] * theta[0] + ATA[0][1] * theta[1] - ATy[0],
ATA[1][0] * theta[0] + ATA[1][1] * theta[1] - ATy[1]]]
print(f"\n梯度 2A^T A theta - 2A^T y 在解处的取值: [{grad[0]:.3e}, {grad[1]:.3e}]")
# ---- 第五步:扰动证明这是最低点(碗底) ----
theta_p = [theta0 + 0.3, theta1 - 0.2]
y_hat_p = [theta_p[0] + theta_p[1] * xi for xi in x]
J_p = sum((yi - h) ** 2 for yi, h in zip(y, y_hat_p))
print(f"\n扰动后 theta' = ({theta_p[0]:.2f}, {theta_p[1]:.2f}) 的 J(theta') = {J_p:.6f}(大于 {J1:.6f})")
print("\n逐点预测对比:")
for xi, yi, h, r in zip(x, y, y_hat, resid):
print(f" x={xi}, y={yi}, y_hat={h:.2f}, 残差={r:+.2f}")设计矩阵 A(5 行 2 列,行=样本,列=[x0, x1]):
[1.0, 0]
[1.0, 1]
[1.0, 2]
[1.0, 3]
[1.0, 4]
A^T A = [[5.0, 10.0], [10.0, 30]]
A^T y = [25.0, 70.1]
det(A^T A) = 50.0
最小二乘解: theta0 = 0.98, theta1 = 2.01
三种写法的 J(theta_hat):
残差平方和 = 0.0990000000
||A*theta - y||^2 = 0.0990000000
展开式(三项代数式) = 0.0990000000
梯度 2A^T A theta - 2A^T y 在解处的取值: [0.000e+00, 0.000e+00]
扰动后 theta' = (1.28, 1.81) 的 J(theta') = 0.549000(大于 0.099000)
逐点预测对比:
x=0, y=1.0, y_hat=0.98, 残差=+0.02
x=1, y=2.9, y_hat=2.99, 残差=-0.09
x=2, y=5.2, y_hat=5.00, 残差=+0.20
x=3, y=6.8, y_hat=7.01, 残差=-0.21
x=4, y=9.1, y_hat=9.02, 残差=+0.08五个环节全部兑现:、 都能手算复核(、、、);解 恰好贴着生成数据的真实关系 ;三种写法的 严格相等();解处梯度精确为零(连浮点毛边都没有);往旁边挪一步,损失从 涨到 ——碗底名副其实。
方程解不出来怎么办
最后把话说完整。 这个方程组,有的时候是解不出来的——要看小 与大 的数量关系,要看 这个矩阵是否满秩的各种情况。
但注意我们的态度:我们并不关心怎么把它”精确解”出来,因为我们本来就不是真的在解这个方程。把 代回模型、把每个 输进去算出来的,是一组 (读作 y hat——hat 就是帽子,表示对 的估计)。我们真正期待的,是所有 的平方和在一切可能下最小。损失最小,才是我们的目标;“解方程”只是这个目标在理想情形下的巧合。
这套方法的名字:least mean square——中文就是最小二乘法。本节从代数上把它推了出来;下一节将换两副眼镜重新看它——几何上它是投影,概率上它连着极大似然。
📝 动手练一练
- 标量合并的维度论证:设 为 、 为 、 为 。(a) 写出 的完整维度流转,确认它是标量;(b) 用”标量的转置等于自己”证明 ;(c) 思考:为什么 的展开式里,只有中间两项可以合并,而首尾两项不行?
👉 点击查看参考答案
(a) 是 , 是 , 是 :,再 ——标量。
(b) 同样是 的标量;而 (转置倒序),标量转置不变,所以两者相等——它们是同一个数,合并成 。
(c) 中间两项 与 互为转置且都是标量,可以合并;首项 里 出现两次(对 是二次的),尾项 与 无关(常数),各自”身份”不同,没有可合并的对象。
- 共线性手算:设计矩阵 (第三个特征恒等于第二个特征的 2 倍)。计算 与它的行列式,判断正规方程是否有唯一解;并说说第 9 章的岭回归打算怎么救场。
👉 点击查看参考答案
按第一行展开:。
行列式为零, 奇异、不可逆——正规方程没有唯一解。原因是 的第三列恒等于第二列的 2 倍(列线性相关),矩阵秩不满——“特征完全共线”就是 不可逆最典型的现实来源;第 9 章的岭回归会在 的对角线上加一个 (),强行恢复可逆性,顺便抑制过拟合。
本章小结
- 残差的方向:竖直方向的差与垂直距离差一个由夹角决定的常数倍——给定 夹角固定,两种量法不改变对 的估计,所以直接用 y 方向的差。
- 矩阵三件套: 个样本即 个方程;(,行=样本、列=特征)、()、(), 一行写尽。
- 损失函数矩阵化与展开:,中间两项靠标量转置合并。
- 求导三级阶梯:乘积法则 特例 推广 ; 对称,导数 ,置零得正规方程 ,解出 。
- 态度:方程组可能无解(要看 、 与满秩),但我们不追求”精确解方程”——要的是 最小。这套方法叫 least mean square,最小二乘法。
📋 行动清单
- 默写正规方程 ,并口头报出 、、 三者的维度
- 不看讲义重推一遍三级阶梯:,并说清 必须为方阵、 对称的原因
- 手算本节数据的 与 (、、),与代码输出对账
- 预习下一节:最小二乘的几何视角(投影)与概率视角(高斯噪声)
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。