对朴素贝叶斯(Naive Bayes)的一些理解
最近做人工智能课的一个实验时才发现自己对Naive Bayes的意义理解不透彻。于是直接去看Wikipedia里的解释,就感觉很清楚了。也许这篇文章所讲述的东西在有些书里面已经提及了,但由于我没看这些书,而且老师的PPT似乎没刻意指出这一点,所以就在这里再总结一下。
老师之前所讲的大多都是与概率相关的一些定义与定律,如事件的独立性、条件概率如何计算等问题。我之前觉得这些在概率论里面已经讲过了,也就没仔细听课。确实,概率表达式相关的推导应该对我们来说是很熟悉了,Naive Bayes所涉及的操作也就是这些公式的转换而已(具体而言,就是把 \(P(C|x_1,x_2,...,x_n)\) 变换成 \(\frac{P(x_1|C)P(x_2|C)...P(x_n|C)}{P(x_1,x_2,...,x_n)}\)。 假定在事件\(C\)发生时,\(x_1\)至\(x_n\)均是独立分布的)。
但我一直没有去想过,Naive Bayes为什么要这么变换,把一种概率表达式写成另一种;以及为什么要做这个假设。
所以本文就从实际例子出发来解释Naive Bayes分类器的假设在现实中的意义。实际例子就直接用这个实验所涉及的——根据邮件内容,将邮件分类成垃圾邮件和正常邮件。
完整的问题是这样的:预先给定了一些邮件的内容,并且已经标记了它们是否是垃圾邮件,现在要根据新邮件的内容来判断它是不是垃圾邮件。
而且我们已经知道使用统计手段来解决这个问题的技术路线了:
首先将训练数据集中的每封邮件都用分词工具分词。然后在得到的所有分词结果中,选出一些最具代表性的词汇作为特征词汇(可能有几千个或更多!)。
假设我们一共选择了n个特征词汇。对于每一封邮件,我们用$x_i(i=1,2,…,n)$这n个二值变量来表示,每封邮件中第i个特征词汇是否出现,而用C(就是class的首字母)来标记该封邮件是否为垃圾邮件。
于是我们就得到了一个元素格式为\(\{x_1,...,x_n,C\}\)的列表。每个条目对应一封训练集中的邮件。
现在需要根据新邮件的特征词汇字段\(\{x’_1,...,x’_n\}\),来预测它的C的概率分布。
如果使用最直接的使用频率来模拟概率的思想出发,那么就应该从训练数据集中统计出所有特征词汇字段为\(\{x'_1,...,x'_n\}\)的邮件,然后看这些邮件中有多少是垃圾,多少是正常的。从而用该比值作为概率分布。
从理论上讲,这个方法是正确的,但是由于n太大,我们的数据集难以在\(\{x_1,...,x_n\}\)这么大的n维空间内(哪怕每个维度只有两个取值),为每种特征词汇的出现情况获取到足够多的样本。在现实中,这体现为:词汇太多了,你自己写的一封原创的邮件,几乎不可能存在另一封别人写的邮件所包含的特征词汇与你写的邮件所包含的特征词汇完全相同。
这就是为什么要有Naive Bayles。
Naive Bayles假设:在给定每个类别(在本例中,就是给定了某封邮件是否为垃圾邮件)的条件下,第i个特征词汇是否出现,即xi的概率分布,与其他xj变量是条件独立的。如果仅考察在训练数据集中某一类别邮件中,某个词的出现概率,样本就会大大增多。因为总共也只有两个类别。