“移花接木”(朴素贝叶斯分类器)
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参数可以设置成上面四种方式来连接数据框
举个例子:给了a和b两个数据框
四种连接方式的结果:
#----训练样本----#
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
以上是关于“移花接木”(朴素贝叶斯分类器)的主要内容,如果未能解决你的问题,请参考以下文章