R语言︱贝叶斯网络语言实现及与朴素贝叶斯区别(笔记)
每每以为攀得众山小,可、每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~
———————————————————————————
一、贝叶斯网络与朴素贝叶斯的区别
朴素贝叶斯的假设前提有两个第一个为:各特征彼此独立;第二个为且对被解释变量的影响一致,不能进行变量筛选。但是很多情况这一假设是无法做到的,比如解决文本分类时,相邻词的关系、近义词的关系等等。彼此不独立的特征之间的关系没法通过朴素贝叶斯分类器训练得到,同时这种不独立性也给问题的解决方案引入了更多的复杂性[1]。
此时,更具普遍意义的贝叶斯网络在特征彼此不独立情况下,可进行建模。但是贝叶斯网络并不放宽第二个假设,故不能对变量进行筛选,因为视解释变量的作用一致。
贝叶斯分类方法是一种展现已知数据集属性分布的方法,其最终计算结果完全依赖于训练样本中类别和特征的分布。与SVM等分类方法不同,它只是对事实进行展现。
贝叶斯网络 |
朴素贝叶斯 |
|
假设前提 |
各变量都是离散型的 各特征有依赖(不确定的因果推理)关系(变量无关) 每一个节点在其直接前驱节点的值制定后,这个节点条件独立于其所有非直接前驱前辈节点。 P(v|par(v),x1,x2...,xn) = P(v|par(v)) 贝叶斯网络放宽了每个变量独立的假设 |
各特征彼此独立 朴素贝叶斯中对于若干条件概率值不存在的问题,一般通过将所有的概率值加1来解决 且对被解释变量的影响一致,不能进行变量筛选 |
应用案例 |
在信息不完备的情况下通过可以观察随机变量推断不可观察的随机变量[1] 解决文本分类时,相邻词的关系、近义词的关系 |
分类 |
缺点 |
不能对变量进行筛选,因为不能放宽对被解释变量影响一致的假设 |
彼此不独立的特征之间建立朴素贝叶斯,反而加大了模型复杂性 |
优点 |
贝叶斯原理和图论相结合,建立起一种基于概率推理的数学模型,对于解决复杂的不确定性和关联性问题有很强的优势
|
简单,对于给出的待分类项,会选择条件概率最大的类别,这就是朴素贝叶斯的思想基础 |
________________________________________________________________________________________________________________
二、贝叶斯网络概念
贝叶斯网络基本概念有两个:引入了一个有向无环图(Directed Acyclic Graph)和一个条件概率表集合。
DAG。DAG的结点V包括随机变量(类别和特征),有向连接E(A->B)表示结点A是结点B的parent,且B与A是有依赖关系的(不独立)。
条件概率表集合。同时引入了一个条件性独立(conditional independence)概念:即图中任意结点v在给定v的parent结点的情况下,与图中其它结点都是独立的,也就是说P(v|par(v),x1,x2...,xn) = P(v|par(v))。这里par(v)表示v的parent结点集,x1,x2,...,xn表示图中其它结点。
我们清楚,如果已知所有联合概率值(joint distribution),那么任何形式的概率问题都可以迎刃而解。而现实是当特征集合过大(>10)时你几乎无法通过统计得到。而特征集合的大小在"一定程度上"与最终的分类效果是一个正反馈关系。
所以,这个问题的解决就是通过条件独立的概念来对各条件概率值进行优化。具体可以参见参考文件的bayesian net的tutorial,我这里不再阐述了(来自博客分类算法之朴素贝叶斯(Naive Bayes)和贝叶斯网络(Bayesian Networks))。
贝叶斯网络中连线是如何产生的?
本内容来源于CDA DSC,L2-R课程,第11讲。
贝叶斯网络,不再表示因果关系,而是变量之间的相关依赖关系。
X,y之间线代表的就是条件概率,p(y︱x1)︱x2x3x4...=p(y),等于则不连线,
不等于,说明在控制了x2下,两者不是独立,而是相关的,则会连线。
________________________________________________________________________________________________________________
三、贝叶斯网络简单案例
贝叶斯网络原理较为简单,所以在实际应用中较为广泛。比如垃圾邮件的处理,先对垃圾邮件分词,一些垃圾词“培训”、“打折”...,只需要做每个单词在每个文档中出现的频次就可以用贝叶斯网络推断哪一些是垃圾邮件;
也可以用在社会调查中的量表题,
下图表示特征属性之间的关联:
上图是一个有向无环图,其中每个节点代表一个随机变量,而弧则表示两个随机变量之间的联系,表示指向结点影响被指向结点。不过仅有这个图的话,只能定性给出随机变量间的关系,如果要定量,还需要一些数据,这些数据就是每个节点对其直接前驱节点的条件概率,而没有前驱节点的节点则使用先验概率表示。
例如,通过对训练数据集的统计,得到下表(R表示账号真实性,H表示头像真实性):
纵向表头表示条件变量,横向表头表示随机变量。上表为真实账号和非真实账号的概率,而下表为头像真实性对于账号真实性的概率。这两张表分别为“账号是否真实”和“头像是否真实”的条件概率表。有了这些数据,不但能顺向推断,还能通过贝叶斯定理进行逆向推断。例如,现随机抽取一个账户,已知其头像为假,求其账号也为假的概率:
也就是说,在仅知道头像为假的情况下,有大约35.7%的概率此账户也为假。如果觉得阅读上述推导有困难,请复习概率论中的条件概率、贝叶斯定理及全概率公式。如果给出所有节点的条件概率表,则可以在观察值不完备的情况下对任意随机变量进行统计推断。上述方法就是使用了贝叶斯网络。
________________________________________________________________________________________________________________
四、贝叶斯网络实施步骤
[算法杂货铺——分类算法之贝叶斯网络(Bayesian networks)]
1、步骤
构造与训练贝叶斯网络分为以下两步:
1、确定随机变量间的拓扑关系,形成DAG。这一步通常需要领域专家完成,而想要建立一个好的拓扑结构,通常需要不断迭代和改进才可以。
2、训练贝叶斯网络参数——估计出各节点的条件概率表。这一步也就是要完成条件概率表的构造,如果每个随机变量的值都是可以直接观察的,像我们上面的例子,那么这一步的训练是直观的,方法类似于朴素贝叶斯分类。但是通常贝叶斯网络的中存在隐藏变量节点,那么训练方法就是比较复杂,例如使用梯度下降法。由于这些内容过于晦涩以及牵扯到较深入的数学知识,在此不再赘述,有兴趣的朋友可以查阅相关文献。
2、案例
还是SNS社区中不真实账号检测的例子,我们的模型中存在四个随机变量:账号真实性R,头像真实性H,日志密度L,好友密度F。其中H,L,F是可以观察到的值,而我们最关系的R是无法直接观察的。这个问题就划归为通过H,L,F的观察值对R进行概率推理。推理过程可以如下表示:
1、使用观察值实例化H,L和F,把随机值赋给R。
2、计算(如图1)。其中相应概率值可以查条件概率表。由于上述例子只有一个未知随机变量,所以不用迭代。
________________________________________________________________________________________________________________
五、TAN树增强朴素贝叶斯
TAN是贝叶斯网络的简化版本。先构造所有变量两两之间的连线(如左图);然后进行剪枝。特点就是,解释变量是平行的,不对变量进行筛选,看做是一致的。(第五点内容的补充来自于CDA DSC L2-R语言课程第11讲内容)
5.1 相对熵
其最大的特点就是:可以做到衡量p-q,q-p的影响,可以度量两个随机变量的“距离”、相互之间的影响力。
5.2 TAN贝叶斯网络结构的学习
贝叶斯网络先构造所有变量两两之间的连线(如左图);然后进行剪枝。特点就是,解释变量是平行的,不对变量进行筛选,看做是一致的。
5.3 TAN贝叶斯网络的特点
1、全考虑。在未知关系之前,TAN会建立所有输入变量X与输出变量Y之间的全联系,考虑了所有因素对输出变量Y的影响;
2、X之间非独立。输入变量X之间也会存在弧线,意味着变量之间并非全部条件独立,允许具有相互依赖的关系,突破了朴素贝叶斯的假设;
3、调节效应。输入变量X之间的有向弧线,代表对Y的调节效应,X1对Y的作用,不仅仅是X1,还可能有X1X2之间对Y的作用。
________________________________________________________________________________________________________________
六、R语言-贝叶斯网络/朴素贝叶斯
朴素贝叶斯分类对于缺失值并不敏感。R语言中的e1071包中就有可以实施朴素贝叶斯分类的函数,但在本例我们使用klaR包中的NaiveBayes函数,因为该函数较之前者增加了两个功能,一个是可以输入先验概率,另一个是在正态分布基础上增加了核平滑密度函数[4]。
R语言中可以使用bnlearn包来对贝叶斯网络进行建模。但要注意的是,bnlearn包不能处理混合数据,所以先将连续数据进行离散化(因子型),再进行建模训练。
1、bnlearn包介绍
网上有一个bnlearn包的教程,但是有点乱,笔者看了之后就是一头雾水。所以整理了一下:
该包包含贝叶斯网络的结构学习、参数学习和推理三个方面的功能,其中结构学习包含基于约束的算法、 基于得分的算法和混合算法, 参数学习包括最大似然估计和贝叶斯估计两种方法。
此外还有自助法(bootstrap),交叉验证(cross-validation)和随机模拟(stochastic simulation)等功能,附加的绘图功能需要调用前述的 Rgraphviz and lattice 包。
2、R语言实现案例
博客《朴素贝叶斯分类与贝叶斯网络》有一个案例:数据准备环节
# 加载扩展包和数据 library(caret) data(PimaIndiansDiabetes2,package='mlbench') # 对缺失值使用装袋方法进行插补 preproc <- preProcess(PimaIndiansDiabetes2[-9],method="bagImpute") data <- predict(preproc,PimaIndiansDiabetes2[-9]) data$Class <- PimaIndiansDiabetes2[,9]
贝叶斯网络建模
# 加载包 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]'))
还有一个可以实现的包——pcalg包,来自博客R语言做贝叶斯网络结构学习
该博客主要介绍拓扑结构的构建,贴一个案例:
suffStat <-list(C = cor(iris[,1:4]), n = nrow(iris)) pc.fit <- pc(suffStat, indepTest = gaussCItest, alpha = 0.01,labels =names(iris[1:4]),verbose = TRUE) pc.fit plot(pc.fit)
________________________________________________________________________________________________________________
参考文献:
[1]算法杂货铺——分类算法之贝叶斯网络(Bayesian networks)
[3]算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)
[4]朴素贝叶斯分类与贝叶斯网络:http://www.r-bloggers.com/lang/chinese/1065
每每以为攀得众山小,可、每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~
———————————————————————————
R语言︱贝叶斯网络语言实现及与朴素贝叶斯区别(笔记)的更多相关文章
- 朴素贝叶斯python实现
概率论是非常多机器学习算法基础,朴素贝叶斯分类器之所以称为朴素,是由于整个形式化过程中仅仅做最原始.简单的如果. (这个如果:问题中有非常多特征,我们简单如果一个个特征是独立的.该如果称做条件独立性, ...
- 概率图模型(PGM)学习笔记(四)-贝叶斯网络-伯努利贝叶斯-多项式贝叶斯
之前忘记强调了一个重要差别:条件概率链式法则和贝叶斯网络链式法则的差别 条件概率链式法则 贝叶斯网络链式法则,如图1 图1 乍一看非常easy认为贝叶斯网络链式法则不就是大家曾经学的链式法则么,事实上 ...
- 概率图模型(PGM)学习笔记(二)贝叶斯网络-语义学与因子分解
概率分布(Distributions) 如图1所看到的,这是最简单的联合分布案例,姑且称之为学生模型. 图1 当中包括3个变量.各自是:I(学生智力,有0和1两个状态).D(试卷难度,有0和1两个状态 ...
- 第十三次作业——回归模型与房价预测&第十一次作业——sklearn中朴素贝叶斯模型及其应用&第七次作业——numpy统计分布显示
第十三次作业——回归模型与房价预测 1. 导入boston房价数据集 2. 一元线性回归模型,建立一个变量与房价之间的预测模型,并图形化显示. 3. 多元线性回归模型,建立13个变量与房价之间的预测模 ...
- 一步步教你轻松学朴素贝叶斯模型算法Sklearn深度篇3
一步步教你轻松学朴素贝叶斯深度篇3(白宁超 2018年9月4日14:18:14) 导读:朴素贝叶斯模型是机器学习常用的模型算法之一,其在文本分类方面简单易行,且取得不错的分类效果.所以很受欢迎,对 ...
- Python机器学习算法 — 朴素贝叶斯算法(Naive Bayes)
朴素贝叶斯算法 -- 简介 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法.最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Baye ...
- scikit-learn 朴素贝叶斯类库使用小结
之前在朴素贝叶斯算法原理小结这篇文章中,对朴素贝叶斯分类算法的原理做了一个总结.这里我们就从实战的角度来看朴素贝叶斯类库.重点讲述scikit-learn 朴素贝叶斯类库的使用要点和参数选择. 1. ...
- 机器学习Matlab打击垃圾邮件的分类————朴素贝叶斯模型
该系列来自于我<人工智能>课程回顾总结,以及实验的一部分进行了总结学习机 垃圾分类是有监督的学习分类最经典的案例,本文首先回顾了概率论的基本知识.则以及朴素贝叶斯模型的思想.最后给出了垃圾 ...
- 朴素贝叶斯算法--python实现
朴素贝叶斯算法要理解一下基础: [朴素:特征条件独立 贝叶斯:基于贝叶斯定理] 1朴素贝叶斯的概念[联合概率分布.先验概率.条件概率**.全概率公式][条件独立性假设.] 极大似然估计 ...
随机推荐
- MongoDB Driver 简单的CURD
c#中我们可以使用MongoDB.Driver驱动进行对MongoDB数据库的增删改查. 首先需要在NuGet中安装驱动 安装完毕后会发现会有三个引用 其中 MongoDB.Driver和MongoD ...
- C#将图片背景从透明变成白色
var img = System.Drawing.Image.FromStream(ms); int width = img.Width; int height = img.Height; var x ...
- 弥补wxpython无背景图片缺陷
思路: 通过设置Panel的背景样式为wx.BG_STYLE_CUSTOM: self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) 绑定Panel的背景事情: sel ...
- HBase 数据库检索性能优化策略--转
https://www.ibm.com/developerworks/cn/java/j-lo-HBase/index.html HBase 数据表介绍 HBase 数据库是一个基于分布式的.面向列的 ...
- BZOJ 2683: 简单题 [CDQ分治]
同上题 那你为什么又发一个? 因为我用另一种写法又写了一遍... 不用排序,$CDQ$分治的时候归并排序 快了1000ms... #include <iostream> #include ...
- 初学sql
bit 布尔类型 int nvarchar datetime 常用类型 nvarchar(max) 存文章(不超过5000) 字符串 用 '' . char/nchar,varchar/nvarcha ...
- ettercap+urlsnarf+driftnet+wireshark监听妹子上网
搞事肯定得确认目标.所以我们得先确认一个目标 确认目标这种事情不多说. 1.开启IP转发 echo 1 > /proc/sys/net/ipv4/ip_forward 然后ettercap ...
- Netty(一):入门篇
匠心零度 转载请注明原创出处,谢谢! 说在前面 上篇文章对Netty进行了初探:Netty初探,主要介绍了下我们为什么需要学习netty.netty介绍等:本篇文章接着上篇文章的内容.本篇为了方便大家 ...
- oneNote总结
22.添加附加文件删除后,文件大小没有发生改变的(优化文件和清空回收站)
- qt 移植到开发板
一.准备工作: 1.QT应用程序 2.工具链--->交叉工具链一安装,就会有标准的c库 3.扩展的第三方库(ARM)()触摸屏库(tslib.tar.gz) 4.QT库 二.使用交叉工具链编译t ...