首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用朴素贝叶斯获取类的概率

使用朴素贝叶斯获取类的概率
EN

Stack Overflow用户
提问于 2015-07-30 22:33:43
回答 1查看 393关注 0票数 1

我试着用两个类别来分类输入,这是代码。dinocrypto是两个类:

代码语言:javascript
复制
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)))

另一种方法是:

代码语言:javascript
复制
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

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

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

EN

回答 1

Stack Overflow用户

发布于 2015-07-31 00:57:32

这些都是完全等价的方法。然而,第一个是更可取的,因为对概率的对数工作使整个过程在数值上更稳定的。结果应该是相同的(直到数字错误)。

但是,在第二种方法中似乎有错误。

代码语言:javascript
复制
prob_dino *= p_w_given_dino

不使用您有cnt实例这一事实;它应该类似于

代码语言:javascript
复制
prob_dino *= pow(p_w_given_dino, cnt) 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31726677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档