我重新提出了一个问题(名称相同)多项式朴素贝叶斯分类器。那个问题似乎已经接受了一个答案,但我认为这个答案要么是错误的,要么需要更多的解释,因为我仍然不明白。
到目前为止,我在R中看到的所有朴素贝叶斯分类器(包括bnlearn和klaR)的实现都假设特征具有高斯似然分布。
在R中是否有使用多项式似然分布的朴素贝叶斯分类器的实现(类似于scikit-learn的MultinomialNB)?
特别是,如果有办法在这些模块中调用naive.bayes
,使似然分布以多项式分布估计,我非常希望看到一个如何操作的例子。我已经搜索过例子,但没有找到。例如:klaR.NaiveBayes
中的usekernal
参数就是这个用途吗?
回答:
我不知道naive.bayes
模型上的predict
方法调用的是什么算法,但你可以从条件概率表(最大似然估计)中自己计算预测结果
# 你可能需要从这里获取gRain的依赖项# source("http://bioconductor.org/biocLite.R")# biocLite("RBGL") library(bnlearn) library(gRain)
使用naive.bayes
帮助页面中的第一个例子
data(learning.test) # 拟合模型 bn <- naive.bayes(learning.test, "A") # 查看条件概率表 fit <- bn.fit(bn, learning.test) # 检查条件概率表(比例)是否是多项式分布的最大似然估计 # 节点A: all.equal(prop.table(table(learning.test$A)), fit$A$prob) # 节点B: all.equal(prop.table(table(learning.test$B, learning.test$A),2), fit$B$prob) # 查看预测结果 - 包括概率 pred <- predict(bn, learning.test, prob=TRUE) pr <- data.frame(t(attributes(pred)$prob)) pr <- cbind(pred, pr) head(pr, 2)# preds a b c# 1 c 0.29990442 0.33609392 0.36400165# 2 a 0.80321241 0.17406706 0.02272053
通过运行查询从条件概率表中计算预测概率 – 使用’gRain’
# 使用结点树算法查询 jj <- compile(as.grain(fit)) # 获取第一观测的预测概率 net1 <- setEvidence(jj, nodes=c("B", "C", "D", "E", "F"), states=c("c", "b", "a", "b", "b")) querygrain(net1, nodes="A", type="marginal")# $A# A# a b c # 0.3001765 0.3368022 0.3630213 # 获取第二观测的预测概率 net2 <- setEvidence(jj, nodes=c("B", "C", "D", "E", "F"), states=c("a", "c", "a", "b", "b")) querygrain(net2, nodes="A", type="marginal")# $A# A# a b c # 0.80311043 0.17425364 0.02263593
所以这些概率与bnlearn
得到的结果非常接近,并且是使用最大似然估计计算的,