「伯努利分布+朴素贝叶斯」分类器
在神经网络技术还不成熟的时候,朴素贝叶斯分类器(NBC)是文档分类的利器。即便是在神经网络满地走的今天,朴素贝叶斯模型依然有很大的价值。进行文档分类时,这个模型只需要进行几次简单的循环,就可以给出结果,在一些对结果要求不是特别高、对性能要求很高的场景下,具有很大的价值。
这篇文章以文档分类问题引出,重点将特征的伯努利分布(Bernoulli)带入朴素贝叶斯模型,熟悉贝叶斯统计的流程和计算。
本文的md源码在这里:AnBlog/统计和机器学习
@TOC
可以解决的问题
在进行文档分类之前,需要对文本进行一些处理。对于这个模型来说,最关键的一步是建立一个特征(feature)向量,向量的每个分量(entry)对应文本中可能出现的一个单词,取值,表示存在/不存在。
这样的一个分量用伯努利分布描述,参数为:
在其他问题中,这个分布可能取正态分布,或其他分布,但过程的其他部分大同小异。
建立这样的一个从「单词」到「」的映射,可以通过简单的哈希表实现。一段文本中可能出现各种各样的单词,为了保证完备,一段文本对应的特征可能特别多,可能包含所有的英语单词、中文字符,以及世界上的各种其他语言!一定存在一些更省空间的优化,但这不是这篇文章的重点。
模型的目标由需求决定,通常是个二分类问题,判断邮件是/不是垃圾邮件。这篇文章讨论多类分类问题,目标服从多项的伯努利分布(Multinoulli),参数为
:
解决问题的过程,就是根据现有的数据,估计参数
,从而求目标
未来取某值的概率
。
「朴素」的意思
「朴素」指的是假设对象的特征都相互独立,这当然不是一个完美的假设,所以才「朴素」(naive)。也就是说,对象特征的概率分布函数,是各个特征
的概率分布函数的乘积:
具体要算什么
假设一个多类分类问题,在具有数据集合的时候,看见一些特征
时,目标
应取何值。目标
由概率分布描述:
用这个模型进行预测:
模型的目标是分别表达出。
数据情况和分布假设
假设特征都只能取得两个离散的值
,表示「是否存在」,可以用伯努利分布描述这样的数据:
当然可以取其他的值和分布,取值连续时可以取正态分布,取值为多个离散值时可以是多项伯努利分布。
为了让模型具备更多数据,参数和目标分类
发生依赖,不同的
对应不同的参数
,则要估计的参数
是一个矩阵
:
还未完成的是表达。
可以取离散的多个不同值,
和特征
无关,可以通过多项伯努利分布描述:
参数也需要估计。
写出联合后验分布:
似然 (Likelihood)
接上式似然:
其中,对每个特征:
为不同的分类设置不同的参数以增加模型的复杂度:
最大似然估计 (MLE)
取对数:
部分:
部分:
边界条件:
以上确定了最大似然估计的最优化问题,以下分别求参数值。
目标函数:
计数记号:
参数:
带入边界条件:
也就是说:
参数:
求和:
引入新的计数变量,带入:
算一下:
结果惊人的简单!只要简单地遍历整个样本矩阵,就可以完成训练。
最大似然估计在大多数情况下可以满足需求,以下继续走贝叶斯统计的流程。
先验和后验
以下是锦上添花,如果前面已经看晕了最好先缓缓。
先验 (Priori)
假设先验具有相同形式:
先验也可以是其他形式,为了方便,此处及以下使用与似然相同的形式。
后验 (Posteri)
后验表达式:
参数:
归一化系数:
算一下:
参数:
归一化系数:
Beta函数:
娱乐算一下均值,后面可能要用:
带入函数的性质:
同样算一下共轭的均值(这样是叫共轭吗?):
这样得到的均值也可以作为一个估计值,类似于最大似然估计。
最大后验估计(MAP)
取对数:
先验对数:
目标函数:
参数:
带入边界条件:
参数:
求出来:
设置先验为均匀分布(uninformative),即,获得和最大似然估计相同的结果!
先验的参数是超参数,类似于其他模型的「正则」系数,这些参数是人工指定的,不能通过训练模型获得。如果采用最大后验估计作为「训练」的过程,也只需要遍历整个
矩阵、带入
即可。
预测
带入估计值
有了最大似然估计(MLE)或最大后验估计(MAP)的结果,直接带入概率密度函数,就可以求相对的概率大小。
上式右边不需要得到归一化系数,带入参数估计值,就可以比较取不同值时候的相对大小。概率最大时对应的分类就是模型的输出。
直接带入最大似然估计(MLE)或最大后验估计(MAP)的结果,都可能造成「过拟合」,并不是有超参数的模型就不会过拟合。「过拟合」只是个相对的概念,以下介绍贝叶斯统计的常用手法,在大多数情况下比直接带入某种估计的结果,都能更好地避免过拟合。当然,这样的计算要复杂很多,在大多数情况下,MLE/MAP就可以满足需求。
在参数空间上平滑
预测目标的分布(predictive distribution),像上面一样:
「参数空间」就是由参数张成的空间,微元是它们的概率密度函数加权之后的:
注意到相互独立,这一个空间可以当成两个空间看待:
目标的分布的两个部分分别在这两个空间上做积分:
计算的空间:
计算的空间:
上式过于庞杂,考虑到取值十分有限,可以简化一下,分别计算。
时,是在求均值,刚才算过了:
时,还是在求均值:
简洁地合并以上两种情况:
带入连乘:
这样就完成了所有步骤。最终结果:
这个概率密度函数要比直接带入MLE/MAP复杂得多,求解过程更是千回百转。然而,算法求解过程依然只需要遍历整个样本矩阵,并带入参数。这就是「朴素」的魅力!