朴素贝叶斯文本分类不正确的结果
Naive Bayes text classification incorrect results
我编写了一个朴素贝叶斯分类器,但它似乎工作得不是特别好。算字数等不是问题,概率一直是。
我一直在使用的方法从 this book 的第 180 页开始
但我会使用 wiki article 中的术语使其更通用。
培训
通过训练,我正在为类别中出现的每个单词创建一个概率:
for category in categories:
for word in category_vocabulary[category]:
word_probability[category][word] = (category_vocabulary[category][word] + 1) / (total_words_in_category[category] + len(vocabulary))
所以我得到一个词在一个类别中出现的总次数,加一,然后除以一个类别中的总词数,再加上词汇量(不同的词)。这是 P(xi|Ck)
我也计算了一个类别的概率p(Ck),category_probability,简单来说就是一个类别的词数除以所有类别的词数
for category in categories:
category_probability[category] = total_words_in_category[category] / sum(total_words_in_category.values())
分类
为了分类,我循环遍历待分类文档的所有标记,并计算文本中所有单词的word_probability的乘积。
for category in categories:
if word in word_probability[category]:
if final_probability[category] == 0:
final_probability[category] = word_probability[category][word]
else:
final_probability[category] *= word_probability[category][word]
最后,为了计算分数,我将其乘以类别概率
score = category_probability[category] * final_probability[category]
这个分数似乎完全错误,我不知道该怎么办。当我查阅其他人的方法时,他们似乎涉及一些日志和指数,但我不确定它们如何适合这本书和维基文章。
任何帮助将不胜感激,因为我想我做错了什么对于更了解它的人来说是显而易见的。
This score seems to be completely wrong and I'm not sure what to do.
首先,类别概率不是通过类别中的单词占单词总数的比例来估计的
for category in categories:
category_probability[category] = total_words_in_category[category] / sum(total_words_in_category.values())
但一个类别中 句子的数量 与句子总数(或段落、文档、对象 - 您正在分类的东西)的对比。于是
for category in categories:
category_probability[category] = total_objects_in_category[category] / sum(total_objects_in_category.values())
When I've looked up other peoples methods they seem to involve a few logs and exponents but I'm not sure how they fit in with the book and wiki article.
这是因为直接概率计算(您所做的)数值不稳定。你最终会乘以很多小数字,因此精度会呈指数级下降。因此,我们使用了这个简单的数学等式:
PROD_i P(x) = exp [ log [ PROD_i P_i(x) ] ] = exp [ SUM_i log P_i(X) ]
因此,您存储概率的对数,而不是存储概率,而不是将它们相乘,而是将它们相加。如果你想恢复真实概率,你所要做的就是取 exp 值,但对于分类你不必这样做,因为 P(x) > P(y) <-> log P(x) > log P(y)
我编写了一个朴素贝叶斯分类器,但它似乎工作得不是特别好。算字数等不是问题,概率一直是。
我一直在使用的方法从 this book 的第 180 页开始 但我会使用 wiki article 中的术语使其更通用。
培训
通过训练,我正在为类别中出现的每个单词创建一个概率:
for category in categories:
for word in category_vocabulary[category]:
word_probability[category][word] = (category_vocabulary[category][word] + 1) / (total_words_in_category[category] + len(vocabulary))
所以我得到一个词在一个类别中出现的总次数,加一,然后除以一个类别中的总词数,再加上词汇量(不同的词)。这是 P(xi|Ck)
我也计算了一个类别的概率p(Ck),category_probability,简单来说就是一个类别的词数除以所有类别的词数
for category in categories:
category_probability[category] = total_words_in_category[category] / sum(total_words_in_category.values())
分类
为了分类,我循环遍历待分类文档的所有标记,并计算文本中所有单词的word_probability的乘积。
for category in categories:
if word in word_probability[category]:
if final_probability[category] == 0:
final_probability[category] = word_probability[category][word]
else:
final_probability[category] *= word_probability[category][word]
最后,为了计算分数,我将其乘以类别概率
score = category_probability[category] * final_probability[category]
这个分数似乎完全错误,我不知道该怎么办。当我查阅其他人的方法时,他们似乎涉及一些日志和指数,但我不确定它们如何适合这本书和维基文章。
任何帮助将不胜感激,因为我想我做错了什么对于更了解它的人来说是显而易见的。
This score seems to be completely wrong and I'm not sure what to do.
首先,类别概率不是通过类别中的单词占单词总数的比例来估计的
for category in categories:
category_probability[category] = total_words_in_category[category] / sum(total_words_in_category.values())
但一个类别中 句子的数量 与句子总数(或段落、文档、对象 - 您正在分类的东西)的对比。于是
for category in categories:
category_probability[category] = total_objects_in_category[category] / sum(total_objects_in_category.values())
When I've looked up other peoples methods they seem to involve a few logs and exponents but I'm not sure how they fit in with the book and wiki article.
这是因为直接概率计算(您所做的)数值不稳定。你最终会乘以很多小数字,因此精度会呈指数级下降。因此,我们使用了这个简单的数学等式:
PROD_i P(x) = exp [ log [ PROD_i P_i(x) ] ] = exp [ SUM_i log P_i(X) ]
因此,您存储概率的对数,而不是存储概率,而不是将它们相乘,而是将它们相加。如果你想恢复真实概率,你所要做的就是取 exp 值,但对于分类你不必这样做,因为 P(x) > P(y) <-> log P(x) > log P(y)