赞
踩
朴素贝叶斯是课程中所介绍的另一种生成式学习算法。它针对的是输入x是离散的情况。
为了讲解朴素贝叶斯算法,我们设想决定设计一个电子邮件垃圾邮件过滤器,我们希望对邮件进行分类。这个和之前的分类任务有所不同,这个是文本分类。它并没有体重、面积、房间数这种如此明显的特征,它有的只是一堆文本而已,那么首先我们需要考虑如何构建特征向量?
我们利用一个特征向量来表示一个电子邮件,这个向量的长度等于字典里面的单词数,例如字典中有35000个单词,那么这个向量就有35000维。如果电子邮件包含字典中的第i个单词,那么 x i = 1 x_i=1 xi=1,否则就是 x i = 0 x_i=0 xi=0。编码到特征向量的词汇的集合称之为词汇表,特征向量的维度和词汇表的容量是一致的。
现在我们要构建一个生成模型,所以我们需要对 p ( x ∣ y ) p(x|y) p(x∣y)来建模。但是如果词汇表中有50000个单词( x 1 , x 2 , . . . , x 50000 x_1,x_2,...,x_{50000} x1,x2,...,x50000),那么特征向量就会有 2 50000 2^{50000} 250000种可能,如果说我们采用多项式分布对x进行建模的话,那么我们就会有 2 50000 − 1 2^{50000}-1 250000−1个参数需要确定(每一种结果输出的概率),这么多参数要拟合是不可行的。
我们需要做出一个very strong的假设(大概就是假定数据比较接近某种理想态的意思),我们将假设在给定y条件下, x i x_i xi是条件独立的,即 p ( x 1 , x 2 , . . . , x 50000 ∣ y ) = p ( x 1 ∣ y ) p ( x 2 ∣ y ) . . . p ( x 50000 ∣ y ) p(x_1,x_2,...,x_{50000}|y)=p(x_1|y)p(x_2|y)...p(x_{50000}|y) p(x1,x2,...,x50000∣y)=p(x1∣y)p(x2∣y)...p(x50000∣y),这个假设称之为朴素贝叶斯假设,由此产生的算法是朴素贝叶斯分类器。这个假设通俗理解就是:对于一封垃圾邮件,“buy”这个单词并不影响"price"这个单词出现的概率。【提醒:条件独立和独立不是一个东西,具体可见https://zhuanlan.zhihu.com/p/58593725,下面将这篇文章的阐述摘录出来了】
再说回模型的事儿,现在我们已知 p ( x 1 , . . . , x 50000 ∣ y ) = ∏ i = 1 n p ( x i ∣ y ) p(x_1,...,x_{50000} \mid y)=\prod_{i=1}^{n}{p(x_i \mid y)} p(x1,...,x50000∣y)=∏i=1np(xi∣y),那么此模型由以下参数决定: ϕ i ∣ y = 1 = p ( x i = 1 ∣ y = 1 ) {\phi}_{i \mid y=1}=p(x_i=1 \mid y=1) ϕi∣y=1=p(xi=1∣y=1), ϕ i ∣ y = 0 = p ( x i = 1 ∣ y = 0 ) {\phi}_{i \mid y=0}=p(x_i=1 \mid y=0) ϕi∣y=0=p(xi=1∣y=0)以及 ϕ y = p ( y = 1 ) {\phi}_{y}=p(y=1) ϕy=p(y=1)。此时联合似然函数为 L ( ϕ y , ϕ j ∣ y = 0 , ϕ j ∣ y = 1 ) = ∏ i = 1 n p ( x i ∣ y ) L(\phi_y,\phi_{j \mid y=0},\phi_{j \mid y=1})=\prod_{i=1}^{n}{p(x_i \mid y)} L(ϕy,ϕj∣y=0,ϕj∣y=1)=∏i=1np(xi∣y)
各个参数的极大似然估计如下所示:
ϕ i ∣ y = 1 {\phi}_{i \mid y=1} ϕi∣y=1表示的是垃圾邮件中出现某个词的频率(垃圾邮件中出现某个词的邮件数/垃圾邮件数目)
那么计算出所有的参数之后,进行预测时,我们只需要简单的计算下图这个式子,然后找出使得后验概率较高的那个类别。
朴素贝叶斯同样可以应用于连续特征值,只需要我们将连续特征值离散化就可以了。当原始的连续值属性没有通过多元正态分布很好地建模时,离散化特征并使用朴素贝叶斯(而不是 GDA)通常会产生更好的分类器。
有那么一个不怎么常见的单词“nips”,它从在你的训练集中出现过(也许你的字典或者是你的词汇表有,但是你的训练集里面确实没有),那么这个时候算出来的参数就是下面这个样子:
进而导致计算 p ( y = 1 ∣ x ) p(y=1 \mid x) p(y=1∣x)的时候,会算出来一个0/0的结果,这个时候预测将会无法进行了。
事实上,因为训练集中没见过某个单词,就认为这个单词出现的概率是0。这样本身就是不合理的,因此我们需要拉普拉斯平滑来处理这个问题。
对于一个可能取值为 { 1 , . . . , k } {\{1,...,k\}} {1,...,k}的变量,给定一组样本数据 { z ( 1 ) , . . . , z ( m ) } \{z(1),...,z(m)\} {z(1),...,z(m)},那么这个时候我们对每个值出现的概率 ϕ j = p ( z = i ) \phi_j=p(z=i) ϕj=p(z=i)进行极大似然估计的结果就是:
但是这样会导致如果样本数据中没有对应的结果,那么 ϕ j \phi_j ϕj就等于0,这与我们常规认知不符。因此我们使用拉普拉斯平滑。具体做法就是将 ϕ j \phi_j ϕj的估计方法变一下,变成下面这个式子:
这个方法解决了未出现取值的概率估计为0的问题,同时满足了所有取值的概率加起来等于1的要求。在某些条件下,拉普拉斯平滑给出了 ϕ j \phi_j ϕj的最优估计量【k的取值并不是可能取值的最大值,而是可能取值的数量】。
那么对于朴素贝叶斯分类器,参数的极大似然估计调整为以下式子【 ϕ y \phi_y ϕy没有必要做拉普拉斯平滑,一般它不会是0】:
【个人未解决的疑问:拉普拉斯平滑的依据是什么?为什么它就会是最优估计量?】
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。