机器学习算法实践之贝叶斯算法

本文作为算法实践系列第二篇,将重点讲解朴素贝叶斯算法与贝叶斯算法理论与应用。
1.朴素贝叶斯算法理论
朴素贝叶斯算法是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集合,首先基于特征条件独立假设学习输入/输出的联合概率分布,然后基于此模型,对于给定的输入的X,利用贝叶斯定理求出后验概率最大的输出的Y值,即为输入实例所属的分类。
此处假设输入空间X为n维向量的集合,输出空间为数据分类标记集合Y={c1,c2,c3….,ck},x是定义在X上的随机向量,y是定义在Y上的随机向量,p(x,y)是x和y的联合概率分布,训练数据集T={(x1,y1),(x2,y2),…,(xN,yN)}是由P(x,y)独立同分布产生的。在上述条件下,朴素贝叶斯法通过训练数据集,先学习先验概率分布p(Y=ck),k=1,2….K,之后在学习条件概率分布P(X=x|Y=ck)=P(X(1)=x(1),…,X(n)=x(n)|Y=ck),k=1,2,….,K(注意:此处(n)是指输入空间的第n个特征向量,也可以理解为上标序号)。最后学习得出两者参数值后,在运用贝叶斯定理,对给定的输入实例x=(x(1),x(2),x(3),…x(n))^T的后验概率P(Y=ck)P(X(n)=x(n)|Y=ck)P(X(n-1)=x(n-1)|Y=ck)…P(X(1)=x(1)|Y=ck)计算比较,最终后验概率最大值所在的Y=ck值,即为该输入实例所属分类情况。
其中,对于后验概率最大化即为所属输入实例的分类情况,其含义即为满足了期望风险最小化准则,即以此准则推导出的函数式f(x)=arg max(P(ck|X=x))就是朴素贝叶斯法所采用的原理。此处只是略微提一下原理,请勿和判别模型f(X)决策函数搞混,贝叶斯分类方法与朴素贝叶斯都属于生成模型,由数据驱动学习概率分布得出分类结论,没有决策函数f(x).
2.朴素贝叶斯算法实践步奏
2.1 前置理论——极大似然估计
朴素贝叶斯法中,学习表示通过数据出发估计先验概率P(Y=ck)和条件概率P(X(n)=x(n)|Y=ck),一般通过极大似然估计法估计相应概率。首先,先验概率P(Y=ck)的极大似然估计计算式如下图所示:
图1 先验概率计算式
其中I为指示函数,满足条件值为1否则为0。之后,在设第j个特征向量x(j)可能取值的集合为{a[j,1],a[j,2],a[j,3],……,a[j,S]},条件概率p(X(j)=a[i,j]|Y=cK)的极大似然估计计算式即为:
图2 条件概率计算式
其中j=1,2,…,n;l=1,2,…,s;k=1,2,….,K,式中x(i)(j)是指第i个样本的第j个特征,a[j,l]是指第j个特征可能取第l个值。
*2.2 算法实践步奏

  • 对数据进行预处理
  • 计算数据集中每个特征向量的先验概率和条件概率
  • 对于给定的实例x=(x(1),x(2),x(3),…x(n))^T,计算后验概率P(Y=ck)P(X(n)=x(n)|Y=ck)P(X(n-1)=x(n-1)|Y=ck)…*P(X(1)=x(1)|Y=ck)的值
  • 得到最后根据后验概率大小得到输入实例预测的分类结果。

3.朴素贝叶斯算法实践
具体代码我已上传至Git仓库,详情请点击查看
数据为模拟分类数据,所用python为3.5版本,执行结果如图所示:
图3 代码实践执行结果
4.贝叶斯估计理论
在用朴素贝叶斯算法进行数据分类处理时,可能会遇到所要估计的概率值为0的情况。这种情况是会影响到具体的后验概率计算结果,使得分类产生偏差,鉴于此,使用贝叶斯估计方法就可以避免上述问题。其中,贝叶斯估计执行逻辑与朴素贝叶斯一样,唯一的区别在于先验概率和条件概率计算式不同。
其中,先验概率的贝叶斯估计为:
图3 贝叶斯估计先验概率
条件概率的贝叶斯估计为:
图4 贝叶斯估计条件概率
在上述式子中,λ≥0,等价于在随机变量各个取值的频数上加上一个正数λ>0。当λ=0时为极大似然估计。在常用的数据分类器中,取λ=1称为拉普拉斯平滑(Laplace smoothing)。最终该算法学习过程与朴素贝叶斯学习过程一样,就不在对其代码进行扩展,整个贝叶斯相关的算法基础模型也就到这里结束了。