使用朴素贝叶斯获得课堂的概率

时间:2015-07-30 14:33:43

标签: machine-learning classification probability text-classification naivebayes

我试图用两个类对输入进行分类,这里是代码。 dinocrypto分为两类:

for w, cnt in list(counts.items()): #count is dict with word and it's count value
    p_word = vocab[w] / sum(vocab.values()) 
    p_w_given_dino = (word_counts["dino"].get(w, 0.0) + 1) / (sum(word_counts["dino"].values()) + v) 
    p_w_given_crypto = (word_counts["crypto"].get(w, 0.0) + 1) / (sum(word_counts["crypto"].values()) + v)

    log_prob_dino += math.log(cnt * p_w_given_dino / p_word)
    log_prob_crypto += math.log(cnt * p_w_given_crypto / p_word)

print("Score(dino)  :", math.exp(log_prob_dino + math.log(prior_dino)))
print("Score(crypto):", math.exp(log_prob_crypto + math.log(prior_crypto)))

另一种方法是:

prior_dino = (priors["dino"] / sum(priors.values()))
prior_crypto = (priors["crypto"] / sum(priors.values()))
for w, cnt in list(counts.items()):
    p_word = vocab[w] / sum(vocab.values())
    p_w_given_dino = (word_counts["dino"].get(w, 0.0) + 1) / (sum(word_counts["dino"].values()) + v) 
    p_w_given_crypto = (word_counts["crypto"].get(w, 0.0) + 1) / (sum(word_counts["crypto"].values()) + v)
    prob_dino *= p_w_given_dino
    prob_crypto *= p_w_given_crypto
t_prior_dino = prob_dino * prior_dino
t_prior_crypto = prob_crypto * prior_crypto

在第二种方法中,我的值非常小。

哪一个是正确的,还是两个都正确?

1 个答案:

答案 0 :(得分:3)

这些是完全等效的方法。然而,第一个是优选的,因为对概率的对数使得整个过程更加数值稳定。结果应该相同(达到数值误差)。

然而,您似乎在第二种方法中有错误

prob_dino *= p_w_given_dino

没有使用cnt出现prob_dino *= pow(p_w_given_dino, cnt) 的事实;它应该像

if(vars.get("method").equalsIngoreCase("GET")){
    sampler.setMethod("GET");  //this will change current sampler's http method from POST to GET. 
}