塞进裤子ヾ(≧O≦)〃嗷~

0%

朴素贝叶斯 机器学习实战

朴素贝叶斯用于文档分类

任务:

给定一段文本,判断属于哪个类别。

在文档分类中,整个文档(如一封电子邮件)是实例,而邮件中的某些元素则构成特征。我们可以观察文档中出现的词,并把每个词作为一个特征,而每个词的出现或者不出现作为该特征的值,这样得到的特征数目就会跟词汇表中的词的数目一样多。

贝叶斯和朴素贝叶斯的概念是不同的,区别就在于“朴素”二字,朴素贝叶斯对条件个概率分布做了条件独立性的假设。 比如下面的公式,假设有3个特征:

$P(y|X) = \frac{P(X|y)P(y)}{P(X)}=\frac{P(x_1,x_2,x_3|y)P(y)}{P(X)}$

由于每个特征独立,进一步拆分为

$\frac{P(x_1,x_2,x_3|y)P(y)}{P(X)} = \frac{P(x_1|y)P(x_2|y)P(x_3|y)P(y)}{P(X)}$

算法:

$P(c_i|W) = \frac{P(W|c_i)P(c_i)}{P(W)}$

$W$为test文本单词构成的向量,$c_i$表示属于类别i

我们使用上述公式,对每个类计算该值,然后选择概率最大的类别作为最后的分类。

于对于每个类别ci,P(w)是固定的。我们就可以简化为通过比较右边分子值得大小来做决策分类。

$P(c_i)$ 表示属于ci的文档出现的概率=count(属于ci的文档)/count(总文档数)
$ P(W|ci)= p(w0 | ci)p(w1 | ci)p(w2 | ci)…p(wn | ci)$ 朴素,每个特征相互独立
P(w0|ci)wo在ci的文档中出现的次数/ w0在所有文档出现的总次数 错
P(w0|ci)wo在ci的文档中出现的次数/ ci的文档中出现的单词总数 对

  • 1 建立词汇表
  • 2.计算$P(c_i)$和$P(W|c_i)$
  • 3 test时,找到每个test word所对应的$P(w_j|c_i)$,计算P(c_i|W) =$P(c_i)$和$P(W|c_i)$,找到概率最大的类别。

改进

  • 为防止分子太小,使得概率为0,加入$log(P)$

  • 在利用贝叶斯分类器对文档进行分类时,要计算多个概率的乘积以获得文档属于某个类别的概率,即计算 p(w0|1) * p(w1|1) * p(w2|1)。如果其中一个概率值为 0,那么最后的乘积也为 0。为降低这种影响,可以将所有词的出现数初始化为 1,并将分母初始化为 2 (取1 或 2 的目的主要是为了保证分子和分母不为0,大家可以根据业务需求进行更改)。

    或者使用add-one smoothing,分子加1,分母加V

例子:

训练数据有36封邮件,每个邮件10个单词,24封正常,12封为垃圾邮件。

对于一封新邮件,内容为“购买物品,不是广告”,判读其是否是垃圾邮件。

只要比较$P(正常|内容)$和$P(垃圾|内容)$

使用贝叶斯定理:

$P(正常|内容) = \frac{P(内容|正常)P(正常)}{P(内容)}$

$P(垃圾|内容) = \frac{P(内容|垃圾)P(垃圾)}{P(内容)}$

由于分母一样比较分子就可以。

$P(正常)$ 为先验概率,即正常邮件在所有邮件中的占比, $P(垃圾)$同理

根据朴素贝叶斯的条件独立性:

$P(内容|正常) = p(购买,物品,不是,广告|正常) = P(购买|正常)P(物品|正常)P(不是|正常)P(广告|正常)$

如何计算$P(购买|正常)$?

$P(购买|正常) = \frac{正常邮件中出现的购买单词的次数}{正常邮件中的所有单词的总数(含重复)}$

需要对词库中每个单词计算$P(word_i|正常)$ 和 $P(word_i|垃圾)$

例子2:

垃圾邮件3封,正常3封,左边为垃圾邮件和正常邮件中出现的单词,

朴素贝叶斯例子参考
https://blog.csdn.net/c406495762/article/details/77341116

代码:

https://github.com/drawStar/Machine-Learning/blob/master/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%AE%9E%E6%88%98/ch04/day1.py

if help:小手一抖点个广告 or 大手一挥资助一下