万字长文!搞懂机器学习中的概率图模型

作者:aicoting日期:2026/1/19

推荐直接网站在线阅读:aicoting.cn

概率图模型(Probabilistic Graphical Models, PGM)是一类结合概率论与图论的强大工具,用于描述多个随机变量之间的依赖关系。它通过图结构将复杂的联合概率分布分解为局部条件概率分布,使得对高维数据建模和推断变得可行且高效。

根据图的类型,PGM 可分为有向图模型(如贝叶斯网络)和无向图模型(如马尔可夫随机场)。贝叶斯网络利用有向无环图表示变量之间的因果关系,适合建模因果推断和序列数据;马尔可夫随机场则通过无向图捕捉变量之间的联合约束,更适合处理对称依赖或空间关系。

概率图模型广泛应用于自然语言处理、计算机视觉、基因组学和推荐系统等领域,能够实现推断、学习和预测等多种任务,为复杂系统提供可解释的概率表示。

高斯混合模型

高斯混合模型(Gaussian Mixture Model, GMM)是一种重要的概率图模型,用于对数据进行聚类和密度估计。GMM 假设数据来自若干个高斯分布的线性组合,每个高斯分布称为一个“分量”,模型通过估计各个分量的均值、方差以及混合权重来刻画整个数据分布。

与 K-means 等硬聚类方法不同,GMM 是软聚类方法,每个样本属于每个簇的概率可以不同,更加灵活地刻画数据的连续性和重叠结构。

高斯混合模型在金融风控、语音识别、图像分割以及异常检测等场景中应用广泛。例如,在图像分割中,每个像素的颜色可以建模为若干高斯分布,通过 GMM 可以将图像自动分割为不同区域。在异常检测中,GMM 可以对正常数据建模,当新样本的概率很低时被判定为异常。

模型原理

假设观测数据为 X={x1,x2,...,xn}X = \{x_1, x_2, ..., x_n\}X={x1​,x2​,...,xn​},GMM 假设每个数据点由 K 个高斯分布中的一个生成。数学表达式为:p(xi)=∑k=1KπkN(xi∣μk,Σk)p(x_i) = \sum_{k=1}^{K} \pi_k \mathcal{N}(x_i|\mu_k, \Sigma_k)p(xi​)=∑k=1K​πk​N(xi​∣μk​,Σk​)

其中:

  • πk\pi_kπk​为第 k 个高斯分布的混合权重,满足
  • N(x∣μk,Σk)\mathcal{N}(x|\mu_k, \Sigma_k)N(x∣μk​,Σk​)是均值为 μk\mu_kμk​、协方差矩阵为 Σk\Sigma_kΣk​的高斯分布

GMM 的目标是通过最大化观测数据的似然函数来估计参数{πk,μk,Σk}\{\pi_k, \mu_k, \Sigma_k\} {πk​,μk​,Σk​}。由于直接最大化似然函数困难,通常使用 期望最大化算法(EM) 来迭代求解。

EM 算法流程

EM 算法通过两个步骤交替进行,直至参数收敛:

  1. 初始化:随机初始化每个高斯分布的均值 μk\mu_kμk​、协方差 Σk\Sigma_kΣk​ 和混合权重 πk\pi_kπk​ 。
  2. E 步(Expectation):计算每个样本属于每个分量的后验概率(责任度):γik=πkN(xi∣μk,Σk)∑j=1KπjN(xi∣μj,Σj)\gamma_{ik} = \frac{\pi_k \mathcal{N}(x_i|\mu_k, \Sigma_k)}{\sum_{j=1}^K \pi_j \mathcal{N}(x_i|\mu_j, \Sigma_j)}γik​=∑j=1K​πj​N(xi​∣μj​,Σj​)πk​N(xi​∣μk​,Σk​)​
  3. M 步(Maximization):根据责任度更新参数:

μk=∑iγikxi∑iγik,Σk=∑iγik(xi−μk)(xi−μk)T∑iγik,πk=∑iγikn\mu_k = \frac{\sum_i \gamma_{ik} x_i}{\sum_i \gamma_{ik}}, \quad \Sigma_k = \frac{\sum_i \gamma_{ik} (x_i - \mu_k)(x_i - \mu_k)^T}{\sum_i \gamma_{ik}}, \quad \pi_k = \frac{\sum_i \gamma_{ik}}{n}μk​=∑i​γik​∑i​γik​xi​​,Σk​=∑i​γik​∑i​γik​(xi​−μk​)(xi​−μk​)T​,πk​=n∑i​γik​​

  1. 迭代:重复 E 步和 M 步,直到似然函数收敛或达到最大迭代次数。

下面使用 Scikit-learn 对 Iris 数据集进行 GMM 聚类示例:

1from sklearn.datasets import load_iris
2from sklearn.mixture import GaussianMixture
3import matplotlib.pyplot as plt
4
5# 加载数据
6iris = load_iris()
7X = iris.data
8y = iris.target
9
10# 定义 GMM 模型
11gmm = GaussianMixture(n_components=3, covariance_type='full', random_state=42)
12gmm.fit(X)
13labels = gmm.predict(X)
14
15# 可视化前两维
16plt.figure(figsize=(8,6))
17plt.scatter(X[:,0], X[:,1], c=labels, cmap='viridis', s=40)
18plt.xlabel("Feature 1")
19plt.ylabel("Feature 2")
20plt.title("GMM Clustering of Iris Dataset")
21plt.show()
22

在结果中,不同颜色表示样本被分配到不同的高斯分量,GMM 能够捕捉簇的概率结构,并允许簇之间存在重叠。

由上面的内容来看,高斯混合模型是一种灵活的软聚类方法和概率密度建模工具,通过将数据表示为若干高斯分布的混合,实现对数据的连续建模。与 K-means 相比,GMM 能更好地处理簇形状不规则、簇间重叠的情况。它广泛应用于聚类、图像分割、异常检测、语音识别等领域。

通过合理选择分量数量和协方差类型,GMM 可以在实际问题中提供高精度的聚类和密度估计能力。

隐马尔可夫模型

隐马尔可夫模型(Hidden Markov Model, HMM) 是一种经典的概率图模型,用于建模含有隐含状态的序列数据。它假设观测序列是由一组不可直接观察的隐藏状态生成的,而隐藏状态之间满足马尔可夫性(当前状态只依赖于前一个状态)。HMM 在自然语言处理、语音识别、基因序列分析、行为预测等领域都有广泛应用,能够有效处理时间序列或序列依赖数据。

在 HMM 中,每个隐藏状态会以一定概率生成观测值,因此 HMM 不仅可以对序列进行建模,还可以进行序列预测、状态解码以及参数估计。与 GMM 等静态概率模型不同,HMM 显式考虑了数据的时序特性,能捕捉动态演化规律。

模型定义

一个 HMM 通常由以下三部分组成:

  1. 状态集S={s1,s2,...,sN}S = \{s_1, s_2, ..., s_N\}S={s1​,s2​,...,sN​} :表示模型的隐藏状态,总数为 N。
  2. 观测集O={o1,o2,...,oM}O = \{o_1, o_2, ..., o_M\}O={o1​,o2​,...,oM​} :表示可观测的符号或特征,总数为 M。
  3. 参数集:
  • 状态转移概率矩阵A=[aij]A = [a_{ij}] A=[aij​],其中aij=P(sj∣si)a_{ij} = P(s_j \mid s_i)aij​=P(sj​∣si​)
  • 观测概率矩阵B=[bjk]B = [b_{jk}]B=[bjk​] ,其中bjk=P(ok∣sj)b_{jk} = P(o_k \mid s_j)bjk​=P(ok​∣sj​)
  • 初始状态概率向量π=[πi]\pi = [\pi_i] π=[πi​],其中πi=P(si at time t=1)\pi_i = P(s_i \text{ at time } t=1)πi​=P(si​ at time t=1)

HMM 的核心目标是通过观测序列O=(o1,o2,...,oT)O = (o_1, o_2, ..., o_T)O=(o1​,o2​,...,oT​)

来解决三个典型问题:

  1. 评估问题:给定模型参数,计算观测序列的概率 P(O∣λ)P(O|\lambda)P(O∣λ)。
  2. 解码问题:给定观测序列,找到最可能的隐藏状态序列(常用 Viterbi 算法)。
  3. 学习问题:给定观测序列,估计模型参数 (A,B,π)(A, B, \pi)(A,B,π)(常用 Baum-Welch/EM 算法)。

算法流程

以最常用的 Baum-Welch 算法(EM 算法的一种)为例,HMM 的训练流程如下:

  1. 初始化:随机初始化状态转移矩阵 A、观测概率矩阵 B 和初始状态概率π\piπ 。
  2. E 步(Expectation):计算前向概率 α\alphaα和后向概率β\betaβ ,用于估计每个时间点的状态概率。
  3. M 步(Maximization):根据前向后向概率更新 (A,B,π)(A, B, \pi)(A,B,π)参数,使观测序列的似然概率最大化。
  4. 迭代:重复 E 步和 M 步,直到模型收敛或达到最大迭代次数。

对于状态解码问题,常用 Viterbi 算法,通过动态规划求解最可能的隐藏状态序列。

下面使用 hmmlearn 库对一个简单的离散序列进行 HMM 建模和预测:

1import numpy as np
2from hmmlearn import hmm
3
4# 假设观测值 0,1,2(离散类别),隐藏状态 0,1
5obs = np.array([[0],[1],[0],[2],[1],[0],[2],[1]])  # 注意列向量
6
7# 定义 HMM,禁止自动初始化
8model = hmm.MultinomialHMM(n_components=2, n_iter=100, random_state=42, init_params="")
9
10# 手动设置参数
11model.startprob_ = np.array([0.6, 0.4])
12model.transmat_ = np.array([[0.7, 0.3],
13                            [0.4, 0.6]])
14
15# emissionprob_ 形状必须是 (n_components, n_features)
16# n_features = 3,因为观测值 0,1,2  3 
17model.emissionprob_ = np.array([[0.5, 0.4, 0.1],
18                                [0.1, 0.3, 0.6]])
19
20# 训练 HMM
21model.fit(obs)
22
23# 解码隐藏状态序列
24hidden_states = model.predict(obs)
25print("隐藏状态序列:", hidden_states)
26

在这个示例中,HMM 对观测序列进行了建模,并预测了最可能的隐藏状态序列。

HMM 的时序建模能力使其在多个领域表现出色:

  • 语音识别:将语音信号序列映射到音素或文字序列。
  • 自然语言处理:词性标注、命名实体识别等序列标注任务。
  • 生物信息学:基因序列分析、蛋白质二级结构预测。
  • 行为预测与异常检测:对时间序列数据进行模式发现和异常识别。

简单总结一下HMM,HMM 是一种经典的序列概率模型,通过隐藏状态和观测概率描述序列数据的生成机制。与静态概率模型(如 GMM)不同,HMM 显式考虑时序依赖和马尔可夫性,能够捕捉动态演化规律。

通过合理设计状态数和初始化参数,HMM 可以在语音、文本、生物序列及行为数据等领域提供强大的建模能力。

贝叶斯网络

贝叶斯网络(Bayesian Network, BN) 是一种基于概率的图模型,用于表示变量之间的条件依赖关系。它由一个有向无环图(Directed Acyclic Graph, DAG)和与节点对应的条件概率表(Conditional Probability Table, CPT)组成。节点代表随机变量,边表示变量之间的依赖关系,而 CPT 则量化了这种依赖关系的强度。

贝叶斯网络能够处理不确定性、推理复杂系统、进行因果分析,并广泛应用于医疗诊断、故障检测、自然语言处理、风险评估等领域。与其他概率模型不同,贝叶斯网络显式地表示变量之间的条件依赖与独立性,使得复杂的联合概率分布能够分解为局部概率分布的乘积,从而大幅降低计算复杂度。

模型定义

一个贝叶斯网络通常由两部分组成:

  1. 结构(DAG)
  • 节点X1,X2,...,XnX_1, X_2, ..., X_n X1​,X2​,...,Xn​表示随机变量
  • 有向边Xi→XjX_i \to X_j Xi​→Xj​表示XjX_jXj​ 的概率分布依赖于XiX_iXi​
  • 图中不允许环路(无环性保证了概率计算的正确性)
  1. 参数(CPT)
  • 每个节点XiX_iXi​ 都有条件概率表P(X_i \mid \text{Parents}(X_i))
  • 若节点没有父节点,则为边缘概率P(Xi)P(X_i)P(Xi​)
  • 联合概率分布可分解为各节点条件概率的乘积:P(X1,X2,...,Xn)=∏i=1nP(Xi∣Parents(Xi))P(X_1, X_2, ..., X_n) = \prod_{i=1}^{n} P(X_i \mid \text{Parents}(X_i))P(X1​,X2​,...,Xn​)=∏i=1n​P(Xi​∣Parents(Xi​))

核心特点

贝叶斯网络的核心特点:

  • 表达条件独立性:通过 DAG 的结构,能够清晰地表示哪些变量是条件独立的,从而减少计算复杂度。
  • 因果建模能力:可以用于描述因果关系而不仅仅是相关性。
  • 灵活的概率推理:可以进行边缘化、条件推理和后验推断。

优点:

  • 模型可解释性强
  • 能处理不完整数据
  • 可进行推理和决策支持

缺点:

  • 学习 DAG 结构复杂(尤其是变量多时)
  • CPT 随父节点数量增加呈指数增长
  • 对连续变量需要离散化或假设特定分布

学习与推理

贝叶斯网络涉及两类核心任务:

  1. 结构学习
  • 从数据中学习网络结构
  • 常用方法:贪心搜索、约束方法、得分函数(如 BIC, AIC)
  1. 参数学习
  • 给定 DAG,学习 CPT
  • 可使用极大似然估计(MLE)或贝叶斯估计
  1. 推理(Inference)
  • 给定部分变量的观测值,计算其他变量的后验分布
  • 方法:精确推理(变量消元、信念传播)和近似推理(蒙特卡洛采样、Gibbs 采样)

下面用 pgmpy 对一个简单的贝叶斯网络建模、参数学习和推理:

1import pandas as pd
2from pgmpy.models import BayesianModel
3from pgmpy.estimators import MaximumLikelihoodEstimator
4from pgmpy.inference import VariableElimination
5
6# 定义网络结构
7model = BayesianModel([('Rain', 'Traffic'), ('Accident', 'Traffic')])
8
9# 构造数据
10data = pd.DataFrame({
11    'Rain': [0, 0, 1, 1, 0, 1, 0, 1],
12    'Accident': [0, 1, 0, 1, 0, 0, 1, 1],
13    'Traffic': [0, 1, 1, 1, 0, 1, 1, 1]
14})
15
16# 参数学习
17model.fit(data, estimator=MaximumLikelihoodEstimator)
18
19# 推理
20infer = VariableElimination(model)
21posterior = infer.query(variables=['Traffic'], evidence={'Rain': 1, 'Accident': 0})
22print(posterior)
23

在这个示例中:

  • Rain 和 Accident 是 Traffic 的父节点
  • 学习 CPT 后可以基于观测推断 Traffic 的概率 运行结果如下:

贝叶斯网络是一种强大的概率图模型,通过 DAG 表示变量之间的条件依赖关系,能够高效地进行联合概率建模和推理。它特别适合处理复杂系统的因果分析和不确定性建模。

最新的文章都在公众号aicoting更新,别忘记关注哦!!!

📚 推荐阅读

机器学习之数据预处理篇!

机器学习特征工程中的特征选择

机器学习中的特征构造

机器学习之特征降维

一文搞懂层次聚类和密度聚类方法!

一文搞懂机器学习中的PCA主成分分析!

机器学习中独立成分分析ICA和主成分分析PCA有什么区别?

一文搞懂t-SNE和UMAP降维方法!

作者:aicoting

分享是一种信仰,连接让成长更有温度。

我们下次不见不散!


万字长文!搞懂机器学习中的概率图模型》 是转载文章,点击查看原文


相关推荐


WPF样式进阶实战:外置样式+MVVM主题切换+样式优先级全解析
bugcome_com2026/1/11

在WPF开发中,样式(Style)是实现界面美化、统一风格、提高代码复用性的核心利器。但很多开发者在实际项目中,容易陷入「内联样式冗余」「主题切换困难」「样式优先级混乱」的困境,写出难以维护的XAML代码。 今天我们就通过一个完整的模块化实战项目(附全部可运行代码),从「外置样式封装」到「MVVM模式主题切换」,再到「样式优先级核心知识点」,全方位解锁WPF样式的高级用法,最终实现一个支持「浅/深色全局主题切换」「按钮专属样式切换」「传统后台代码样式切换」的完整案例。 一、项目架构梳理:模块化让


2025年终总结,智启
袁庭新2026/1/3

大家好,我是袁庭新。2025年就这么溜走了,对我而言,是极为不寻常的一年,总是想着用文字把它记录下来。 文章输出 写是为了更好的思考,坚持写作,力争更好的思考。 2025年累计发表54篇原创文章,平均1周更1篇,大多数是技术相关。2025年我有个转变——每个月写一篇月总结,对这个月主要做了什么事做一个系统的梳理,尽量以可量化的形式呈现,比如,这个月写了多少篇文章,拍了几条短视频,录了几节课,办了几场讲座等诸如此类。 为什么采用这种方式呢?前些年我也不是没写过年终总结,年底一回顾,感觉又稀里糊涂过


一文带你吃透 Java 反射机制
BestAns2025/12/24

一文带你吃透 Java 反射机制 在Java开发中,“反射”绝对是个让人又爱又恨的知识点。有人觉得它晦涩难懂、破坏封装,也有人靠它实现了各种灵活的功能——比如框架开发、动态配置加载。 其实反射没那么神秘,今天就给大家用最通俗的语言讲清楚:反射到底是什么、怎么用,以及反射在实际开发中的应用。 一、Java反射到底是什么? 我们先从Java的核心特性“封装”说起。平时写代码时,我们通过new关键字创建对象,调用类的方法、访问属性,都是在“编译期”就确定好要操作的类,比如User user = new


为什么说 AI 赋能前端开发,已经不是选择题,而是必然趋势?
西陵2025/12/16

首发于公众号 code进化论,欢迎关注。 前言 这几年 AI 在前端开发里的能力几乎是肉眼可见地进化”。从最早只能帮我们做做代码补全、提示几个参数,例如早期的 comate。到后来能够独立生成一个完整的 React/Vue 组件,连逻辑、样式和交互都能自动写好,例如 cursor 和 claude。再到现在,AI 已经能根据一句自然语言去搭建整个前端项目,自动创建页面、路由、接口层,甚至跑通基础业务流程,例如 v0 和 bolt.new。AI 的角色正在从“聪明的编辑器”变成“能独立干活的虚拟工


计算机十万个为什么--数据库索引
无限大62025/12/8

计算机十万个为什么--数据库索引 大家好,欢迎来到最新一期的无限大博客。 突然发现自己对数据库相关的内容掌握不够扎实,于是就去学习了一下,顺便也将自己的理解写成了一篇博客。 希望这篇文章能对大家有所帮助 数据库索引:给数据仓库装个"智能导航系统" 🧭 想象一下,你走进一个占地 1000 平方米的超级图书馆 📚,里面塞满了几十万本书,却连个分类牌都没有。老板忽然喊你找一本《数据库从入门到放弃》,你是不是当场想表演一个原地消失术?😱 这就是没有索引的数据库的日常!每次查询都像蒙眼找书,全表


失业7个月,我把公司开起来了:一个程序媛的“野蛮生长”
后端小肥肠2025/11/28

大家好,我是小肥肠。 4月被裁,11月注册公司。 这7个月,我一个人赚回了以前一年的工资,也攒够了人生第一台CC的首付。今天不讲技术,聊聊这半年一个程序媛的野蛮生长。 1. 半年了我开起了公司 从4月到现在已经创业半年多了(7个月),这7个月以来,我从一个一无所有的失业人到现在攒够了一台cc的首付(赚的比以前上班一年还多),我的共学社群实现了从0到现在的300多人。 其中有很多和我一样的程序员,他们都是被我的文章吸引来共学群一起成长,也有很多小白进来一步一步成长为可以自行搭建自己的智能体。 在这


耗时 20 天,AI 漫剧 APP 和 Web 全部开源, 已斩获 764 星!
苍何2026/1/28

这是苍何的第 474 篇原创! 大家好,我是消失了一段时间的苍何。 1 月 5 号,我写了篇文章,并开源了 AI 漫剧 APP,获得了很多朋友的喜欢。 然后在 GitHub 上一共获得了 764 星和 181 fork,让我有些吃惊。 说实话,这个项目远超我们的预期,甚至连歪果哥都来给我们提 issue,希望支持双语。 甚至还有老板来咨询问我卖不卖这个 APP,我说,大哥,咱都开源了,自己去整吧,不用付费,哈哈哈。 这或许就是开源的魅力吧。 但我发现,APP 还是不大方便,评论区也不少求


提示词工程入门-03
一诺滚雪球2026/2/6

前言 "写个代码" "帮我写个快速排序函数,用 Python 实现,要求时间复杂度 O(n log n),添加详细注释" 同样是让 AI 写代码,为什么第一个指令得到的是模糊的回复,而第二个能得到精确满足需求的代码? 这就是提示词工程(Prompt Engineering)的魔力。 好的 Prompt = 好的输出。今天我们来学习如何写出让 AI "秒懂"的提示词。 1. 什么是提示词工程 提示词(Prompt):你给大模型的输入指令 提示词工程(Prompt Engineering):设计和


EasyExcel的使用
脸大是真的好~2026/2/15

需求1:能够导出1个Excel文件,能够导入一个Excel文件; 需求2:导出的文件,能实现第1行,第123列的合并单元格:也就是会写注册处理器;知道sheet和cell是什么; 需求3:能实现合并的单元格设置单元格宽高,背景颜色,内容居中,字体大小; 需求4:能控制从任意行开始写入,并让要输出的字段居中; 需求5:导出能实现从任意行开始读入; 导出Excel文件 <!-- EasyExcel 核心依赖 --> <dependency> <groupId>com.alibaba</gro


一个简单Demo彻底理解前后端怎么连的丨Figma + Supabase + Vercel
阿星AI工作室2026/2/23

哈喽,大家好! 我是阿星👋 很多小白编程学了三个月,全是AI做主UI,难以融入自己的设计理念。 甚至不了解前后端到底怎么连通的。 一旦代码出错了,可能和AI对话还要重新理解一遍概念。所以今天,我们通过一个简单的case,把一个完整前后端的核心链路全跑一遍👇🏻 让你能自己把控UI、把控数据库、把控前端、后端。 🗺️ 先看一眼全局流程 整件事分五步,每一步做完了才能进下一步: ① Figma 画页面 →  ② 定接口契约 →  ③ Supabase 建数据库→  ④ AI 帮你写连接代码

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客