Advertisement

r语言bnlearn 结构图数据 java_朴素贝叶斯和贝叶斯网络算法及其R语言实现

阅读量:

最近在硬怼数据挖掘中开启新篇章,在贝叶斯方向的研究道路上投入了大量精力并取得了一些进展。尽管最初预计仅需熟悉基础概念即可打下坚实基础但随着深入学习发现要想真正掌握机器学习的核心算法仍需付出更多努力。特别是在贝叶斯分类器这一模块由于涉及复杂的数学推导与编程实现因此需要投入更多时间与精力才能熟练运用这些方法解决实际问题。本文旨在向读者介绍贝叶斯分类器中两个关键算法:朴素贝叶斯与贝叶斯网络并展示它们在R语言环境下的具体实现过程。

小编最近在怼的data mining:

format,png

目录

⊙ 朴素贝叶斯分类器及R实现

⊙ 贝叶斯网络及R实现

⊙ 朴素贝叶斯与贝叶斯网络的区别

朴素贝叶斯分类器

朴素贝叶斯分类是一种相对简单的机器学习算法,在术语使用上我们通常将这种算法称为朴素贝叶斯分类器,并非因为它具备某种特殊的优势或特性;相反地,在这种方法的核心思想非常基础且易于理解——它假设数据集中各个特征之间相互独立,并且对每个特征的重要性给予同等重视。其基本原理如下:对于一个待分析的对象(即待分类项),我们需要计算在该对象出现的情况下各类别发生的概率;哪个类别的概率值更高,则该对象就被归类到该类别中去。举个例子来说:假如我问你一位NBA球员在一场比赛中单场抢下30个篮板球,请问他会是什么位置?那么你很有可能会答"中锋"——这是因为中锋球员通常位于球队内线位置,在比赛中拥有较高的身高优势以及出色的空间感;当然这也有可能是一位顶级大前锋(SG),但在缺乏其他相关信息的情况下我们倾向于选择概率更高的类别来进行判断。

朴素贝叶斯的分类过程如图所示,图片来自:

http://www.cnblogs.com/leoo2sk/archive/2010/09/17/naive-bayesian-classifier.html

100fb0a1e6bdb0a0f77119a3f57281b0.png

从图中呈现的是贝叶斯分类器的结构框架。该分类系统可划分为三个具体阶段:包括准备、训练以及应用三个环节。

在准备工作的阶段中负责为朴素贝叶斯分类提供基础准备的任务主要是确定关键特征属性并将其合理分组随后由人工操作人员对一定数量的待分类项目进行初步归类操作并构建起完整的训练数据集该阶段的主要输入包括所有待处理的数据样本输出则是识别出的关键特征属性以及构建完成的训练数据集

分类训练阶段的主要目标就是生成一个有效的分类器模型,在这一过程中对类条件概率进行计算占据着至关重要的位置。具体而言,在这个阶段中我们需要计算每个类别在训练样本中的出现频率以及每个特征属性划分对各个类别所对应的条件概率估计值;其中类条件概率的准确估计对于后续模型性能具有决定性影响。(公式不好打就不放公式了)

在应用阶段的任务将完全由程序自动执行;为了实现这一目标,我们需要将之前训练好的分类器分别采用R或Python进行开发。

下面来看看朴素贝叶斯简单的在R语言中的实现。

在R语言中,这两个包均提供用于构建朴素贝叶斯分类器的函数。本文将采用e1071包中的分类功能作为示例。该数据集是关于美国国会议员在九种不同票型上的投票记录。

先简单看下它的数据结构:

format,png

使用naiveBayes( )函数进行朴素贝叶斯建模:

model

model

Naive Bayes Classifier for Discrete Predictors

Call:

naiveBayes.default(x = X, y = Y, laplace = laplace)

A-priori probabilities:(类先验概率)

Y

democrat republican

0.6137931 0.3862069

Conditional probabilities:(V1-V16的类条件概率)

V1

Y n y

democrat 0.3953488 0.6046512

republican 0.8121212 0.1878788

(V2-V16类条件概率省略)

#进行分类预测

predict(model,HouseVotes84[1:10,],type="raw")

democrat republican

[1,] 1.029209e-07 9.999999e-01

[2,] 5.820415e-08 9.999999e-01

[3,] 5.684937e-03 9.943151e-01

[4,] 9.985798e-01 1.420152e-03

[5,] 9.666720e-01 3.332802e-02

[6,] 8.121430e-01 1.878570e-01

[7,] 1.751512e-04 9.998248e-01

[8,] 8.300100e-06 9.999917e-01

[9,] 8.277705e-08 9.999999e-01

[10,] 1.000000e+00 5.029425e-11

由上面的预测概率表可知,前10个记录的预测分类为

在第1个位置上, 我们观察到了三个共和党派预测. 在第7个位置上, 我们又获得了单个民主党派预测.

贝叶斯网络及R实现

9fc8f5ed3fae58621e156226c57a49c4.png

贝叶斯网络(BNN)基本概念有两个:

一个有向无环图(Directed Acyclic Graph)和一个条件概率表集合。

DAG是由随机变量(类别及特征)构成的集合V,并通过有向边E(A->B)来表明其中元素A为元素B的父亲节点。这些有向边的存在意味着两元素间存在依赖关系,并非相互独立。为了更好地描述这种复杂的关系网络,在这一框架下提出了一个条件性独立理论基础:任何节点v一旦已知其父节点信息就不再受其他无关节点的影响。具体而言,在给定父节点par(v)的情况下(即已经掌握所有par(v)的相关信息),任何其他无关节点x1,x2,...,xn都不会影响当前研究对象的概率分布情况。

贝叶斯网络的建模一般包括两个步骤:

(1) 构建网络架构;(2) 计算每个节点及其相关概率分布。通过预先设计的算法程序能够获取该系统的拓扑布局。一旦确定了适合的网络架构,其相关联的概率分布表也随之建立完成.其概率计算过程与传统贝叶斯分类器的方法具有相似之处.

在R语言中可以通过bnlearn包来进行贝叶斯网络的建模操作。需要注意的是该包不具备处理混合数据的能力因此建议对连续型数据进行预处理工作即对其进行离散化处理后再投入模型训练过程。bnlearn功能模块主要包括网络结构的学习参数估计以及推理机制具体内容可参考下图所示的流程图。

format,png

在该案例中调用mlbench库中的PimaIndiansDiabetes2数据集。由于该数据集包含显著数量的缺失值,在构建贝叶斯网络模型之前,请问您确定要继续?#加载扩展包和数据

library(caret)

data(PimaIndiansDiabetes2,package="mlbench")#装袋法对缺失值插补

preproc

data

data$Class

然后对填补后的数据集进行训练:#贝叶斯网络建模

library(bnlearn)

#数据离散化

data2

data2$class

#爬山算法学习结构

bayesnet

#显示网络图

plot(bayesnet)

#修改网络图中的箭头指向

bayesnet

plot(bayesnet)

拓扑结构如图:

format,png

然后利用bn.fit( )函数进行参数学习:#参数学习

fitted

#训练样本预测并提取混淆矩阵

pre

#进行条件推断

cpquery(fitted,(class=="pos"),(age=="(36,81]"&mass=="(34.8,67.1]"))

[1] 0.5934619

基于给定的条件进行推导可知,在年龄介于36至81岁以及mass值落在34.8至67.1区间内的人群中患上糖尿病的概率为0.5934619

朴素贝叶斯与贝叶斯网络的区别

不想写了,一图流:

a25368ba8b9ecc19bd8972895081069e.png

总结

贝叶斯分类器是一种基于属性集与类变量概率关系构建模型的方法。其中基于类条件概率估计的贝叶斯分类器主要有两种实现形式:朴素贝叶斯方法与贝叶斯网络。本文简要介绍了两种主要的贝叶斯分类方法,并展示其在R语言环境下的实现过程。之后小编将继续分享更多关于算法学习与程序实现的心得体会。

文末放一张昨晚小编做贝叶斯分类题的草稿哈哈哈:

format,png

全部评论 (0)

还没有任何评论哟~