“移花接木”(朴素贝叶斯分类器)

Posted Go一起学统计

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“移花接木”(朴素贝叶斯分类器)相关的知识,希望对你有一定的参考价值。

朴素贝叶斯分类器
“移花接木”(朴素贝叶斯分类器)

朴素贝叶斯(naïve Bayes)法是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入x,利用贝叶斯定理后验概率最大的y。与朴素贝叶斯分类器相关的还有半朴素贝叶斯分类器,贝叶斯网络等。关于朴素贝叶斯分类器理论的深入学习,案例剖析,大家可以看一看周志华《机器学习》里面的判断西瓜好坏的分类案例。

“移花接木”(朴素贝叶斯分类器)

这里之所以称为“移花接木”,目的就是用A的算法去验证B的理论,看看是不是正确的。本文用朴素贝叶斯分类器中的方法去验证李航《统计学习方法》中的第四章4.2节的例4.1

对下面例4.1进行代码验证

“移花接木”(朴素贝叶斯分类器)

“移花接木”(朴素贝叶斯分类器)

朴素贝叶斯分类算法得出的结果

“移花接木”(朴素贝叶斯分类器)

Perfect!答案一样,因为1/45=0.02222222,1/15=0.06666667。

因为0.06666667>0.02222222

所以y=-1

从图片中的理论方法可以看出最后算概率的时候是连乘的形式。是在类变量已知的条件下去求测试样本不同特性的概率,然后连乘并乘上该分类变量在测试样本里出现的概率。如果其中一个属性的条件概率为0,结果都会变成0。处理方法:1.选择训练集是避免这一结果发生2.做拉普拉斯修正。

朴素贝叶斯分类算法代码:

library(plyr)

library(reshape2)

#---创建贝叶斯分类器---#

#生成类别概率

class_prob <- function(train.data, C){

length.train <- nrow(train.data)

dTemp <- ddply(train.data, C, "nrow")

dTemp <- ddply(dTemp, C, mutate, prob = nrow/length.train)

dTemp[,-2]}

#生成每个类别下特征取不同值的概率

feature_class_prob <- function(train.data, C){  

  data.melt <- melt(train.data,id=c(C))  

  aa <- ddply(data.melt, c(C,"variable","value"), "nrow")

#统计频数

  bb <- ddply(aa, c(C,"variable"), mutate, sum = sum(nrow), prob = nrow/sum)  

#算概率

  colnames(bb) <- c("class.name","feature.name", "feature.value",

 "feature.nrow", "feature.sum","prob")#增加列名

bb[,c(1,2,3,6)]#返回1,2,3,6列的结果}

#根据测试集算概率

pre_class <- function(oneObs, pc,pfc){

colnames(oneObs) <- c("feature.name", "feature.value")#测试集(oneObs

只需要特性名和特性值

colnames(pc) <- c("class.name","prob")

#数据框包含类名和后验概率(prob

测试样本在每个类别下的概率(pc

colnames(pfc) <- c("class.name","feature.name","feature.value","prob")

#数据框包含类名、特征名、特征值和后验概率(prob

每个类别下不同特征的概率(pfc

  feature.all <- join(oneObs,pfc,by=

c("feature.name","feature.value"),type="inner") 

#算条件概率

  feature.prob <- ddply(feature.all,.(class.name),summarize,prob_fea=prod(prob))

#prod表示连乘函数

  class.all <- join(feature.prob,pc,by="class.name",type="inner")

#算类别概率

  ddply(class.all,.(class.name),mutate,

pre_prob=prob_fea*prob)[,c(1:4)]}#输出结果

这里对join函数里面type类型做一个说明

“移花接木”(朴素贝叶斯分类器)

“移花接木”(朴素贝叶斯分类器)

join函数中type参数可以设置成上面四种方式来连接数据框

举个例子:给了ab两个数据框

“移花接木”(朴素贝叶斯分类器)“移花接木”(朴素贝叶斯分类器) 

四种连接方式的结果:

 

#----训练样本----#

train.data <-data.frame(

  A1=c("1","1","1","1","1","2","2","2","2","2","3","3","3","3","3"),

  A2=c("S","M","M","S","S","S","M","M","L","L","L","M","M","L","L"),

  C=c("-1","-1","1","1","-1","-1","-1","1","1","1","1","1","1","1","-1"))

train.data

#----分类判别----#

#预测样本

oneObs<-data.frame(

  feature.name =c("A1", "A2"),

  feature.value =c("2","S"))

#预测分类

pc<-class_prob(train.data,"C")

pfc <- feature_class_prob(train.data,"C")

pre_class(oneObs, pc,pfc)


参考文献:

[1]李航.统计学习方法[M].北京:清华大学出版社,2012.03

[3]周志华.机器学习[M].北京:清华大学出版社,2015

长按二维码
关注我们吧

以上是关于“移花接木”(朴素贝叶斯分类器)的主要内容,如果未能解决你的问题,请参考以下文章

动态朴素贝叶斯分类器和朴素贝叶斯分类器有啥区别

朴素贝叶斯分类器原理

机器学习系列-朴素贝叶斯分类器

朴素贝叶斯-商品评论情感分析

机器学习九大算法---朴素贝叶斯分类器

19贝叶斯分类器:半朴素贝叶斯分类器(属性之间存在依赖)