贝叶斯网络
最近用的贝叶斯的理论比较多,所以重新熟悉了下贝叶斯的相关理论与贝叶斯网络的相关理论,主要是贝叶斯公式,马尔可夫等价类以及DAG等相关理论的整理。下面简单上一个随处可以见的一个贝叶斯的subclass。
Bayesian model先熟悉下它的基础构造,下面先叙述下一些基本的概念
贝叶斯定理
简单的而言,在大学里学到的基础的贝叶斯公式,是简单的贝叶斯全概率公式,其主要的描述如下:
贝叶斯全概率公式:
如果事件组B1,B2,.... 满足
1.B1,B2....两两互斥,即 Bi ∩ Bj = ∅ ,i≠j , i,j=1,2,....,且P(Bi)>0,i=1,2,....;
2.B1∪B2∪....=Ω ,则称事件组 B1,B2,...是样本空间Ω的一个划分
设 B1,B2,...是样本空间Ω的一个划分,A为任一事件,则:
上面的公式称作是全概率公式(formula of total probability),其实主要的思路就是A的概率等于A在B的条件下的条件概率再乘上B的概率,这个地方B可以是多个条件的集合。很多人会将这个直接跟贝叶斯公式联系在一起,这是错误的!
贝叶斯公式:
贝叶斯公式是建立在条件概率的基础上寻找事件发生的原因(即大事件A已经发生的条件下,分割中的小事件Bi的概率)最简单的应用是利用P(A|B)来计算P(B|A)。它的基础是建立在条件概率的基础上的,所以下贴一下条件概率的公式:
(虽然这个公式大家都知道,这里我还是写一下,这里的前提P(B)>0) ……(1)
其中当P(B)=0的时候,我们有
(乘法公式) ...........(2)
根据上面的公式,我们可以得出下面的贝叶斯公式:
公式右边的P(A)可以看作归一化的常数,以保证其满足概率函数的性质。如果我们关注的仅仅是事件发生的相对可能性,这时可以完全忽略这个分母,因为公式中分母的大小都是相同的 ,但是分母的大小是可以计算的。
所以我们可以根据上面的两个式子来得出P(A)
P(A)=
=P(A|B)P(B)+(该结果中B与B非将A拆分成两个不相交的子空间,分别计算其条件概率然后利用可加性原则)
如果将上面的公式进行推广,假设一组互不相交的集合,我们可以将P(A)用更加广泛的定义表示出来
P(A)=
按照上面的式子的推倒,我们可以得出更加正式的贝叶斯定理的数学定义:
(即只不过是将分母换了而已)
贝叶斯是基于先验的条件概率的,所以在下面的贝叶斯网络的叙述中,全面的利用了这个原理。
贝叶斯网络:
误区:首先阐明一个区别那就是朴素贝叶斯与贝叶斯网络的区别,首先他们两个的前提条件是不同的,朴素贝叶斯的假设前提有两个第一个为:各特征彼此独立;第二个为且对被解释变量的影响一致,不能进行变量筛选。而贝叶斯网络的前提则是各变量都是离散型的,各特征有依赖(不确定的因果推理)关系(变量无关),每一个节点在其直接前驱节点的值制定后,这个节点条件独立于其所有非直接前驱前辈节点。
在应用上的区别,首先贝叶斯网络基本应用在在信息不完备的情况下通过可以观察随机变量推断不可观察的随机变量,解决文本分类时,相邻词的关系、近义词的关系,朴素贝叶斯公式则是主要用于分类,相对而言,朴素贝叶斯网络相对比较简单,它的基本应用对于给出的待分类项,会选择条件概率最大的类别,这就是朴素贝叶斯的思想的应用过程。
贝叶斯网络的概念:
贝叶斯网络是联合概率分布的一种,它包含两个组件,一是,无回路的有向无环图DAG(Directed Acyclic Graph)其节点对应随机变量为,令表示图G中子节点的父节点的集合(即,所有指向节点集合),而是参数,表示条件概率分布P(),.(扩展一下,就是贝叶斯网络可以对应多个马尔可夫等价类,具体的等价条件是1.具有相同的骨架,第二是具有相同的V结构),贝叶斯网络其实也叫casual network(因果网络)。
首先介绍下V结构,V结构其实很简单
V结构上图就是一个最简单的V结构,他也是贝叶斯基础网络的一种,这种a->c,b->c的结构是一种,还有两种基础的贝叶斯网络结构,分别是从c出发射向a与b的,即c--->a,c----->b,最后一种结构就是顺序的一种结构,即a->c->v or b->c->a这种的结构。
如何构建一个贝叶斯网络:
根据前面贝叶斯网络的定义,我们可以初步的知道一个贝叶斯网络的构成,那么可以根据它的定义来构造一个贝叶斯网络,其实就是围绕着它的组成元素1.DAG 2.节点参数与边的方向,下面分这两步来描述下如何构造一个贝叶斯网络。
1、确定随机变量间的拓扑关系,形成DAG。这一步通常需要领域专家完成,而想要建立一个好的拓扑结构,通常需要不断迭代和改进才可以。
2、训练贝叶斯网络参数——估计出各节点的条件概率表。这一步也就是要完成条件概率表的构造,如果每个随机变量的值都是可以直接观察的,像我们上面的例子,那么这一步的训练是直观的,方法类似于朴素贝叶斯分类。但是通常贝叶斯网络的中存在隐藏变量节点,那么训练方法就是比较复杂,例如使用梯度下降法。还有就是参数估计的MLE方法,参数估计的贝叶斯方法,凯学习对应的参数。
下面是贝叶斯网络实现的简单代码,在这里我用了bnlearn这个包下面就是实现的环节,因为用了现成的包,所以少去了具体的结构化模型的过程,直接用了现成的模型。
准本数据
# 加载扩展包和数据
library(caret)
data(PimaIndiansDiabetes2,package='mlbench')
# 对缺失值使用装袋方法进行插补
preproc <- preProcess(PimaIndiansDiabetes2[-9],method="bagImpute")
data <- predict(preproc,PimaIndiansDiabetes2[-9])
data$Class <- PimaIndiansDiabetes2[,9]
用bnlearn的包进行贝叶斯网络的实现
library(bnlearn)
# 数据离散化
data2 <- discretize(data[-9],method='quantile')
data2$class <- data[,9]
# 使用爬山算法进行结构学习
bayesnet <- hc(data2)
# 显示网络图
plot(bayesnet)
# 修改网络图中的箭头指向
bayesnet<- set.arc(bayesnet,'age','pregnant')
# 参数学习
fitted <- bn.fit(bayesnet, data2,method='mle')
# 训练样本预测并提取混淆矩阵
pre <- predict(fitted,data=data2,node='class')
confusionMatrix(pre,data2$class)
# 进行条件推理
cpquery(fitted,(class=='pos'),(age=='(36,81]'&mass=='(34.8,67.1]'))
over,以后用到了其他的原理在继续更新
参考链接:R语言︱贝叶斯网络语言实现及与朴素贝叶斯区别(笔记) - 素质云笔记/Recorder... - CSDN博客