【人工智能】对贝叶斯网络进行吉布斯采样

article/2025/9/19 10:37:02

在这里插入图片描述

问题

现要求通过吉布斯采样方法,利用该网络进行概率推理(计算 P(R=T|S=F, W=T)、P2(C=F|W=T)的概率值)。

原理

吉布斯采样的核心思想为一维一维地进行采样,采某一个维度的时候固定其他的维度,在本次实验中,假定上一个采样的样本为<C(True)、S(False)、R(True)、W(False)>,此时对C维度进行采样,吉布斯采样将会利用 P(C|S=False,R=True,W=False)的分布得到一个新的 C的值(False),并将该值代替原先的值产生一个新的样本<C(False)、S(False)、R(True)、W(False)>。

给定分布π(C,S,R,W)
step 1. t=0 时刻产生一个初始状态<C0,S0,R0,W0>,count = 0,采样序列 x=[<C0,S0,R0,W0>]
step 2. 从条件概率分布 P(C|S0,R0)采样得到<C1,S0,R0,W0>,加入到 x[C 已知跳转下一步]
step 3. 从条件概率分布 P(S|C1,R0,W0)采样得到<C1,S1,R0,W0>,加入到 x[S 已知跳转下一步]
step 4. 从条件概率分布 P(R|C1,S1,W0)采样得到<C1,S1,R1,W0>,加入到 x[R 已知跳转下一步]
step 5. 从条件概率分布 P(W|S1,R1)采样得到<C1,S1,R1,W1>,加入到 x[W 已知跳转下一步]
step 6. count = count + 1,如果 count < 指定采样次数跳转到 step2
step 7. 在采样序列中统计满足条件的样本数量,除以总采样数即为所求。
数据结构使用一个 4*2*2*2*2 的矩阵 M 用于存储条件概率分布。如 M[0,:,0,0,0]即表示
P(C|S=False,R=False,W=False)的分布,M[0,:,1,0,0]表示P(C|S=True,R=False,W=False)的分布。该矩阵可通过给定的贝叶斯网络进行构建。

解答

# -*- coding:utf-8 -*-# Gibbs samplingimport numpy as np
import copyclass Gibbs:def __init__(self,query_id=1):self.x = []self.query_id = query_idassert query_id == 1 or query_id ==2self.tran_matrix = np.zeros((4,2,2,2,2))# 0 : C Cloudy# 1 : S Sprinkler# 2 : R Rain# 3 : W Wet grass# 计算条件概率分布# P(C) = 0.5self.tran_matrix[0] = 0.5 # P(C) = 0.5# P(S|C=T) = 0.1,P(S|C=F) = 0.5self.tran_matrix[1,1,0,:,:] = self.tran_matrix[0,1,0,:,:] * (1-0.1)self.tran_matrix[1,1,1,:,:] = self.tran_matrix[0,1,1,:,:] * 0.1self.tran_matrix[1,0,0,:,:] = self.tran_matrix[0,0,0,:,:] * (1-0.5)self.tran_matrix[1,0,1,:,:] = self.tran_matrix[0,0,1,:,:] * 0.5# P(R|C=T) = 0.8,P(R|C=F) = 0.2self.tran_matrix[2,1,:,0,:] = self.tran_matrix[1,1,:,0,:] * (1-0.8)self.tran_matrix[2,1,:,1,:] = self.tran_matrix[1,1,:,1,:] * 0.8self.tran_matrix[2,0,:,0,:] = self.tran_matrix[1,0,:,0,:] * (1-0.2)self.tran_matrix[2,0,:,1,:] = self.tran_matrix[1,0,:,1,:] * 0.2# P(W|S=T,R=T) = 0.99, P(W|S=T,R=F) = 0.9# P(W|S=F,R=T) = 0.9, P(W|S=F,R=F) = 0self.tran_matrix[3,:,1,1,0] = self.tran_matrix[2,:,1,1,0] * (1-0.99)self.tran_matrix[3,:,1,1,1] = self.tran_matrix[2,:,1,1,1] * 0.99self.tran_matrix[3,:,1,0,0] = self.tran_matrix[2,:,1,0,0] * (1-0.9)self.tran_matrix[3,:,1,0,1] = self.tran_matrix[2,:,1,0,1] * 0.9self.tran_matrix[3,:,0,1,0] = self.tran_matrix[2,:,0,1,0] * (1-0.9)self.tran_matrix[3,:,0,1,1] = self.tran_matrix[2,:,0,1,1] * 0.9self.tran_matrix[3,:,0,0,0] = self.tran_matrix[2,:,0,0,0] * (1-0)self.tran_matrix[3,:,0,0,1] = self.tran_matrix[2,:,0,0,1] * 0self.tran_matrix[0] = self.tran_matrix[3] / (self.tran_matrix[3].sum(axis=0,keepdims=True) + 1e-9)self.tran_matrix[1] = self.tran_matrix[3] / (self.tran_matrix[3].sum(axis=1,keepdims=True) + 1e-9)self.tran_matrix[2] = self.tran_matrix[3] / (self.tran_matrix[3].sum(axis=2,keepdims=True) + 1e-9)self.tran_matrix[3] = self.tran_matrix[3] / (self.tran_matrix[3].sum(axis=3,keepdims=True) + 1e-9)# 初始化样本if self.query_id == 1:# P(R=T|S=F,W=T)self.ignore_var_idx = [1,3] # S=F,W=Tself.x.append([True,False,True,True])else:# P(C=F|W=T)self.ignore_var_idx = [3] # W=Tself.x.append([True,False,True,True])self._sample_axis = 0self._var_num = 4def sample(self,sample_num:int):for _ in range(sample_num * (self._var_num - len(self.ignore_var_idx))):last_x = copy.copy(self.x[-1])sample_axis = self._next_sample_axis()last_x[sample_axis]=Truesample_prob = self.tran_matrix[sample_axis,int(last_x[0]),int(last_x[1]),\int(last_x[2]),int(last_x[3])]if np.random.rand() < sample_prob:last_x[sample_axis] = Trueelse:last_x[sample_axis] = Falseself.x.append(last_x)self.x = self.x[::self._var_num - len(self.ignore_var_idx)]def _next_sample_axis(self):self._sample_axis += 1self._sample_axis %= self._var_numwhile self._sample_axis in self.ignore_var_idx:self._sample_axis += 1self._sample_axis %= self._var_numreturn self._sample_axisdef calculate_ans(self):count = 0for x in self.x:if x[2] and self.query_id==1: count += 1if not x[0] and self.query_id==2: count += 1return count / len(self.x)def reset(self):self.x = self.x[:1]gibbs = Gibbs(1)
gibbs.sample(100)
ans = gibbs.calculate_ans()
gibbs.reset()
print('P(R=T|S=F,W=T)采样100次,结果为:',ans)
gibbs.sample(500)
ans = gibbs.calculate_ans()
gibbs.reset()
print('P(R=T|S=F,W=T)采样500次,结果为:',ans)
gibbs.sample(1000)
ans = gibbs.calculate_ans()
gibbs.reset()
print('P(R=T|S=F,W=T)采样1000次,结果为:',ans)gibbs = Gibbs(2)
gibbs.sample(100)
ans = gibbs.calculate_ans()
gibbs.reset()
print('P(C=F|W=T)采样100次,结果为:',ans)
gibbs.sample(500)
ans = gibbs.calculate_ans()
gibbs.reset()
print('P(C=F|W=T)采样500次,结果为:',ans)
gibbs.sample(1000)
ans = gibbs.calculate_ans()
gibbs.reset()
print('P(C=F|W=T)采样1000次,结果为:',ans)

运行结果

在这里插入图片描述
P(R=T|S=F, W=T)≈1
P(C=F|W=T)≈0.41


http://chatgpt.dhexx.cn/article/YLPdFRov.shtml

相关文章

matlab bnt工具箱吉布斯采样,吉布斯采样——原理及matlab实现

原文来自:https://victorfang.wordpress.com/2014/04/29/mcmc-the-gibbs-sampler-simple-example-w-matlab-code/ 【注】评论区有同学指出译文理论编码有误,请参考更官方的文献,个人当时仅验证过红色字体部分理论与维基百科中二位随机变量吉布斯采样的结果是否对应,其余部分…

【LDA】吉布斯采样

吉布斯采样是用条件概率得到联合概率分布。 其实是得到我们想要东西的近似解 目录 1 蒙特卡罗2 马尔科夫链3.MCMC采样4 MH采样5 吉布斯采样 1 蒙特卡罗 蒙特卡洛方法是为了解决一些不太好求解的求和或者积分问题。 其实就是一个近似方法&#xff0c;通过采样的多个样本代替原…

机器学习笔记之马尔可夫链蒙特卡洛方法(四)吉布斯采样

机器学习笔记之马尔可夫链蒙特卡洛方法——吉布斯采样 引言回顾&#xff1a;MH采样算法基于马尔可夫链的采样方式细致平衡原则与接收率 MH采样算法的弊端吉布斯采样方法吉布斯采样的采样过程吉布斯采样的推导过程吉布斯采样的代码实现 引言 上一节介绍了将马尔可夫链与蒙特卡洛…

三步完成吉布斯采样Gibbs sampling

吉布斯采样的具体执行过程只需要三个步骤&#xff0c;非常非常简单好理解&#xff0c;其它相关的背景知识能帮助加深理解。 一、Preliminaries Monte Carlo methods 它是很宽泛的一类计算方法&#xff0c;依赖重复的随机采样去获得数值结果。a broad class of computational a…

MCMC笔记:吉布斯采样(Gibbs)

1 介绍 吉布斯采样是一种特殊的MH采样 MCMC笔记Metropilis-Hastings算法&#xff08;MH算法&#xff09;_UQI-LIUWJ的博客-CSDN博客 此时我们要采样的分布是一个高维的情况 吉布斯采样的思想就是一维一维地进行采样&#xff0c;采某一个维度的时候固定其他的维度 吉布斯采…

吉布斯采样

回顾一下MC 采样&#xff1a; f(x)是已知 的概率分布函数&#xff0c;现在 找到一系列的x服从这个概率分布。也就是在f(x&#xff09;当中抽取一些样本x。后来就提出了&#xff1a; F(x)是f(x)的累积概率分布&#xff0c;只需 在0到1上均匀采样得到i&#xff0c;然后将这个样本…

随机采样和随机模拟:吉布斯采样Gibbs Sampling

http://blog.csdn.net/pipisorry/article/details/51373090 吉布斯采样算法详解 为什么要用吉布斯采样 通俗解释一下什么是sampling。 sampling就是以一定的概率分布&#xff0c;看发生什么事件。举一个例子。甲只能E&#xff1a;吃饭、学习、打球&#xff0c;时间T&#xff1a…

吉布斯抽样

吉布斯采样是生成马尔科夫链的一种方法&#xff0c;生成的马尔科夫链可以用来做蒙特卡洛仿真&#xff0c;从而求得一个较复杂的多元分布。 吉布斯采样的具体做法&#xff1a;假设有一个k维的随机向量&#xff0c;现想要构造一条有n个样本的k维向量&#xff08;n样本马尔科夫序列…

从马尔科夫过程到吉布斯采样(附程序示例)

目标&#xff1a;如何采取满足某个概率分布的一组数据&#xff0c;比如如何给出满足标准正太分布的1000个点&#xff0c;当然该分布比较简单&#xff0c;生成满足此分布的1000个点并不难&#xff0c;对matlab&#xff0c;python 等都是一行语句的事&#xff0c;但是如果是一个不…

sqlloader导出数据指定分隔符_来一份数据库全家桶~

♫. ♪ ~ ♬..♩~ ♫. ♪..♩~ ♫. ♪ ~ ♬..♩..♩~ ♫. ♪ ~ ♬..♩..♩~ ♫. ♪ ~ ♬..♩♫. ♪ ~ ♬..♩~ ♫. ♪..♩~ ♫. ♪ ~ ♬..♩..♩~ ♫. ♪ ~ ♬..♩..♩~ ♫. ♪ ~ ♬..♩ 点击蓝字关注我们♫. ♪ ~ ♬..♩~ ♫. ♪..♩~ ♫. ♪ ~ ♬..♩..♩~ ♫. ♪ ~ ♬..♩..…

使用sqlloader导入数据(千万级)-oracle

前言&#xff1a;笔者业务场景&#xff1a;当前表无分区&#xff0c;需将数据导出&#xff0c;创建分区后&#xff0c;重新导入当前表&#xff1b;当然&#xff0c;该方法同样使用于普通的数据迁移&#xff0c;或新旧表数据同步&#xff08;表结构一致&#xff09; 一、涉及数…

oracle-sqlloader的简单使用

目录 使用场景 简单使用 编写ctl文件 执行命令 使用场景 当你拿到一个txt文件&#xff0c;里面的数据是用统一符号分割的&#xff0c;例如如下文件&#xff0c;就可以考虑使用sqlloader导入到oracle数据库。 简单使用 编写ctl文件 OPTIONS (skip1,rows128) -- sqlldr 命…

使用Sqlloader处理数据

Oracle数据导出工具sqluldr2可以将数据以csv、txt等文件格式导出&#xff0c;适用于大批量数据的导出&#xff0c;导出速度非常快&#xff0c;导出后可以使用Oracle SQL Loader工具将数据导入到数据库中。下面将介绍Sqluldr2和sqlldr在Windows平台下的数据处理过程。 一、获取…

oracle之sqlloader

oracle的sqlloader可以从文件批量的将数据插入到数据库中&#xff0c;避免了使用SQL一句一句插入给数据库带来的压力。在工作中&#xff0c;简单的使用了一下&#xff0c;并没有深入的研究&#xff0c;下面是一个例子。 ① 数据文件信息&#xff1a; tina&#xff0c;12,34…

oracle sqlloader 的简单使用

1、EMP1 建表语句&#xff1a; CREATE TABLE EMP1 (EMPNO NUMBER(8) NOT NULL,ENAME VARCHAR2(10),HIREDATE DATE,JOB VARCHAR2(20),SAL NUMBER(8),DEPTNO NUMBER(8) NOT NULL ); 2、test.txt 数据文件&#xff1a; 1|Abandon1|2022-02-01|销售人员1|2500…

linux sql*loader-704,初见Oracle SqlLoader工具

因为大量的数据存在于文本文件中&#xff0c;需要导入到Oracle&#xff0c;有幸接触到神器SqlLoader. 在安装好Oracle的主机上单独运行sqlldr命令 sqlldr 将看到关于此工具的说明: 也只是简单的一个例子&#xff0c;帮助初次接触的你。 编写一个ctl文件&#xff0c;Oracle数据库…

mysql sql loader_Sql Loader的简单使用

之前总结的关于SQL*Loader的用法&#xff0c;今天又用到&#xff0c;又翻出来看看 SQL*Loader 可将外部文件中的数据加载到Oracle DB的表中。它具有一个功能强大的数据分析引擎&#xff0c;因此对数据文件中数据的格式没有什么限制。 SQL*Loader 使用以下文件&#xff1a;输入数…

Linux中sql*loader-350,SqlLoader

Sqlloader的步骤 1) Oracle 数据库端必须已经建好了需要导入的数据表的结构 2) 存在数据源文件 3) 手工编辑一个XXX.CTL 的控制文件 4) 命令行加载数据 Sqlldr命令具体信息如下图 Sqlldr运行的一个具体例子 sqlldr userid=user1/123456 control=bcp1.ctl log=log/bcp1.log bad=…

如何使用SqlLoader导入数据

Oracle 使用sqlloader导入数据非常方便,下面是我的导入步骤&#xff1a; 第一步&#xff0c;检查机器安装了sqlldr.exe没&#xff1f; 2、建一张表 CREATE TABLE student1 ( sname varchar (20), sage INTEGER, semall varchar (20), sphone VARCHAR (20), saddress varchar (…

MyBatis select标签

在 MyBatis 中&#xff0c;select 标签是最常用也是功能最强大的 SQL 语言&#xff0c;用于执行查询操作。 select 示例语句如下。 SELECT id,NAME,url FROM website WHERE NAME LIKE CONCAT (‘%’,#{name},‘%’) 以上是一个 id 为 selectAllWebsite 的映射语句&#xff0…