贝叶斯网络—MATLAB学习笔记(1)

2023-11-05

一、贝叶斯网络的原理

  • 贝叶斯网络的原理是贝叶斯定理。利用贝叶斯网络解决推理问题的核心就是,利用已知的“正向概率”求解“逆向概率”。

二、构建贝叶斯网络

1. matlab中添加贝叶斯网络构建工具FullBNT

FULLBNT是matlab自带贝叶斯网络工具箱,下载地址:http://www.cs.ubc.ca/~murphyk/Software/BNT/FullBNT-1.0.4.zip

  • a. 解压FullBNT-1.0.4.zip,将整个目录FullBNT-1.0.4复制到MATLAB的安装目录的TOOLBOX目录下。我的 目录是’C:\Program Files\MATLAB\R2016a\toolbox’;
  • b. 打开Matlab,在MATLAB命令窗口中进入上述目录,输入以下命令:
>> cd ('C:\Program Files\MATLAB\R2016a\toolbox\FullBNT-1.0.4') %添加括号是为了防止出现参数过多的错误。
  • c. TOOLBOX下的BNT工具箱加到MATLAB路径中,代码如下:
>> addpath(genpathKPM(pwd))
警告: 函数 assert 与某个 MATLAB 内置函数同名。建议您重命名该函数以避免潜在的名称冲突。 
> In path at 109
  In addpath at 86 
警告: 函数 isscalar 与某个 MATLAB 内置函数同名。建议您重命名该函数以避免潜在的名称冲突。 
> In path at 109
  In addpath at 86 
警告: 函数 isvector 与某个 MATLAB 内置函数同名。建议您重命名该函数以避免潜在的名称冲突。 
> In path at 109
  In addpath at 86 
  • d. 永久保存上面的路径,以免下次重启MATLAB时重新添加,命令:
>>savepath
  • e. 检验是否成功,命令行窗口输入:
>> which test_BNT.m
C:\Program Files\MATLAB\R2016a\toolbox\FullBNT-1.0.4\BNT\test_BNT.m
>> 

显示正确,成功添加工具箱。

2、实例分析

【实例1】

如下图所示,给出了贝叶斯网络的图和相应的条件概率:
在这里插入图片描述
对上述信息建立贝叶斯网络,代码如下:

  • (1)创建贝叶斯网络的matlab程序:
N=8; %8个节点,也就是8个特征
A=1; %visit to Asia到过亚洲
S=2; %somking抽烟
T=3; %tuberculosis肺结核
L=4; %lung cancer肺癌
B=5; %bronchitis支气管炎
E=6; %either tub. or lung cancer肺结核或者肺癌
X=7; %positive X-rayX光片呈阳性
D=8; %dyspnoea呼吸困难

%定义网络结构
dag=zeros(N,N);%创建无环图对应的矩阵
dag(A,T)=1;%按拓扑结构关系赋值
dag(S,[L,B])=1;
dag([T,L],E)=1;
dag(B,D)=1;
dag(E,[X,D])=1;
discrete_nodes=1:N;%从1取到N,也就是1-8,赋予各个节点类型,用1:N表示各个节点种类不同
node_sizes=2*ones(1,N);%定义节点状态,元素值为2的1*N行向量,赋予节点的大小,节点独立地有几种可能
bnet=mk_bnet(dag,node_sizes,'names',{'A','S','T','L','B','E','X','D'},'discrete',discrete_nodes);

%设置各个节点的边缘概率;
%对于A和S,定义顺序是False True;
%对于T、L和B这类,顺序是FF  FT TF TT;
%对于D这类,顺序是FFF FFT FTF FTT TFF TFT TTF TTT
bnet.CPD{A}=tabular_CPD(bnet,A,[0.99,0.01]);
bnet.CPD{S}=tabular_CPD(bnet,S,[0.5,0.5]);  
bnet.CPD{T}=tabular_CPD(bnet,T,[0.99,0.95,0.01,0.05]);  
bnet.CPD{L}=tabular_CPD(bnet,L,[0.99,0.9,0.01,0.1]);  
bnet.CPD{B}=tabular_CPD(bnet,B,[0.7,0.4,0.3,0.6]);  
bnet.CPD{E}=tabular_CPD(bnet,E,[1,0,0,0,0,1,1,1]);  
bnet.CPD{X}=tabular_CPD(bnet,X,[0.95,0.02,0.05,0.98]);  
bnet.CPD{D}=tabular_CPD(bnet,D,[0.9,0.2,0.3,0.1,0.1,0.8,0.7,0.9]); 

draw_graph(dag);%画出网络

  • (2)构建完成的贝叶斯网络:
    在这里插入图片描述
    至此,一个简单的贝叶斯网络就构建完毕。
  • (3)简单检查下A的概率
engine=jtree_inf_engine(bnet);%结树,贝叶斯网络,创建一个"引擎"
evidence=cell(1,N);
[engine,loglik]=enter_evidence(engine,evidence);
m=marginal_nodes(engine,A);
m.T()

结果如下图:
在这里插入图片描述
现在可以给定任意条件,然后计算概率了。

  • (4) 使用联合树推断引擎,对贝叶斯网络进行推断
%网络推断,使用联合树引擎,计算P(T=True|A=False,S=True,X=True,D=False)的概率 
%即病人在没有到过亚洲并且抽烟,在做检查之后发现X-ray光片呈阳性,但日常生活不伴有呼吸困难的前提下,患有肺结核的概率有多大?

engine=jtree_inf_engine(bnet);
evidence=cell(1,N);%1*N的空cell类型向量,元素可以是任意类型数据
evidence{A}=1;  
evidence{S}=2;  
evidence{X}=2;  
evidence{D}=1; 
[engine,loglik]=enter_evidence(engine,evidence);
m=marginal_nodes(engine,T);
m.T

得出:
在这里插入图片描述
由此可见,T为TRUE,即患者患有肺结核的概率比较大。

【实例2】

在这里插入图片描述

  • (1)创建贝叶斯网络的matlab程序:
N=4;
dag=zeros(N,N);%无向环用矩阵表示
C=1;S=2;R=3;W=4;%按拓扑矩阵给各个节点编号,方便下一步赋值
dag(C,[R S])=1;%按逻辑关系赋值
dag([S R],W)=1;
discrete_nodes = 1:N;%定义类型
node_sizes = 2*ones(1,N);%分配大小
bnet=mk_bnet(dag,node_sizes,'names',{'C','S','R','W'},'discrete',discrete_nodes);%创建网络
bnet.CPD{C}=tabular_CPD(bnet,C,[0.5 0.5]);%赋上各个事件的概率值
bnet.CPD{S}=tabular_CPD(bnet,S,[0.5 0.9 0.5 0.1]);
bnet.CPD{R}=tabular_CPD(bnet,R,[0.8 0.2 0.2 0.8]);
bnet.CPD{W}=tabular_CPD(bnet,W,[1.0 0.1 0.1 0.01 0 0.9 0.9 0.99]);
draw_graph(dag) %绘制出贝叶斯网络图

  • (2)构建完成的贝叶斯网络:
    在这里插入图片描述
  • (3)简单检查下在C为True时S发生的概率;
engine=jtree_inf_engine(bnet);
evidence=cell(1,N);%1*N的空cell类型向量,元素可以是任意类型数据
evidence{C}=2;  
[engine,loglik]=enter_evidence(engine,evidence);
m=marginal_nodes(engine,S);
m.T

结果如下图:
在这里插入图片描述
现在可以给定任意条件,然后计算概率了。

  • (4) 使用联合树推断引擎,对贝叶斯网络进行推断
    在建立贝叶斯网络之后,可以根据观察到的现象推测原因;下面是计算当观察到玻璃是湿的时候,下雨的可能性有多大的matlab程序片段:
engine=jtree_inf_engine(bnet); %结树,贝叶斯网络,创建一个"引擎"
evidence=cell(1,N);
evidence{W}=2;%计算当观察到玻璃是湿的时候,下雨的可能性有多大
[engine,loglik]=enter_evidence(engine,evidence);
m=marginal_nodes(engine,C);
m.T

计算结果如下图所示,表明当观察到玻璃是湿的的时候,没有下雨的可能性是42.42%,下过雨的可能性是57.58%。
在这里插入图片描述
也可以用柱状图表示出来:

bar(m.T)

在这里插入图片描述

三、注意事项

要点1:
在这里插入图片描述
在表达这个逻辑关系时,是 dag(A,T)=1,而不是dag(T,A)=1.

要点2:
节点的大小仅表示节点在独立情况下有多少种可能性,比如像上图中的节点A,是否去过亚洲,可能的结果有两种,去过和没去过,那么节点的大小就是2.

要点3:
这里的概率值是有一定的先后顺序的,
(1)只有两个概率值时:F T(其实也就是 0 1)
(2)有四个概率值时,按下面这个例子,PC:FF FT TF TT(其实也就是00 01 10 11)
在这里插入图片描述

在这里插入图片描述

bnet.CPD{S}=tabular_CPD(bnet,S,[0.5 0.9 0.5 0.1]);

(3)有八个概率值时,按下面的这个例子,WRS:FFF FFT FTF FTT TFF TFT TTF TTT(其实也就是000 001 010 011 100 101 110 111)
在这里插入图片描述

bnet.CPD{W}=tabular_CPD(bnet,W,[1.0 0.1 0.1 0.01 0 0.9 0.9 0.99]);

总结:
By the way,这里PC、WRS遵循的规律是:
不同级时,下面的排在前;
同一级时,右面的排在前。

四、所遇问题及解决方案

MATLAB在生成贝叶斯网络时报错:

1. 问题一 (贝叶斯网络无箭头)

未定义与 ‘matlab.graphics.axis.Axes’ 类型的输入参数相对应的运算符 ‘*’

问题描述:
使用matlab生成贝叶斯网络的时候,可以生成,但生成的贝叶斯网络没有边,如下图:
在这里插入图片描述
在这里插入图片描述

解决方案:

用如下文件替换原C:\Program Files\MATLAB\R2016a\toolbox\FullBNT-1.0.4\GraphViz下的arrow.m

新版arrow.m文件链接:https://pan.baidu.com/s/1lcaY_58oNNgCSGK375Hv0g
提取码:tikt

2. 问题二(draw_graph函数调用报错)

问题描述:报错如下

>> BN_weather
错误使用 set
Patch 类中没有 Color 属性。

出错 draw_graph (line 103)
set(h_edge,'Color',color.edge)

出错 BN_weather (line 14)
draw_graph(dag) %绘制出贝叶斯网络图

解决方案:
draw_graph函数被调用的时候出了问题,没有办法识别set(h_edge,‘Color’,color.edge),

因为h_edge是一条边,而‘Color’是图形的颜色,在draw_graph函数中将报错的103行的color改成EdgeColor就可以了。
在这里插入图片描述

比如也可以设置箭头的颜色:color.edge=‘green’

在这里插入图片描述
运行结果如下:
在这里插入图片描述

参考:
[1] http://t.csdn.cn/dB5Bt
[2] http://t.csdn.cn/StObM
[3] http://t.csdn.cn/HEOpI
[4]https://blog.csdn.net/corinne0623/article/details/124435366

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

贝叶斯网络—MATLAB学习笔记(1) 的相关文章

随机推荐

  • 流媒体技术基础-流媒体编码与协议

    一 流媒体传输协议 1 实时传输协议RTP 针对多媒体数据流的一种传输协议 建立在UDP协议上 属于传输层协议 定义互联网上传递音频和视频的标准数据包格式 RTP协议常用于流媒体系统 配合RTCP协议 视频会议和视频电话系统 配合H 263
  • linux上的一些系统监测工具简介

    linux上的一些系统监测工具简介 在linux中提供了很多有用的工具 以方便开发人员调试和评测服务器程序 下面介绍几个常用的工具 tcpdump nc strace lfos netstat vmstat ifstat和mpstat 1
  • 怎么下载K-Flash烧录(有图 超详细)

    安装包 百度网盘链接 https pan baidu com s 1vGaXrEsAVhsRWqGmi7CSIA 提取码 1234 官网 下载地址 https github com kendryte kendryte flash windo
  • 谷歌浏览器安装Elasticsearch head 插件

    使用步骤 翻墙后用谷歌浏览器打开下面的地址 根据提示安装即可 https chrome google com webstore detail elasticsearch head ffmkiejjmecolpfloofpjologoblke
  • Linux搭建实验环境搭建(nginx,mysql,java.tomcat)

    作者 小刘在C站 个人主页 小刘主页 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 学习两年总结出的运维经验 以及思科模拟器全套网络实验教程 专栏 云计算技术 小刘私信可以随便问 只要会绝不吝啬 感谢CSDN让你我相遇 目录
  • spring boot错误记录

    spring boot启动类启动 错误 找不到或无法加载主类 xxx xxxx Application 的解决方法 因为导入了jar 所以maven打包时总提示程序包不存在 弄到最后出现 spring boot启动类启动 错误 找不到或无法
  • C++输出杨辉三角

    题面 杨辉三角形是一种 有趣 的三角形 它的一个重要性质是 三角形中的每个数字等于它两肩上的数字相加 下面给出了杨辉三角形的前5行 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 现在给出n 请你输出它的前n行 思路 根据杨辉三
  • java项目中配置redis-cluster集群的两种方式

    本文分两部分 1 jedisCluster 2 Spring Data Redis集群配置和RedisTemplate用法 我这里是在本机上搭建的3主3从6个redis实例 一 jedisCluster jar引入
  • Ubuntu18.04局域网共享文件夹,实现win7和Ubuntu本地访问

    Ubuntu18 04局域网共享文件夹 实现win7和Ubuntu本地访问 一个局域网下往往连接了十几台电脑 有时候电脑之间用U盘来回拷贝东西实在是太麻烦 尤其是Ubuntu系统没有较好的即时通讯工具 因此我们可以利用Samba服务配置我们
  • 【华为OD机试真题 JS】靠谱的车

    标题 靠谱的车 时间限制 1秒 内存限制 262144K 语言限制 不限 程序员小明打了一辆出租车去上班 出于职业敏感 他注意到这辆出租车的计费表有点问题 总是偏大 出租车司机解释说他不喜欢数字4 所以改装了计费表 任何数字位置遇到数字4就
  • 批量剪辑软件-超强混剪超好用!1分钟合成1000条优质视频

    在网络时代 你可以利用一款批量剪辑软件来解决短视频输出问题 这款软件可以帮助你轻松地制作多个视频内容 一天批量剪辑3000 视频 如果你也想在短视频平台上获取 粉丝实现变现 则需要我们这款全自动批量剪辑软件 客户成功案例 1 客户反馈一周的
  • Unity发布WebGL的填坑笔记

    an error occurred running the unity content on this page see your browser javascript console for more info the error was
  • VS2019-解决新建qt项目无法打开*.ui

    更新vs和qt项目管理 在解决方案资源管理器 在Form Files文件夹下的 ui右键 点击打开方式 单击添加 选自己的designer exe路径 绿色图标 本人的路径是 然后确认 无需退出vs2019 在上述路径下找到 Qt5WebE
  • UnityEngine.Screen.safeArea

    Unity 2017 2 1及以后 Screen safeArea会返回移动平台安全区的Rect 参考代码 public class SafeArea MonoBehaviour float safeArea left Start is c
  • 【致敬未来的攻城狮计划】--RA2E1 开发板测评(4)UART通讯

    前言 1 首先感谢 李肯前辈的活动 从而申请到了RA2L1开发板的测评 2 学习本文之前要具备的知识 致敬未来的攻城狮计划 RA2E1 开发板测评 1 keil环境配置 致敬未来的攻城狮计划 RA2E1 开发板测评 2 LED闪烁 3 本文
  • go 常用标准库之-time

    文章目录 go 常用标准库之 time 基本使用 时间戳 时间间隔 时间操作 Add Sub Equal Before After 时间格式化 字符串格式化成时间 时区 定时任务 go 常用标准库之 time 基本使用 time Time类
  • 配置自己的VLC转码参数(#transcode)

    刚接触vlc 查资料总能看到类似 sout transcode vcodec h264 scale 自动 acodec mpga ab 128 channels 2 samplerate 44100 scodec none no sout
  • 3分钟入门:Flex 布局

    flex 布局原理 全称 flexible box 弹性布局 如何开启 为元素添加 display flex 开启 flex 布局的元素 称为 flex 容器 flex container 其子元素成为容器成员 称为 flex 项目 fle
  • 华为eNSP实现ospf动态路由,STP,VRRP,DHCP、ACL、NAT、Telnet企业内网访问外网案例

    目录 一 背景 二 需求分析 三 拓扑搭建 四 项目实施步骤 一 项目背景 Xan20公司新建了一栋办公大楼作为分公司 为了满足日常的办公需求 公司决定为财务部 项目管理部 技术部 行政部和服务器群建立互联互通的有线网络 其中 为方便各部门
  • 贝叶斯网络—MATLAB学习笔记(1)

    快速导览 一 贝叶斯网络的原理 二 构建贝叶斯网络 1 matlab中添加贝叶斯网络构建工具FullBNT 2 实例分析 实例1 实例2 三 注意事项 四 所遇问题及解决方案 1 问题一 贝叶斯网络无箭头 2 问题二 draw graph函