查看全课大纲(第 62 / 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 回传
高维下的高斯模型
约 25 分钟
小象实战讲义 · 机器学习算法精讲
在前几次课中,我们已经引入了生成式模型(Generative Model)的基本概念,并学习了三硬币模型、高斯混合模型(GMM)等分层概率图模型。本节课,我们深入探讨生成式模型在高维空间下的核心工具——多元高斯分布:理解其几何意义、协方差矩阵的作用,以及如何用它进行分类。这也是本章主线「主题模型」的数学基础,下一节我们正式展开。
💡 核心导读
- 生成式与判别式学习:回顾两者的核心区别——判别式模型直接学习条件概率 ,而生成式模型学习联合概率 ,旨在理解数据是如何生成的。
- 多元高斯分布:将一维高斯推广到高维,其形态由均值向量 和协方差矩阵 决定,从”钟形曲线”变为”草帽形”曲面。
- 协方差矩阵的几何:对角线元素描述各维度的方差,非对角元素(协方差)决定椭圆/椭球的倾斜方向与扁平程度——主轴方向正是协方差矩阵特征向量的方向。
- 高斯判别分析:作为生成式分类器,为每个类别建立一个高斯模型,通过比较数据由哪个类别生成的概率更高来进行分类,其决策边界由两个高斯的参数共同决定。
生成式与判别式学习回顾
机器学习模型有多种分类方式。最常见的是根据有没有标签,分为监督学习(supervised learning)、无监督学习(unsupervised learning)和强化学习(reinforcement learning)等。另一个重要的角度,是从数据建模的本源出发,把模型分成判别式模型(Discriminative Model)和生成式模型(Generative Model)。
判别式模型的目标是直接学习从输入空间 到标签 的映射关系,即条件概率分布 。它不关心数据是如何产生的,只专注于找到最佳的决策边界:我们构造一个代价函数(cost function),通过优化它来得到模型。我们学过的线性回归、逻辑回归都属于判别式学习。
生成式模型则试图学习数据 和标签 的联合概率分布 。它的核心思想是:假设观测到的数据是由某种潜在的概率分布”生成”出来的,通过估计这个生成过程的参数(例如使用极大似然估计),我们就能对整个数据生成机制有清晰的理解——数据背后形成的道理搞清楚了,预测、分析都能做。有了联合分布,我们还可以利用贝叶斯公式推导出条件分布 进行预测,两者是一回事。
我们前面学过的模型里,求极大似然、贝叶斯学习、朴素贝叶斯、隐马尔可夫模型(HMM),以及最早讲的三硬币模型,都属于生成式模型。以三硬币模型为例:硬币 A 以参数 决定选硬币 B 还是 C,而 B、C 各自是一个完整的伯努利分布——用 HMM 的话说,各自有自己的释放概率。于是给定参数 时,观测 的分布是
它看起来复杂,但仍然是一个混合模型。把其中的伯努利释放概率换成正态分布 ,就得到了高斯混合模型。这些都是分层(Hierarchical)概率图模型:可观测的随机变量 之上有一个隐含变量 ,而 还可以有自己的参数、参数又可以服从某些分布——层状结构可以有两层、三层乃至更多。本章要讲的经典层状概率模型就是主题模型(Topic Model),这是下一节的内容。
为何钟爱高斯分布?
在生成式建模中,当我们对数据的真实分布一无所知时,常常假设它服从高斯分布。这并非随意选择,而是基于坚实的数学基础——中心极限定理。
先看一条具体的路径:伯努利分布描述单次掷硬币,把它独立重复 次就是二项分布。比如射箭命中概率是 0.3,那么射 10 箭里恰好中 3 箭、中 6 箭的概率各是多大?这就是”在 次里取 次成功”的二项分布问题。当 不断增大趋于无穷时,二项分布的形状会逼近正态分布——钟形曲线就这样浮现出来。
中心极限定理本身说得更一般:大量相互独立的随机变量(不要求同分布,甚至可以混着离散分布)之和或均值,随着变量个数增加,分布会趋近于高斯分布。比如 各有自己的分布,其中一个甚至可能是离散的,把它们每次的采样聚合起来取均值,结果就趋近正态。这也解释了现实世界中许多现象的分布都近似高斯:一个人的今天是无数次对错选择的累积结果——一直做对的选择才能走到最右边,一直做错才能到最左边,大部分人则在对错相间中落回中间最多的部分。
此外,高斯分布具有良好的数学性质:
- 可加性:独立高斯变量的和仍是高斯分布。
- 边缘分布与条件分布:多元高斯分布的边缘分布和条件分布仍然是高斯分布——把每个维度叠加起来求边缘,得到的仍是正态。
- 最大熵:在给定均值和方差的约束下,高斯分布是具有最大熵的分布,这意味着它做出的假设最少,最为”保守”。
多元高斯分布:从钟形曲线到高维草帽
机器学习处理的数据大多是高维空间的,所以我们要熟悉基本函数在高维空间中的形态。第一类是线性函数:一维空间里是一条直线,推广到二维是一个平面、三维是更高维的面,总之是一个线性分割面。第二类就是本节的主角——高斯函数:一维是钟形曲线,到了二维空间,它就变成一个类似”草帽”的曲面,而且随着参数不同可以是形状各异的草帽。
这个草帽曲面在 轴方向上的投影是一个一维高斯,在 轴方向上的投影也是一个一维高斯。把整个曲面往底下的 - 平面上投影,会得到一圈圈等高线(contour),这些等高线是椭圆;三维及以上则是超曲面,等高线是椭球体。
一维高斯分布的概率密度函数(PDF)由均值 和方差 参数化。在 维空间中,多元高斯分布的 PDF 定义如下:
其中:
- 是一个 维随机向量。
- 是均值向量——单个随机变量时我们求均值和方差,两个随机变量时均值变成二维向量、方差升级为协方差矩阵。
- 是协方差矩阵,它是一个对称的半正定矩阵, 表示其行列式。相比一维公式中的 ,这里 的位置换成了矩阵,需要对 求行列式再开方;指数上的 则升级为转置乘逆矩阵再乘向量的二次型,最终得到一个具体的数。
协方差矩阵是理解多元高斯形态的关键:
- 对角线元素 是第 维的方差,控制该维度上的”胖瘦”。
- 非对角线元素 ()是第 维和第 维的协方差,控制椭圆/椭球的倾斜方向和程度。比如 表示两个维度正相关;把 0.5 加大到 0.8,相关性更强,椭圆就更扁、方向性更强;换成 、 则变成负相关,椭圆从另一个角度倾斜。
具体来说:
- 若 是对角阵且对角线元素相等(如 或 ),两个维度独立、方差相同,等高线是完美的圆。
- 若非对角线非零,两个变量有关联,等高线变成有方向的椭圆——正相关时 增大 跟着增大,负相关时 增大 减小。这个方向不是偶然的:它正是协方差矩阵特征值分解后特征向量的方向。
下面我们用代码来示意(通过在网格上搜索密度接近目标值的点)不同协方差矩阵对应的二维高斯分布等高线形态。
import math
def multivariate_gaussian_pdf(x, mu, sigma):
"""计算二维高斯分布的概率密度(未归一化的核心部分,用于比较)"""
# 简化计算:只计算指数部分,因为比较密度相对值时归一化常数抵消
x0, x1 = x[0] - mu[0], x[1] - mu[1]
a, b, c, d = sigma[0][0], sigma[0][1], sigma[1][0], sigma[1][1]
det = a * d - b * c
if abs(det) < 1e-10:
return 0.0
inv = [[d/det, -b/det], [-c/det, a/det]]
quad = x0 * (inv[0][0]*x0 + inv[0][1]*x1) + x1 * (inv[1][0]*x0 + inv[1][1]*x1)
exp_arg = -0.5 * quad
exp_arg = max(min(exp_arg, 500), -500) # 对指数限幅,防止溢出
return math.exp(exp_arg)
def find_contour_points(mu, sigma, target_density, grid_range=(-1.5, 1.5), step=0.2):
"""在网格上搜索,找到密度接近target_density的点,用于示意等高线"""
points = []
lo, hi = grid_range
x = lo
while x <= hi:
y = lo
while y <= hi:
density = multivariate_gaussian_pdf((x, y), mu, sigma)
if abs(density - target_density) < 0.05: # 允许一定误差
points.append((round(x, 1), round(y, 1)))
y += step
x += step
# 去重后取前10个点作为示例
unique_points = list(dict.fromkeys(points))
return unique_points[:10]
# 均值设为原点
mu = (0.0, 0.0)
# 目标密度值(取单位阵下 (1, 0) 处的指数部分,位于峰值和尾部之间)
target_density = multivariate_gaussian_pdf((1.0, 0.0), mu, [[1, 0], [0, 1]])
print(f"目标密度值(近似): {target_density:.4f}\n")
# 定义不同的协方差矩阵
sigma_configs = {
"圆形": [[1, 0],
[0, 1]],
"正相关椭圆": [[1, 0.8],
[0.8, 1]],
"负相关椭圆": [[1, -0.8],
[-0.8, 1]],
"各向异性椭圆": [[2, 0],
[0, 0.5]]
}
for name, sigma in sigma_configs.items():
points = find_contour_points(mu, sigma, target_density)
print(f"协方差矩阵{name} {sigma} 的等高线点示例:")
print(points)
print()目标密度值(近似): 0.6065
协方差矩阵圆形 [[1, 0], [0, 1]] 的等高线点示例:
[(-0.9, -0.5), (-0.9, -0.3), (-0.9, 0.3), (-0.9, 0.5), (-0.7, -0.7), (-0.7, 0.7), (-0.5, -0.9), (-0.5, 0.9), (-0.3, -0.9), (-0.3, 0.9)]
协方差矩阵正相关椭圆 [[1, 0.8], [0.8, 1]] 的等高线点示例:
[(-0.9, -0.9), (-0.9, -0.5), (-0.7, -0.1), (-0.5, -0.9), (-0.5, 0.1), (-0.3, 0.3), (-0.1, -0.7), (-0.1, 0.5), (0.1, -0.5), (0.1, 0.7)]
协方差矩阵负相关椭圆 [[1, -0.8], [-0.8, 1]] 的等高线点示例:
[(-0.9, 0.5), (-0.9, 0.9), (-0.7, 0.1), (-0.5, -0.1), (-0.5, 0.9), (-0.3, -0.3), (-0.1, -0.5), (-0.1, 0.7), (0.1, -0.7), (0.1, 0.5)]
协方差矩阵各向异性椭圆 [[2, 0], [0, 0.5]] 的等高线点示例:
[(-1.5, -0.1), (-1.5, 0.1), (-1.3, -0.3), (-1.3, -0.1), (-1.3, 0.1), (-1.3, 0.3), (-1.1, -0.5), (-1.1, 0.5), (-0.9, -0.5), (-0.9, 0.5)]从输出可以看到(受网格步长与容差限制,点是近似的等高线采样):
- 圆形:等高线上的点到原点的距离基本一致(约 1.0~1.1,如 (-0.7, -0.7) 与 (-0.9, -0.5)),各方向”胖瘦”相同,等高线是一个圆。
- 正相关椭圆:横纵坐标同号的点(如 (-0.9, -0.9)、(-0.5, -0.9))落在离原点更远的位置,而异号的点(如 (-0.5, 0.1)、(0.1, -0.5))更靠近原点——等高线沿 方向被拉长。
- 负相关椭圆:恰好相反,异号的点(如 (-0.9, 0.9)、(-0.5, 0.9))更远—— 增大时 减小,等高线沿 方向拉长。
- 各向异性椭圆: 方向方差大(2)、 方向方差小(0.5),点在 方向延伸到 ,而 方向只到 ——一个沿 轴拉长的扁平椭圆。
这些倾斜方向正是各自协方差矩阵特征向量的方向:正相关矩阵 的特征向量恰好是 与 方向。
高斯判别分析:生成式分类
高斯判别分析(Gaussian Discriminant Analysis, GDA)是生成式分类的一个典型例子。假设我们有一个二分类问题,标签 服从伯努利分布 。对于每个类别 (),其特征 服从一个多元高斯分布:
生成式模型学习的是联合分布 。在预测时,对于新样本 ,我们计算它由每个类别生成的后验概率: 并选择概率最大的类别。这也回答了课件上的问题:基于”我的生成假设,哪个类别最可能生成这个信号”——判别式算法则根本不关心数据是怎么生成的。
一个重要的特例是当两个类别的协方差矩阵相同时,即 。此时,决策边界(即后验概率相等 的点集)是一个线性超平面;当两类先验也相等时,它就是”垂直平分”两个均值之间连线的中垂面(严格说是在 度量下的中垂面;协方差为单位阵时就是欧氏中垂面)。如果协方差矩阵不同,决策边界则是一个二次曲面。
直观理解这个边界:两个高斯密度相等的点集上,一条等高线划到某个密度值,另一条也划到同样的密度值,两线重合之处就是分界。如果两类不仅均值不同、离散程度也不同——比如一个的协方差是 、另一个是 ,都是圆但密度不同——分界线就会向密度小的那一侧偏移;如果是两个形状不同的椭圆,分界线就是它们的相交曲线。
下面我们通过一个极简的二维例子,验证当两个高斯分布均值不同、协方差相同时,两均值连线的中点即为决策边界上的点。
import math
def gaussian_pdf_2d(x, mu, sigma):
"""计算二维高斯PDF的对数(数值更稳定)"""
x0, x1 = x[0] - mu[0], x[1] - mu[1]
a, b, c, d = sigma[0][0], sigma[0][1], sigma[1][0], sigma[1][1]
det = a * d - b * c
if abs(det) < 1e-12:
return -float('inf')
inv = [[d/det, -b/det], [-c/det, a/det]]
quad = x0 * (inv[0][0]*x0 + inv[0][1]*x1) + x1 * (inv[1][0]*x0 + inv[1][1]*x1)
# 对数PDF = -0.5*quad - 0.5*log(det) - log(2*pi),常数项在比较时可忽略
return -0.5 * quad # 忽略常数项,因为只比较大小
def find_decision_boundary_point(mu_a, mu_b, sigma, search_points):
"""在给定的候选点中,寻找两个高斯对数密度最接近的点"""
best_point = None
min_diff = float('inf')
for point in search_points:
log_p_a = gaussian_pdf_2d(point, mu_a, sigma)
log_p_b = gaussian_pdf_2d(point, mu_b, sigma)
diff = abs(log_p_a - log_p_b)
if diff < min_diff:
min_diff = diff
best_point = point
return best_point, min_diff
# 定义两个高斯:均值不同,协方差相同(单位阵)
mu_a = [0.0, 1.0] # 类别A的均值
mu_b = [0.0, -1.0] # 类别B的均值
sigma = [[1.0, 0.0], [0.0, 1.0]] # 相同的协方差矩阵
print("高斯A均值:", mu_a)
print("高斯B均值:", mu_b)
print("协方差矩阵(相同):", sigma)
# 生成一组在连接两个均值的线段上的候选点 (参数化: p(t) = mu_a + t*(mu_b - mu_a), t in [0,1])
candidate_points = []
for i in range(11): # t从0到1,步长0.1
t = i / 10.0
x = mu_a[0] + t * (mu_b[0] - mu_a[0])
y = mu_a[1] + t * (mu_b[1] - mu_a[1])
candidate_points.append((x, y))
# 寻找决策边界点
boundary_point, diff = find_decision_boundary_point(mu_a, mu_b, sigma, candidate_points)
print(f"找到的决策边界点: ({boundary_point[0]:.1f}, {boundary_point[1]:.1f})")
# 计算对应的t值
if abs(mu_b[1] - mu_a[1]) > 1e-10:
t_param = (boundary_point[1] - mu_a[1]) / (mu_b[1] - mu_a[1])
print(f"参数 t: {t_param}")
mid_point = [(mu_a[0]+mu_b[0])/2, (mu_a[1]+mu_b[1])/2]
print(f"理论中点坐标: ({mid_point[0]}, {mid_point[1]})")
print(f"是否接近中点? {abs(boundary_point[0]-mid_point[0])<1e-10 and abs(boundary_point[1]-mid_point[1])<1e-10}")高斯A均值: [0.0, 1.0]
高斯B均值: [0.0, -1.0]
协方差矩阵(相同): [[1.0, 0.0], [0.0, 1.0]]
找到的决策边界点: (0.0, 0.0)
参数 t: 0.5
理论中点坐标: (0.0, 0.0)
是否接近中点? True代码验证了:当两个高斯分布协方差矩阵相同时,其决策边界点恰好位于两个均值连线的中点上。
把维度递进串起来会看到清晰的图景:一维高斯的”分界”是一个点(点的左边和右边各归一类);二维高斯的分界是一条线,平面上的等高线是圆/椭圆;三维高斯实际是四维空间里的曲面,映射到三维空间里的等高线是椭球,此时协方差矩阵是 的矩阵,分界面是一个二维平面(协方差矩阵不同时则是弯曲的曲面)。这也体现了生成式模型可以捕捉更复杂数据关系的能力。
📝 动手练一练
- 概念辨析:假设我们使用高斯判别分析(GDA)对一个二分类数据集进行建模,并发现两个类别的协方差矩阵估计值非常不同。如果我们强制令两个类别的协方差矩阵相等,然后重新训练模型,你认为模型的决策边界会如何变化?模型的偏差(Bias)和方差(Variance)可能会怎样变化?
👉 点击查看参考答案
参考答案:
- 决策边界变化:强制使用相同的协方差矩阵会使决策边界从二次曲面变为线性超平面。这简化了模型,但可能无法再精确拟合原本由不同协方差所描述的数据分布形状,导致决策边界变得”更直”。
- 偏差与方差:简化模型(减少参数数量)通常会增加模型的偏差,因为模型假设的限制变强了(假设两类数据形状相同),可能无法充分拟合数据的真实复杂性。同时,简化模型通常会降低模型的方差,因为对训练数据中特定噪声的敏感性降低,模型更稳定。这是一种典型的偏差-方差权衡(Bias-Variance Tradeoff)。如果数据真实情况确实是协方差不同,那么强制相同会导致欠拟合;如果数据协方差本就相近,则简化模型可能是有益的正则化。
- 动手验证:修改上面”高斯判别分析”部分的代码,将两个高斯分布的协方差矩阵改为不同的值,例如令
sigma_a = [[2, 0], [0, 0.5]],sigma_b = [[0.5, 0], [0, 2]]。保持均值不变,观察并分析找到的决策边界点是否还是两个均值的中点?尝试在candidate_points中扩大搜索范围(不限于两点连线),你能找到多个决策边界点吗?这暗示了什么?
👉 点击查看参考答案
参考答案: 修改代码后,决策边界点将不再是两个均值的中点。因为协方差矩阵不同,两个高斯分布的”形状”不同(一个在 方向扁、 方向瘦;另一个相反),它们的概率密度等高线是不同形状的椭圆。在这些椭圆的交汇处,满足 的点构成的集合(决策边界)将是一条曲线。 如果你在二维平面上一个区域内(例如一个网格)搜索所有满足两个对数密度差近似为零的点,你会找到一系列点,这些点大致会形成一条曲线,而不是单个点。这验证了当协方差矩阵不同时,高斯判别分析的决策边界是二次的。你可以尝试修改搜索逻辑,在 [-2,2]x[-2,2] 的网格上寻找密度差接近零的点,并观察它们的分布。
本章小结
本节我们深入探讨了生成式模型在高维空间的核心工具——多元高斯分布。我们从生成式与判别式学习的哲学区别出发,理解了生成式模型旨在学习联合分布、揭示数据生成过程的本质。通过中心极限定理(伯努利到二项分布再到正态的路径),我们认识了高斯分布在统计学中的中心地位;通过协方差矩阵的几何(对角线定胖瘦、非对角线定方向,主轴即特征向量方向),我们掌握了高维高斯的形态语言;最后通过高斯判别分析看到了它在分类中的应用:协方差相同给线性边界,不同给二次边界,维度递进下分界从点、线到面。
📋 行动清单
- 理解协方差矩阵的几何意义:亲手画一个二维坐标系,根据不同的协方差矩阵(如正相关、负相关、各向异性),草图勾勒出对应高斯分布的等高线椭圆,并标出主轴方向(特征向量方向)。
- 推导决策边界:对于二分类高斯判别分析,在协方差矩阵 相同的情况下,尝试从公式 出发,推导出决策边界为线性函数 的形式,并写出 和 用 表示的表达式。
- 代码实验:运行并理解本节的所有示例代码,尝试修改参数(均值、协方差),观察并解释输出结果的变化,巩固对多元高斯形态及其在分类中应用的理解。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。