译文 朴素贝叶斯算法总结

在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数$Y=f(X)$,要么是条件分布$P(Y|X)$。但是朴素贝叶斯却是生成方法,也就是直接找出特征输出Y和特征X的联合分布$P(X,Y)$,然后用$P(Y|X) = P(X,Y)/P(X)$得出。

朴素贝叶斯很直观,计算量也不大,在很多领域有广泛的应用,这里我们就对朴素贝叶斯算法原理做一个小结。

1. 朴素贝叶斯相关的统计学知识

在了解朴素贝叶斯的算法之前,我们需要对相关必须的统计学知识做一个回顾。

贝叶斯学派很古老,但是从诞生到一百年前一直不是主流。主流是频率学派。频率学派的权威皮尔逊和费歇尔都对贝叶斯学派不屑一顾,但是贝叶斯学派硬是凭借在现代特定领域的出色应用表现为自己赢得了半壁江山。

贝叶斯学派的思想可以概括为先验概率+数据=后验概率。也就是说我们在实际问题中需要得到的后验概率,可以通过先验概率和数据一起综合得到。数据大家好理解,被频率学派攻击的是先验概率,一般来说先验概率就是我们对于数据所在领域的历史经验,但是这个经验常常难以量化或者模型化,于是贝叶斯学派大胆的假设先验分布的模型,比如正态分布,beta分布等。这个假设一般没有特定的依据,因此一直被频率学派认为很荒谬。虽然难以从严密的数学逻辑里推出贝叶斯学派的逻辑,但是在很多实际应用中,贝叶斯理论很好用,比如垃圾邮件分类,文本分类。

我们先看看条件独立公式,如果X和Y相互独立,则有:

$$P(X,Y) =P(X)P(Y)$$

我们接着看看条件概率公式:

$$P(Y|X) = P(X,Y)/P(X)$$

$$P(X|Y) = P(X,Y)/P(Y)$$

或者说:

$$ P(Y|X) = P(X|Y)P(Y)/P(X)$$

接着看看全概率公式

$$P(X) = \sum\limits_{k}P(X|Y =Y_k)P(Y_k) 其中\sum\limits_{k}P(Y_k)=1$$

从上面的公式很容易得出贝叶斯公式:

$$P(Y_k|X) = \frac{P(X|Y_k)P(Y_k)}{\sum\limits_{k}P(X|Y =Y_k)P(Y_k)}$$

2. 朴素贝叶斯的模型

从统计学知识回到我们的数据分析。假如我们的分类模型样本是:$$(x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)}, y_1), (x_1^{(2)}, x_2^{(2)}, ...x_n^{(2)},y_2), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_n)$$

即我们有m个样本,每个样本有n个特征,特征输出有K个类别,定义为${C_1,C_2,...,C_K}$。

从样本我们可以学习得到朴素贝叶斯的先验分布$P(Y=C_k)(k=1,2,...K)$,接着学习到条件概率分布$P(X=x|Y=C_k) = P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k)$,然后我们就可以用贝叶斯公式得到X和Y的联合分布P(X,Y)了。联合分布P(X,Y)定义为:

$$ \begin{align} P(X,Y=C_k) &= P(Y=C_k)P(X=x|Y=C_k) \\&= P(Y=C_k)P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k) \end{align}$$

从上面的式子可以看出$ P(Y=C_k)$比较容易通过最大似然法求出,得到的$ P(Y=C_k)$就是类别$C_k$在训练集里面出现的频数。但是$P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k)$很难求出,这是一个超级复杂的有n个维度的条件分布。朴素贝叶斯模型在这里做了一个大胆的假设,即X的n个维度之间相互独立,这样就可以得出:

$$P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k) = P(X_1=x_1|Y=C_k)P(X_2=x_2|Y=C_k)...P(X_n=x_n|Y=C_k)$$

从上式可以看出,这个很难的条件分布大大的简化了,但是这也可能带来预测的不准确性。你会说如果我的特征之间非常不独立怎么办?如果真是非常不独立的话,那就尽量不要使用朴素贝叶斯模型了,考虑使用其他的分类方法比较好。但是一般情况下,样本的特征之间独立这个条件的确是弱成立的,尤其是数据量非常大的时候。虽然我们牺牲了准确性,但是得到的好处是模型的条件分布的计算大大简化了,这就是贝叶斯模型的选择。

最后回到我们要解决的问题,我们的问题是给定测试集的一个新样本特征$(x_1^{(test)}, x_2^{(test)}, ...x_n^{(test)}$,我们如何判断它属于哪个类型?

既然是贝叶斯模型,当然是后验概率最大化来判断分类了。我们只要计算出所有的K个条件概率$P(Y=C_k|X=X^{(test)})$,然后找出最大的条件概率对应的类别,这就是朴素贝叶斯的预测了。

3. 朴素贝叶斯的推断过程

上节我们已经对朴素贝叶斯的模型也预测方法做了一个大概的解释,这里我们对朴素贝叶斯的推断过程做一个完整的诠释过程。

我们预测的类别$C_{result}$是使$P(Y=C_k|X=X^{(test)})$最大化的类别,数学表达式为:

$$ \begin{align} C_{result} & = \underbrace{argmax}_{C_k}P(Y=C_k|X=X^{(test)}) \\& = \underbrace{argmax}_{C_k}P(X=X^{(test)}|Y=C_k)P(Y=C_k) \Bigg{/}P(X=X^{(test)}) \end{align}$$

由于对于所有的类别计算$P(Y=C_k|X=X^{(test)})$时,上式的分母是一样的,都是$P(X=X^{(test)}$,因此,我们的预测公式可以简化为:

$$ C_{result} = \underbrace{argmax}_{C_k}P(X=X^{(test)}|Y=C_k)P(Y=C_k) $$

接着我们利用朴素贝叶斯的独立性假设,就可以得到通常意义上的朴素贝叶斯推断公式:

$$ C_{result} = \underbrace{argmax}_{C_k}P(Y=C_k)\prod_{j=1}^{n}P(X_j=X_j^{(test)}|Y=C_k) $$

4. 朴素贝叶斯的参数估计

在上一节中,我们知道只要求出$P(Y=C_k)和P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n)$,我们通过比较就可以得到朴素贝叶斯的推断结果。这一节我们就讨论怎么通过训练集计算这两个概率。

对于$P(Y=C_k)$,比较简单,通过极大似然估计我们很容易得到$P(Y=C_k)$为样本类别$C_k$出现的频率,即样本类别$C_k$出现的次数$m_k$除以样本总数m。

对于$P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n)$,这个取决于我们的先验条件:

a) 如果我们的$X_j$是离散的值,那么我们可以假设$X_j$符合多项式分布,这样得到$P(X_j=X_j^{(test)}|Y=C_k)$ 是在样本类别$C_k$中,$X_j^{(test)}$出现的频率。即:

$$P(X_j=X_j^{(test)}|Y=C_k) = \frac{m_{kj^{test}}}{m_k}$$

其中$m_k$为样本类别$C_k$出现的次数,而$m_{kj^{test}}$为类别为$C_k$的样本中,第j维特征$X_j^{(test)}$出现的次数。

某些时候,可能某些类别在样本中没有出现,这样可能导致$P(X_j=X_j^{(test)}|Y=C_k)$为0,这样会影响后验的估计,为了解决这种情况,我们引入了拉普拉斯平滑,即此时有:

$$P(X_j=X_j^{(test)}|Y=C_k) = \frac{m_{kj^{test}} + \lambda}{m_k + n\lambda}$$

其中$\lambda$ 为一个大于0的常数,常常取为1。

b)如果我们我们的$X_j$是非常稀疏的离散值,即各个特征出现概率很低,这时我们可以假设$X_j$符合伯努利分布,即特征$X_j$出现记为1,不出现记为0。即只要$X_j$出现即可,我们不关注$X_j$的次数。这样得到$P(X_j=X_j^{(test)}|Y=C_k)$ 是在样本类别$C_k$中,$X_j^{(test)}$出现的频率。此时有:

$$P(X_j=X_j^{(test)}|Y=C_k) = P(j|Y=C_k)X_j^{(test)} + (1 - P(j|Y=C_k)(1-X_j^{(test)})$$

其中,$X_j^{(test)}$取值为0和1。

c)如果我们我们的$X_j$是连续值,我们通常取$X_j$的先验概率为正态分布,即在样本类别$C_k$中,$X_j$的值符合正态分布。这样$P(X_j=X_j^{(test)}|Y=C_k)$的概率分布是:

$$P(X_j=X_j^{(test)}|Y=C_k) = \frac{1}{\sqrt{2\pi\sigma_k^2}}exp\Bigg{(}-\frac{(X_j^{(test)} - \mu_k)^2}{2\sigma_k^2}\Bigg{)}$$

其中$\mu_k和\sigma_k^2$是正态分布的期望和方差,可以通过极大似然估计求得。$\mu_k$为在样本类别$C_k$中,所有$X_j$的平均值。$\sigma_k^2$为在样本类别$C_k$中,所有$X_j$的方差。对于一个连续的样本值,带入正态分布的公式,就可以求出概率分布了。

5. 朴素贝叶斯算法过程

我们假设训练集为m个样本n个维度,如下:

$$(x_1^{(0)}, x_2^{(0)}, ...x_n^{(0)}, y_0), (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)},y_1), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_n)$$

共有K个特征输出类别,分别为${C_1,C_2,...,C_K}$,每个特征输出类别的样本个数为${m_1,m_2,...,m_K}$,在第k个类别中,如果是离散特征,则特征$X_j$各个类别取值为$m_{jl}$。其中l取值为$1,2,...S_j$,$S_j$为特征j不同的取值数。

输出为实例$X^{(test)}$的分类。

算法流程如下:

1) 如果没有Y的先验概率,则计算Y的K个先验概率:$P(Y=C_k) = m_k/m$,否则$P(Y=C_k)$为输入的先验概率。

2) 分别计算第k个类别的第j维特征的第l个个取值条件概率:$P(X_j=x_{jl}|Y=C_k)$

a)如果是离散值:

$$P(X_j=x_{jl}|Y=C_k) = \frac{x_{jl} + \lambda}{m_k + n\lambda}$$

$\lambda$可以取值为1,或者其他大于0的数字。

b)如果是稀疏二项离散值:$$P(X_j=x_{jl}|Y=C_k) = P(j|Y=C_k)x_{jl} + (1 - P(j|Y=C_k)(1-x_{jl}) $$

此时$l$只有两种取值。

c)如果是连续值不需要计算各个l的取值概率,直接求正态分布的参数:

$$P(X_j=x_j|Y=C_k) = \frac{1}{\sqrt{2\pi\sigma_k^2}}exp\Bigg{(}-\frac{(x_j - \mu_k)^2}{2\sigma_k^2}\Bigg{)}$$

需要求出$\mu_k和\sigma_k^2$。 $\mu_k$为在样本类别$C_k$中,所有$X_j$的平均值。$\sigma_k^2$为在样本类别$C_k$中,所有$X_j$的方差。

3)对于实例$X^{(test)}$,分别计算:

$$P(Y=C_k)\prod_{j=1}^{n}P(X_j=x_j^{(test)}|Y=C_k) $$

4)确定实例$X^{(test)}$的分类$C_{result}$

$$C_{result} = \underbrace{argmax}_{C_k}P(Y=C_k)\prod_{j=1}^{n}P(X_j=X_j^{(test)}|Y=C_k) $$

从上面的计算可以看出,没有复杂的求导和矩阵运算,因此效率很高。

6. 朴素贝叶斯算法小结

朴素贝叶斯算法的主要原理基本已经做了总结,这里对朴素贝叶斯的优缺点做一个总结。

朴素贝叶斯的主要优点有:

1)朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。

2)对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。

3)对缺失数据不太敏感,算法也比较简单,常用于文本分类。

朴素贝叶斯的主要缺点有:

1) 理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。

2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。

3)由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。

4)对输入数据的表达形式很敏感。

以上就是朴素贝叶斯算法的一个总结,希望可以帮到朋友们。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 忘光了概率统计的知识还想学朴素贝叶斯算法?这一篇就是为你准备的。虽然如此,作为初学者,别指望 5 分钟就能完全理解...
    kamidox阅读 2,554评论 4 7
  • 【博客的主要内容主要是自己的学习笔记,并结合个人的理解,供各位在学习过程中参考,若有疑问,欢迎提出;若有侵权,请告...
    Paullu阅读 2,146评论 0 11
  • 一、实验目的 学习使用 weka 中的常用分类器,完成数据分类任务。 二、实验内容 了解 weka 中 explo...
    yigoh阅读 8,195评论 5 4
  • 一年级语文上册生字表 生字表一(共400字) 啊(ā)爱(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang阅读 2,633评论 0 6
  • 你背一捆荆棘下山 带来了万家灯火 你削尖骨头破开岩石 换来的清泉是你的血在流 而如今我眼中的星光点点 是你精确计算...
    扁竹桃仙人阅读 258评论 5 5