背景

贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础。朴素贝叶斯分类Naive Bayes是贝叶斯分类中最简单,也是常见的一种分类方法,它基于贝叶斯定理和特征条件独立性的假设,通过计算给定特征条件下类别的后验概率来进行分类。

核心算法如下,公式可以通过条件概率推得:

P(BA)=P(AB)P(B)P(A)P(B|A)=\frac{P(A|B)P(B)}{P(A)}

其中,BB为类别,AA为特征。我们的任务是计算在AA特征的条件下,类别BB出现的概率P(BA)P(B|A)。朴素贝叶斯的核心假设是特征条件独立性,即假设给定类别时,每个特征与其他特征是条件独立的。尽管这个假设在现实中往往不成立,但朴素贝叶斯在许多实际问题中表现良好,尤其是在高维数据和大规模数据集上。

朴素贝叶斯

接下来以一个简单情景为例子,对算法进行分析解释。

假设我们有一个简单的二分类问题,数据集包含12个样本,每个样本有4个特征,标记为X1X_1X2X_2X3X_3X4X_4,以及相应的类别标签YY。我们的目标是通过朴素贝叶斯算法来预测新样本的类别。

X1X_1 X2X_2 X3X_3 X4X_4 YY
1 0 0 0 No
0 1 0 1 No
1 1 0 1 Yes
0 1 2 1 Yes
1 0 0 1 No
1 0 0 1 No
1 1 2 0 Yes
0 1 1 1 Yes
1 1 1 1 Yes
0 0 2 1 Yes
1 1 0 0 No
1 1 0 0 No

我们的计算步骤如下:

  1. 数据准备:

    • 特征:X1X_1X2X_2X3X_3X4X_4
    • 类别:Yes和No
  2. 计算先验概率:

    • $ P(Yes) = 1/2$
    • P(No)=1/2P(No) = 1/2
  3. 计算类别条件概率:对于每个特征和每个类别,计算特征值的条件概率,种类太多,我们以其中几个情况为例:

    • P(X1=0Yes)=3/6=1/2P(X_1=0|Yes)=3/6=1/2
    • P(X2=0Yes)=1/6P(X_2=0|Yes)=1/6
    • P(X3=0Yes)=1/6P(X_3=0|Yes)=1/6
    • P(X4=0Yes)=1/6P(X_4=0|Yes)=1/6
  4. 应用贝叶斯定理: 对于一个新样本,如X1=0X_1=0X2=0X_2=0X3=0X_3=0X4=0X_4=0,我们可以计算每个类别的后验概率。

    • 对于类别Yes:

    P(YesX1=0,X2=0,X3=0,X4=0)=P(X1=0,X2=0,X3=0,X4=0Yes)P(Yes)P(X1=0,X2=0,X3=0,X4=0)=12×16×16×16×1213×13×712×13=0.0536\begin{equation} \begin{aligned} P(Yes|X_1=0,X_2=0,X_3=0,X_4=0)&=\frac{P(X_1=0,X_2=0,X_3=0,X_4=0|Yes)\cdot P(Yes)}{P(X_1=0,X_2=0,X_3=0,X_4=0)}\\ &=\frac{\frac{1}{2}\times \frac{1}{6}\times \frac{1}{6}\times \frac{1}{6}\times\frac{1}{2}}{\frac{1}{3}\times\frac{1}{3}\times\frac{7}{12}\times\frac{1}{3}}\\ &=0.0536 \end{aligned} \end{equation}

    • 对于类别No:

    P(NoX1=0,X2=0,X3=0,X4=0)=P(X1=0,X2=0,X3=0,X4=0No)P(No)P(X1=0,X2=0,X3=0,X4=0)=16×12×1×12×1213×13×712×13=0.9643\begin{equation} \begin{aligned} P(No|X_1=0,X_2=0,X_3=0,X_4=0)&=\frac{P(X_1=0,X_2=0,X_3=0,X_4=0|No)\cdot P(No)}{P(X_1=0,X_2=0,X_3=0,X_4=0)}\\ &=\frac{\frac{1}{6}\times \frac{1}{2}\times 1\times \frac{1}{2}\times\frac{1}{2}}{\frac{1}{3}\times\frac{1}{3}\times\frac{7}{12}\times\frac{1}{3}}\\ &=0.9643 \end{aligned} \end{equation}

事实上,由于分母是相同的,在求argmaxargmax时我们并不用计算分母也能得到分类结果。在这种情况下,我们更加倾向于选择NoNo

连续特征

特征值未必是离散的,因此我们还需要考虑特征值为连续值的情况,此时我们通常假设其服从正态分布:

f(x,μ,σ)=12πσ2exp((xμ)22σ2)f(x,\mu,\sigma) = \frac{1}{\sqrt{2\pi\sigma^2}} \cdot \exp\left(-\frac{(x - \mu)^2}{2\sigma^2}\right)

那么条件概率可以表示为:

P(X=xY=y)=f(X=x,μy,σy)P(X=x|Y=y)=f(X=x,\mu_y,\sigma_y)

这样就可以继续计算类别后验概率。

Laplace平滑

在朴素贝叶斯中,当某个特征在训练样本中没有出现过,会导致条件概率为零,进而使整个后验概率为零,从而无法对新样本进行分类。为了避免这种情况,引入了拉普拉斯平滑。

通过在计算条件概率时给所有特征的计数加上一个平滑参数(通常是1),每个特征的计数至少为1。这样可以确保即使某个特征在训练样本中没有出现过,其条件概率仍然不为零。

平滑后,条件概率计算公式如下:

PL(YX)=count(XY)+1count(Y)+numClassesP^L(Y|X)=\frac{count(X|Y)+1}{count(Y)+numClasses}

其中,numClasses为特征种类数,只有添加了numClasses,平滑处理后概率之和才能保持为1。

同样的,分类结果也需要进行拉普拉斯平滑:

PL(Y)=count(Y)+1totalCount+numClassesP^L(Y)=\frac{count(Y)+1}{totalCount+numClasses}

其中,totalCount为样本总数,numClasses为分类结果的种类数。

对数操作

当计算多个概率相乘时,特别是在大规模数据集或多个特征的情况下,概率值通常非常小,会非常接近于零。计算机浮点数表示精度是有限的,连续相乘多个小概率的结果可能会导致数值下溢、丢失精度。

因此,通过取对数转换,将概率相乘转换为对数相加,可以在不改变概率之间相对关系的同时有效避免数值下溢的问题。

如果mm个特征值都为离散值,共有kk个种类,则分类结果y(x)y(\bold x)计算如下:

y(x)=argmax1iklogPL(Yi)+j=1mlogPL(xjYi)y(\bold x)=\mathop{argmax}\limits_{1\le i\le k}\log P^L(Y_i)+\sum_{j=1}^m\log P^L(x_j|Y_i)

如果为连续函数,那么计算如下:

y(x)=argmax1iklogPL(Yi)+PL(Yi)+j=1mlogf(X=xj,μYi,σYi)=argmax1iklogPL(Yi)+PL(Yi)+j=1m12log2πlogσYi(xjμYi)22σYi2\begin{equation} \begin{aligned} y(\bold x)&=\mathop{argmax}\limits_{1\le i\le k}\log P^L(Y_i)+P^L(Y_i)+\sum_{j=1}^m\log f(X=x_j,\mu_{Y_i},\sigma_{Y_i})\\ &=\mathop{argmax}\limits_{1\le i\le k}\log P^L(Y_i)+P^L(Y_i)+\sum_{j=1}^m-\frac{1}{2}\log2\pi-\log \sigma_{Y_i}-\frac{(x_j-\mu_{Y_i})^2}{2\sigma^2_{Y_i}} \end{aligned} \end{equation}

12log2π\frac{1}{2}\log2\pi是常数,在做argmaxargmax操作时可以直接略去,因此分类结果可以表示为:

y(x)=argmax1iklogPL(Yi)+PL(Yi)+j=1mlogσYi(xjμYi)22σYi2y(\bold x)=\mathop{argmax}\limits_{1\le i\le k}\log P^L(Y_i)+P^L(Y_i)+\sum_{j=1}^m-\log \sigma_{Y_i}-\frac{(x_j-\mu_{Y_i})^2}{2\sigma^2_{Y_i}}