R中的多项式朴素贝叶斯分类器

时间:2014-05-22 21:02:17

标签: r machine-learning

我正在重新提问(同名)Multinomial Naive Bayes Classifier。这个问题似乎已经接受了一个我认为错误的答案,或者我想要更多的解释,因为我仍然不理解。

到目前为止,我在R中看到的每个Naive Bayes分类器(包括bnlearnklaR)都有假设这些特征具有高斯可能性的实现。

在R中是否使用多项式可能性实现了朴素贝叶斯分类器(类似于scikit-learn's MultinomialNB)?

特别是 - 如果事实证明有一些方法可以在这些模块中调用naive.bayes,那么可能性是通过多项分布来估算的 - 我真的很感激这样做的一个例子。做完了。我搜索了一些例子,但没有发现任何例子。例如:这是usekernal中的klaR.NaiveBayes参数是什么?

1 个答案:

答案 0 :(得分:1)

我不知道predict方法调用naive.bayes模型的算法是什么,但您可以从条件概率表(mle估计值)自己计算预测

# You may need to get dependencies of gRain from here
#   source("http://bioconductor.org/biocLite.R")
#   biocLite("RBGL")

    library(bnlearn)
    library(gRain)

使用naive.bayes帮助页面中的第一个示例

    data(learning.test)

    # fit model
    bn <- naive.bayes(learning.test, "A")   

    # look at cpt's
    fit <- bn.fit(bn, learning.test)    

    # check that the cpt's (proportions) are the mle of the multinomial dist.
    # Node A:
    all.equal(prop.table(table(learning.test$A)), fit$A$prob)
    # Node B:
    all.equal(prop.table(table(learning.test$B, learning.test$A),2), fit$B$prob)


    # look at predictions - include probabilities 
    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

通过运行查询从cpt计算预测概率 - 使用'gRain'

    # query using junction tree- algorithm
    jj <- compile(as.grain(fit))

    # Get ptredicted probs for first observation
    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 

    # Get ptredicted probs for secondobservation
    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得到的概率,并使用mle计算,