假设有 NN 个类别,B={B1,B2,...,BN}B=\{B_1,B_2,...,B_N\},现有样本 AA,通过贝叶斯公式:

P(BiA)=P(Bi)P(ABi)j=1nP(Bj)P(ABj)P(B_i\vert A)=\frac{P(B_i)P(A\vert B_i)}{\sum_{j=1}^nP(B_j)P(A\vert B_j)}

  • P(Bi)P(B_i):类别 BiB_i 发生的概率。
    • 称作先验概率,表达了样本空间中各类样本所占的概率。
    • 根据大数定律,当训练集包含充足的独立同分布样本时,P(Bi)P(B_i) 可通过各类样本出现的频率来进行估计
  • P(ABi)P(A\vert B_i):确定是 BiB_i 类下,样本 AA 出现的概率。称作类条件概率。
  • P(BiA)P(B_i\vert A):在样本 AA 出现下,属于类别 BiB_i 的概率。称作后验概率。

类条件概率通过数据集进行训练,估计参数 θb\theta_b

DiD_i 表示训练集 DD 中第 ii 类样本组成的集合,假设样本是独立同分布,则参数 θb\theta_b 对于数据集的似然是:

P(Diθb)=xDiP(xθb)P(D_i\vert\theta_b)=\prod_{x\in D_i}P(x\vert\theta_b)

θb\theta_b 进行极大似然估计,寻找最大化似然 P(Diθb)P(D_i\vert\theta_b) 的参数值 θb\theta_b'

  • θb\theta_b 的所有可能取值中,找到一个能使数据出现可能性最大的值。

连乘容易出现下溢,可以使用对数计算:

LL(θb)=logP(Diθb)=xDilogP(xθb)LL(\theta_b)=\log P(D_i\vert\theta_b)=\sum_{x\in D_i}\log P(x\vert\theta_b)

θb=argmaxθbLL(θb)\theta_b'=\arg\max_{\theta_b}LL(\theta_b)

朴素贝叶斯分类器

一种基于贝叶斯理论的简单概率分类器。

  • 朴素:输入变量的特征属性间具有独立性

由属性条件独立性:

P(BiA)=P(Bi)P(ABi)j=1nP(Bj)P(ABj)=P(Bi)P(A)i=1dP(A(i)Bi)P(B_i\vert A)=\frac{P(B_i)P(A\vert B_i)}{\sum_{j=1}^nP(B_j)P(A\vert B_j)}=\frac{P(B_i)}{P(A)}\prod_{i=1}^dP(A^{(i)}\vert B_i)

  • dd:样本的属性个数。
  • BiB_i:第 ii 个类别。
  • A(i)A^{(i)}:样本 AA 的第 ii 个属性值。
  • 对于所有类别, P(A)P(A) 都相等。

所以朴素贝叶斯表达式写成:

f(A)=argmaxBiBP(Bi)j=1dP(A(j)Bi)f(A)=\arg\max_{B_i\in B}P(B_i)\prod_{j=1}^dP(A^{(j)}\vert B_i)

朴素贝叶斯的训练过程就是基于训练集 DD 来估计类先验概率 P(Bi)P(B_i),并为每个属性估计条件概率 P(A(j)Bi)P(A^{(j)}\vert B_i)

先验概率:

P(Bi)=DiDP(B_i)=\frac{\vert D_i\vert}{\vert D\vert}{}

离散属性下,设 DBi,A(j)D_{B_i,A^{(j)}} 为第 BiB_i 类,第 jj 个属性值为 A(j)A^{(j)} 构成的集合,则条件概率可估计为:

P(A(j)Bi)=DBi,A(j)DBiP(A^{(j)}\vert B_i)=\frac{\vert D_{B_i,A^{(j)}}\vert}{\vert D_{B_i}\vert}{}

连续属性则考虑概率密度函数。

如果某个属性值在训练集中没有与某个类同时出现过,可能会出现概率值为零,此时需要做一些平滑。

  • 常用拉普拉斯修正:

P^(Bi)=Di+1D+N\hat{P}(B_i)=\frac{\vert D_i\vert+1}{\vert D\vert+N}

P^(A(j)Bi)=DBi,A(j)+1DBi+Nj\hat{P}(A^{(j)}\vert B_i)=\frac{\vert D_{B_i,A^{(j)}}\vert+1}{\vert D_{B_i}\vert+N_j}

  • NN:训练集中可能的类别数;
  • NjN_j:第 jj 个属性可能的取值数。

拉普拉斯修正避免了因训练集样本不充分而导致概率估值为零的问题,并且在训练集变大时,修正过程所引入的先验的影响也会逐渐变得可忽略,使得估值渐趋向于实际概率值。

正态贝叶斯分类器

正态贝叶斯分类器认为每一个分类的所有特征属性(即特征向量)服从多变量正态高斯分布,即:

P(xCk)=1(2π)nkexp(12(xμk)Tk1(xμk))P(x\vert C_k)=\frac{1}{\sqrt{(2\pi)^n\vert\sum_k\vert}}\exp\left(-\frac{1}{2}(x-\mu_k)^T\sum_k^{-1}(x-\mu_k)\right)

  • μk\mu_k 表示第 kk 个分类对应的 nn 维均值向量;
  • k|\sum_k| 表示第 kk 个分类对应的 n×nn×n 的协方差矩阵 k\sum_k 的行列式的值。

正态贝叶斯分类器只能处理特征属性是连续数值的分类问题。但它认为特征属性直接不必独立,比朴素贝叶斯的使用条件宽。

同样,计算最大似然:

y^=argmaxk{1,...,k}P(x1,...,xnCk)\hat{y}=\arg\max_{k\in\{1,...,k\}}P(x1,...,x_n\vert C_k)

化为对数似然函数:

ln(L)=12[ln(k)+(xμk)Tk1(xμk)+nln(2π)](1)ln(L)=-\frac{1}{2}\left[\ln(\vert\sum_k\vert)+(x-\mu_k)^T\sum_k^{-1}(x-\mu_k)+n\ln(2\pi)\right]\tag{1}

求式上极大值问题可以转换为求式中方括号内的极小值问题。

均值向量 μk\mu_k 的第 ii 个特征属性 μki\mu_{ki} 的极大似然估计为:

μ^ki=j=1Nkxki(j)Nk\hat{\mu}_{ki}=\frac{\sum_{j=1}^{N_k}x_{ki}^{(j)}}{N_k}

  • xki(j)x_{ki}^{(j)}:训练样本中属于分类 kk 的第 jj 个样本的第 ii 个特征属性的值。
  • NkN_k:训练样本中属于分类 kk 的样本数。

μk^=(μ^k1,...,μ^kn)T(2)\hat{\mu_k}=(\hat{\mu}_{k1}, ..., \hat{\mu}_{kn})^T\tag{2}

n×nn×n 的协方差矩阵 k\sum_k 的无偏估计形式为:

^k=1Nk1[covk(1,1)covk(1,2)...covk(1,n)covk(2,1)covk(2,2)...covk(2,n)covk(n,1)covk(n,2)...covk(n,n)](3)\hat{\sum}_k=\frac{1}{N_k-1}\left[\begin{matrix} cov_k^{(1,1)} & cov_k^{(1,2)} & ... & cov_k^{(1,n)} \\ cov_k^{(2,1)} & cov_k^{(2,2)} & ... & cov_k^{(2,n)} \\ \vdots & \vdots & \ddots & \vdots \\ cov_k^{(n,1)} & cov_k^{(n,2)} & ... & cov_k^{(n,n)} \end{matrix}\right] \tag{3}

其中 covk(p,q)cov_k^{(p,q)} 表示训练样本中第 kk 个分类所组成的数据集合中,第 pp 个特征属性与第 qq 个特征属性的协方差,如果 p=qp=q,那么为方差。

covk(p,q)=j=1Nk[(xkp(j)μ^kp)(xkq(j)μ^kq)]=j=1Nk(xkp(j)xkq(j))μ^kqj=1Nkxkp(j)μ^kpj=1Nkxkq(j)+Nkμ^kpμ^kq\begin{matrix} cov_{k}^{(p,q)}&=&\sum_{j=1}^{N_k}[(x_{kp}^{(j)}-\hat{\mu}_{kp})(x_{kq}^{(j)}-\hat{\mu}_{kq})]\\ &=&\sum_{j=1}^{N_k}(x_{kp}^{(j)}x_{kq}^{(j)})-\hat{\mu}_{kq}\sum_{j=1}^{N_k}x_{kp}^{(j)}-\hat{\mu}_{kp}\sum_{j=1}^{N_k}x_{kq}^{(j)}+N_k\hat{\mu}_{kp}\hat{\mu}_{kq} \end{matrix}

正态贝叶斯分类器的执行步骤:

  1. 由训练样本数据估计每个分类的协方差矩阵(式3)和均值向量(式2);
  2. 把协方差矩阵和均值向量代入到对数似然函数(式1);
  3. 得到每个分类完整的对数似然函数;
  4. 预测样本时,将样本的特征属性分别代入全部分类的对数似然函数中,最大对数似然函数对应的分类就是该样本的分类结果。

基于OpenCV实现正态贝叶斯分类器

OpenCV 自带实现了 正态贝叶斯分类器 的类: NormalBayesClassifier

相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 创建贝叶斯分类器
cv::Ptr<cv::ml::NormalBayesClassifier> model=cv::ml::NormalBayesClassifier::create();

// 设置训练数据
cv::Ptr<cv::ml::TrainData> tData =cv::ml::TrainData::create(datas, ROW_SAMPLE, labels);

//训练分类器
model->train(tData);

//预测
int label = model->predict(samples)

//保存模型
model->save(filename)

例子-糖尿病预测数据集

数据集地址:https://aistudio.baidu.com/datasetdetail/33810

  • 该数据集包含数据集中共包含768个样本,取后100个数据组成测试集。

数据集中每个样本有8种特征。Outcome 是样本的标签(即类别),0表示没有糖尿病,1表示患有糖尿病。

  • Pregnancies: 怀孕次数
  • Glucose:血浆葡萄糖浓度
  • BloodPressure:舒张压
  • SkinThickness:肱三头肌皮肤褶皱厚度
  • Insulin:两小时胰岛素含量
  • BMI:身体质量指数,即体重除以身高的平方
  • DiabetesPedigreeFunction:糖尿病血统指数,即家族遗传指数
  • Age:年龄

使用手搓的朴素贝叶斯分类器和 OpenCV 实现的正态贝叶斯分类器进行训练测试,结果如下:

1
2
3
4
5
6
7
8
9
10
11
Train Data imported: 668
正态贝叶斯分类器:
计算花费时长:0ms
Test Data imported: 100
正确率:0.76

Train Data imported: 668
朴素贝叶斯分类器:
计算花费时长:1ms
Test Data imported: 100
正确率:0.59

代码及数据集地址:Gitee - bayesClassifier

例子-鸢尾花数据集

数据集地址:

部分数据如下:

花萼长度 花萼宽度 花瓣长度 花瓣宽度 类别
6.4 2.8 5.6 2.2 2
5.0 2.3 3.3 1.0 1
4.9 2.5 4.5 1.7 2
4.9 3.1 1.5 0.1 0

使用手搓的朴素贝叶斯分类器和 OpenCV 实现的正态贝叶斯分类器进行训练测试,结果如下:

1
2
3
4
5
6
7
8
9
10
11
Train Data imported: 120
正态贝叶斯分类器:
计算花费时长:0ms
Test Data imported: 30
正确率:0.966667

Train Data imported: 120
朴素贝叶斯分类器:
计算花费时长:0ms
Test Data imported: 30
正确率:0.8

代码及数据集地址:Gitee - bayesClassifier