当前位置: 首页 > news >正文

概率图模型

概率论中的一些概念

  • 概率
  • 随机变量
  • 分布
  • 条件概率
  • 链式法则
  • 贝叶斯公式
  • 主观概率:先验概率,后验概率
  • 边际分布
  • 联合分布
  • 独立性
  • 条件独立性

概率推断涉及的三个问题

  • 模型选取——模型是否和问题相适配
  • 模型优化——给定数据集,模型的最优参数是什么
  • 模型应用——给定模型,观测到数据的概率是多少

其中后两点常常迭代进行来优化模型

有向图模型

贝叶斯网络

贝叶斯网络为有向无环图,其节点代表随机变量,边代表依赖关系,每个节点都有一个条件概率分布:
在这里插入图片描述
利用链式法则可以紧致地、模块化地表示概率联合分布:
P ( X 1 , X 2 , … , X N ) = Π i P ( X i ∣ P a r G ( X i ) ) P(X_1,X_2,\ldots,X_N) = \Pi_i P(X_i|Par_G(X_i)) P(X1,X2,,XN)=ΠiP(XiParG(Xi))其中, P a r G ( X ) Par_G(X) ParG(X)代表 X X X在图 G G G中的父节点。咱们称上式为联合分布的因子分解。

对于上图,有
P ( Q , C , L , N ) = P ( Q ) P ( L ) P ( C ∣ Q , L ) P ( N ∣ C , L ) P(Q,C,L,N) = P(Q) P(L) P(C|Q,L) P(N|C,L) P(Q,C,L,N)=P(Q)P(L)P(CQ,L)P(NC,L)

贝叶斯网络中的推理模式

  • 因果推理
  • 证据推理
  • 混合推理

网络中的概率信息流

贝叶斯网络中变量之间要么是直接连接,要么是间接连接,但总体上可以分为以下四种情况:

  • 因果关系:包含直接、间接因果
  • 证据关系:包含直接、间接证据
  • 同因
  • 同果

判断两个变量是否会影响

能相互影响指的是:以一个变量为条件时,另一个变量的分布会变化,即 P ( X ∣ Y ) ≠ P ( X ) P(X|Y) \neq P(X) P(XY)=P(X)

在这里插入图片描述
需要分两种情况讨论:

1. 没有观测量时

除了两个变量同果( X → W ← Y X\rightarrow W \leftarrow Y XWY),其它情况下两个变量都能相互影响

2. 有观测量时

如果观测量(已知量)出现在因果关系、证据关系的中间环节,则其上游的变量和下游的变量就不能相互影响。要理解也很容易,看看上面的图例就知道,观测变量下游的变量(结点)会受到观测变量的影响,而不可能受到观测变量上游变量的影响,换句话说,观测变量把其上下游变量之间的影响阻断

相似地,同因关系( X ← W → Y X \leftarrow W \rightarrow Y XWY)中,如果 W W W 已知,那么 X , Y X, Y X,Y 也是独立的

同果关系( X → W ← Y X\rightarrow W \leftarrow Y XWY)则相反,如果 W W W 未被观测,则 X , Y X,Y X,Y是相互独立的。反之,如果 W W W 或其任一后代节点被观测到,那就意味着 W W W 的取值已知或者有了某种偏好,那么 X , Y X,Y X,Y 就不是相互独立了。

对上面的同果关系做进一步说明,同果关系中已知结果 W W W,会使不同的原因 X Y XY XY不再独立。
这在生活中是很常见的,举个例子:某天你突然开始鼻塞流涕,这是已知的结果,其原因有很多,你可能认为自己感冒了,或者过敏了,在你不能肯定时,假设它们都有 50%的概率。
然后医生告诉你是感冒了,那么你对过敏性鼻炎的置信度就会大大降低。
也就是说,感冒和过敏两种原因的置信度是相互影响的,当结果已经有了一种确定的解释,另一种可能的原因就不再重要了

充要条件

在这里插入图片描述

D 分离

X and Y are d-separated in a graph G given a set of observation Z if
there’s no active trail in G between X and Y given Z.

  • Any node in the graph is d-separated from it’s non-descendants given it’s parents.
    在这里插入图片描述

图模型的本质

图模型本质上是用图结构来刻画变量之间的独立性(条件独立性)
在这里插入图片描述
在这里插入图片描述

如下图所示的朴素贝叶斯模型,就是一个非常简单的图模型,中心点是类别,它的子结点为特征。该模型描述的条件独立性信息为:给定类别,所有的特征都是独立的,即 P ( X 1 , X 2 , … , X n ∣ C ) = Π i n P ( X i ∣ C )    ⟺    X i ⊥ X j ∣ C P(X_1, X_2,\ldots,X_n| C) = \Pi_i^n P(X_i|C) \iff X_i \perp X_j | C P(X1,X2,,XnC)=ΠinP(XiC)XiXjC
在这里插入图片描述

python 实战

需要安装 python 包:pgmpy

问题描述:一个学生早上开车上学有关的贝叶斯网络,涉及到的关系有

  • 交通事故,大雨 => 交通拥堵
  • 交通拥堵,睡过头了 => 上学迟到
  • 交通拥堵 => 排长队
    在这里插入图片描述

添加结点 A,R,J 及边 A-J,R-J

from pgmpy.models import BayesianModel

model = BayesianModel()
model.add_nodes_from(['rain', 'traffic_jam'])
model.add_edge('rain', 'traffic_jam')
model.add_edge('accident', 'traffic_jam')
print(model.nodes())
'''
['rain', 'traffic_jam', 'accident']
'''
print(model.edges())
'''
[('rain', 'traffic_jam'), ('accident', 'traffic_jam')]
'''

添加结点的条件概率分布(CPD)

from pgmpy.factors.discrete import TabularCPD

cpd_rain = TabularCPD('rain', 2, [[0.4], [0.6]])
cpd_accident = TabularCPD('accident', 2, [[0.2], [0.8]])
cpd_traffic_jam = TabularCPD('traffic_jam',
                             2,
                             [[0.9, 0.6, 0.7, 0.1],
                              [0.1, 0.4, 0.3, 0.9]],
                             evidence=['rain', 'accident'],
                             evidence_card=[2, 2])
model.add_cpds(cpd_rain, cpd_accident, cpd_traffic_jam)

for cpd in model.get_cpds():
    print(cpd)
'''
+---------+-----+
| rain(0) | 0.4 |
+---------+-----+
| rain(1) | 0.6 |
+---------+-----+
+-------------+-----+
| accident(0) | 0.2 |
+-------------+-----+
| accident(1) | 0.8 |
+-------------+-----+
+----------------+-------------+-------------+-------------+-------------+
| rain           | rain(0)     | rain(0)     | rain(1)     | rain(1)     |
+----------------+-------------+-------------+-------------+-------------+
| accident       | accident(0) | accident(1) | accident(0) | accident(1) |
+----------------+-------------+-------------+-------------+-------------+
| traffic_jam(0) | 0.9         | 0.6         | 0.7         | 0.1         |
+----------------+-------------+-------------+-------------+-------------+
| traffic_jam(1) | 0.1         | 0.4         | 0.3         | 0.9         |
+----------------+-------------+-------------+-------------+-------------+
'''

继续扩充模型

添加 Q, J-Q

model.add_node('long_queues')
model.add_edge('traffic_jam', 'long_queues')
cpd_long_queues = TabularCPD('long_queues', 
                             2,
                             [[0.9, 0.2],
                              [0.1, 0.8]],
                             evidence=['traffic_jam'],
                             evidence_card=[2])
model.add_cpds(cpd_long_queues)

添加 G,L, G-L, J-L

model.add_nodes_from(['getting_up_late','late_for_school'])
model.add_edges_from([('getting_up_late', 'late_for_school'),('traffic_jam', 'late_for_school')])
cpd_getting_up_late = TabularCPD('getting_up_late', 2,[[0.6], [0.4]])
cpd_late_for_school = TabularCPD('late_for_school', 
                                 2,
                                 [[0.9, 0.45, 0.8, 0.1],
                                  [0.1, 0.55, 0.2, 0.9]],
                                 evidence=['getting_up_late','traffic_jam'],
                                 evidence_card=[2, 2])
model.add_cpds(cpd_getting_up_late, cpd_late_for_school)

最终模型

model.check_model()  # True

for cpd in model.get_cpds():
    print(cpd)
'''
+---------+-----+
| rain(0) | 0.4 |
+---------+-----+
| rain(1) | 0.6 |
+---------+-----+
+-------------+-----+
| accident(0) | 0.2 |
+-------------+-----+
| accident(1) | 0.8 |
+-------------+-----+
+----------------+-------------+-------------+-------------+-------------+
| rain           | rain(0)     | rain(0)     | rain(1)     | rain(1)     |
+----------------+-------------+-------------+-------------+-------------+
| accident       | accident(0) | accident(1) | accident(0) | accident(1) |
+----------------+-------------+-------------+-------------+-------------+
| traffic_jam(0) | 0.9         | 0.6         | 0.7         | 0.1         |
+----------------+-------------+-------------+-------------+-------------+
| traffic_jam(1) | 0.1         | 0.4         | 0.3         | 0.9         |
+----------------+-------------+-------------+-------------+-------------+
+----------------+----------------+----------------+
| traffic_jam    | traffic_jam(0) | traffic_jam(1) |
+----------------+----------------+----------------+
| long_queues(0) | 0.9            | 0.2            |
+----------------+----------------+----------------+
| long_queues(1) | 0.1            | 0.8            |
+----------------+----------------+----------------+
+--------------------+-----+
| getting_up_late(0) | 0.6 |
+--------------------+-----+
| getting_up_late(1) | 0.4 |
+--------------------+-----+
+--------------------+--------------------+--------------------+--------------------+--------------------+
| getting_up_late    | getting_up_late(0) | getting_up_late(0) | getting_up_late(1) | getting_up_late(1) |
+--------------------+--------------------+--------------------+--------------------+--------------------+
| traffic_jam        | traffic_jam(0)     | traffic_jam(1)     | traffic_jam(0)     | traffic_jam(1)     |
+--------------------+--------------------+--------------------+--------------------+--------------------+
| late_for_school(0) | 0.9                | 0.45               | 0.8                | 0.1                |
+--------------------+--------------------+--------------------+--------------------+--------------------+
| late_for_school(1) | 0.1                | 0.55               | 0.2                | 0.9                |
+--------------------+--------------------+--------------------+--------------------+--------------------+
'''

无向图模型

结构学习

参数学习

基于图模型的推断

近似推断方法

参考问献

在这里插入图片描述

相关文章:

  • PhotoShop的字体安装及制作文字特效
  • 艺术字体 Photoshop滤镜打造线框特效美术字
  • python topk
  • Photoshop 7.0做发光字体
  • win10 安装 lapack + blas
  • 用Photoshop制作钻石字
  • pytorch 保留验证集上最好的模型
  • AETA地震预测AI算法大赛训练集可视化
  • Photoshop教程-投影字
  • python 检测是否安装包
  • DTW——动态时间规整(附 python 代码)
  • PS特效:水晶字
  • 数据集仓库 —— UCI Machine Learning Repository
  • Photoshop字体效果汇总
  • pandas 时间序列的时间读取
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【个人向】《HTTP图解》阅后小结
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • github指令
  • Java Agent 学习笔记
  • Java 多线程编程之:notify 和 wait 用法
  • laravel 用artisan创建自己的模板
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • 从零开始学习部署
  • 动态规划入门(以爬楼梯为例)
  • 给初学者:JavaScript 中数组操作注意点
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 使用agvtool更改app version/build
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 通信类
  • 小程序开发中的那些坑
  • 新版博客前端前瞻
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #define,static,const,三种常量的区别
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (2.2w字)前端单元测试之Jest详解篇
  • (6)设计一个TimeMap
  • (9)STL算法之逆转旋转
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (c语言)strcpy函数用法
  • (ZT)薛涌:谈贫说富
  • (待修改)PyG安装步骤
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (四)图像的%2线性拉伸
  • (算法)N皇后问题
  • (转) Android中ViewStub组件使用
  • (转)一些感悟
  • .Net IOC框架入门之一 Unity
  • .net 中viewstate的原理和使用
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .Net小白的大学四年,内含面经
  • .net专家(张羿专栏)