一、朴素贝叶斯
首先第一个问题,什么是朴素贝叶斯?
贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。而我们所想要实现的留言过滤其实是一种分类行为,是通过对于概率的判断,来对样本进行一个归类的过程。
朴素贝叶斯分类(NBC)是以贝叶斯定理为基础并且假设特征条件之间相互独立的方法,先通过已给定的训练集,以特征词之间独立作为前提假设,学习从输入到输出的联合概率分布,再基于学习到的模型,输入A求出使得后验概率最大的输出B。
朴素贝叶斯公式:
或者说:
当我们假设各项条件之间是相互独立的,比如说“我觉得你很美”“他觉得你很美”,不论是“我”还是“他”觉得“你很美”都是无关的,并不会因为是谁来评价而影响这个评价,那么它就适合用朴素贝叶斯算法。
举一个很典型的例子,假设通过一些指标如长相、性格等来判断一个人我们是否要嫁给他,有这样一个表格:
长相 | 性格 | 身高 | 是否上进 | 结果 |
帅 | 坏 | 低 | 不上进 | 不嫁 |
丑 | 好 | 低 | 上进 | 不嫁 |
帅 | 好 | 低 | 上进 | 嫁 |
丑 | 好 | 高 | 上进 | 嫁 |
帅 | 坏 | 低 | 上进 | 不嫁 |
丑 | 坏 | 低 | 不上进 | 不嫁 |
帅 | 好 | 高 | 不上进 | 嫁 |
丑 | 好 | 高 | 上进 | 嫁 |
帅 | 好 | 高 | 上进 | 嫁 |
丑 | 坏 | 高 | 上进 | 嫁 |
帅 | 好 | 低 | 不上进 | 不嫁 |
帅 | 好 | 低 | 不上进 | 不嫁 |
这时当我们遇到一个小伙子并且我们知道以上条件:长相丑,性格坏,身高低,不上进,现在就可以转换成一个数学上的分类问题来比较 P(嫁|各项条件) 与 P(不嫁|各项条件) 谁的概率大我们就能给出嫁或者不嫁的答案。然而,我们需要保证这些条件之间没有关联,我们发现比如一个人美丑与他是否上进、一个人性格好坏和他身高之间是无关的,所以适用于朴素贝叶斯公式的条件,那么久可以进行计算了。
经过统计:
p(嫁) = 6/12(总样本数) = 1/2
p(丑|嫁) = 3/6 = 1/2
p(坏|嫁)= 1/6
p(低|嫁) = 1/6
p(不上进|嫁) = 1/6
p(丑) = 1/3
p(坏) = 1/3
p(低) = 7/12
p(不上进) = 1/3
我们带入公式P(嫁|丑、坏、低、不上进)=P(丑、坏、低、不上进|嫁)*P(嫁)/P(丑、坏、低、不上进)=[P(丑|嫁)*P(坏|嫁)*P(低|嫁)*P(不上进|嫁)] / [P(丑)*P(坏)*P(低)*P(不上进)]= (1/2*1/6*1/6*1/6*1/2)/(1/3*1/3*7/12*1/3)
下面我们根据同样的方法来求P(不嫁|丑、坏、低、不上进)= ((1/6*1/2*1*1/2)*1/2)/(1/3*1/3*7/12*1/3)
由于P(嫁|丑、坏、低、不上进)<P(不嫁|丑、坏、低、不上进),所以我们得出结论 不嫁。
这时就有了一个积蓄已久的问题,在计算之前我们为什么要保证各项条件之间相互独立?
假如没有这个假设,那么我们对右边这些概率的估计其实是不可做的,这么说,我们这个例子有4个特征,其中帅包括{帅,丑},性格包括{不好,坏},身高包括{高,低},上进包括{不上进,上进},那么四个特征的联合概率分布总共是4维空间,总个数为2*2*2*2=16个。在现实生活中,有非常多的特征,每一个特征的取值非常多,那么通过统计来估计后面概率的值,变得几乎不可做,这是为什么需要假设特征之间独立的原因。假如我们没有假设特征之间相互独立,那么我们统计的时候,就需要在整个特征空间中去找,将会更多,比如我们就需要在嫁的条件下,去找四种特征全满足的人的个数,这样的话,由于数据的稀疏性,很容易统计到0的情况。 这样是不合适的。
那么我们就引出了下一个问题,如何解决0概率的问题?
零概率问题:在计算新实例的概率时,如果某个分量在训练集中从没出现过,会导致整个实例的概率计算结果为0。针对文本分类就是当一个词语在训练集中没有出现过,那么该词语的概率是0,使用连乘法计算文本出现的概率时,整个文本出现的概率就也是0,得到的结果就会非常不合理!
我们是不是可以对这种数据采用加一来解决?
法国数学家拉普拉斯最早提出用加1的方法估计没有出现过的现象的概率,所以加1平滑也叫做拉普拉斯平滑。就是对于一个离散的值我们在使用的时候不是直接输出它的概率,而是对概率值进行“平滑” 处理。即默认所有的特征都出现过一次,将概率改成下面的形式 其中 N 是全体特征的总数。
如由如下训练数据学习一个朴素贝叶斯分类器并确定