基本原理
贝叶斯分类是基于贝叶斯公式的一种分类方法,它是通过先验知识和似然函数来估计后验概率。其公式如下:P(H | X) = P(X | H)*P(H) / P(X),其中H是假设,在分类中也就是判定的某种类别,X是证据向量,在分类中也就是n维的特征向量值,一般写作X=(x1, x2, ..., xn)。
因此对于一个给定的X,我们可以通过贝叶斯公式针对每种假设Hi,计算后验概率P(Hi | X),并将X归类为P(Hi | X)值最大的假设Hi。因此对于任意一个测试样本X,我们需要计算所有可能的假设Hi在X下的后验概率值。计算P(H | X),我们需要计算三个量:
似然函数P(X | H):在假设H成立的情况下,X出现的概率。X是一个多维向量,为了计算的简便性,我们假定X向量的n个特征之间是相互独立的,这样P((x1, x2, ..., xn) | H) = P(x1 | H) *P(x2 | H) * ... * P(xn | H),极大降低了似然函数的计算复杂度。我们将基于这种假设的贝叶斯分类称作朴素贝叶斯分类。同时,在计算每个特征xi的似然估计时,P(xi | H)很可能出现零,导致计算出来的后验概率值为0,这就是零频问题,解决零频问题的方法有很多,一个经典的方法是拉普拉斯变换。
先验概率P(H):先验概率P(H)是对每种假设分布的先验知识,在没有专家知识的情况下,我们一般采用训练样本来计算先验概率。
先验概率P(X):P(X)是特征向量X分布的先验概率,在没有更多专家知识的情况下,我们可以假设它为1。其实无论P(X)值为多少,都不会影响对最后结果的评判。因为P(X)是计算所有后验概率的共同分母,其值不影响后验概率大小的比较。
文本分类伪代码
void Bayes_classifier()
{
分词(以词为特征);
特征选择(假设选取2000个特征词);
foreach(c in C) { // C为类别的集合
计算P(c); // |S(c)| / |S|
foreach(f in F) { // F为选取的特征的集合
计算P(f | c); // Num(f in S(c)) / Num(f in S),注意零频问题
}
}
foreach(t in T) { // T为测试集
分词;
构造特征向量X;
foreach(c in C) {
计算P(X | c)*P(c);
}
将t归类为P(X|c)*P(c)值最大的类别c;
}
}
效能分析
贝叶斯分类理论上具有最低的分类错误率,但是其实际效果却不一定是最好的。主要是:1、特征属性相互独立性假设导致模型与实际的偏差;2、概率值的错误估计,似然函数和先验概率都是基于有限的训练样本计算而得,跟实际的概率分布存在误差。