朴素贝叶斯原理及python实现
一、贝叶斯算法引入
朴素贝叶斯算法是基于贝叶斯定理和特征条件独立假设的分类法,是一种基于概率分布的分类算法。
贝叶斯分类算法,通俗的来讲,在给定数据集的前提下,对于一个新样本(未分类),在数据集中找到和新样本特征相同的样本,最后根据这些样本算出每个类的概率,概率最高的类即为新样本的类。
哈哈,先用个样例来大体感受下。
这里有大学生恋爱情况的数据集,见下表:
首先要注意的是,贝叶斯算法的特征都是离散值,如果是连续值,得先对连续值进行离散化处理。对于这个数据集,我们有三个特征,即性别、专业和身高,恋爱情况为类别,1代表谈恋爱了,0代表还是single dog。
若我们现在有了一个新样本,特征为(男,计算机技术,高),那怎么用贝叶斯算法来判断这个样本的类呢,首先,我们要在数据集中找出和这个新样本特征相同的样本,即下图的红色部分:
然后,根据恋爱情况所有的类别(即0,1),计算在这些特征下每个类别的概率,概率最高的类即为新样本的类别。
在这里先不进行计算操作,由表可以大体看出,在(男,计算机技术,高)这特征下,恋爱情况为1的概率更大,即新样本的类别为1。
二、贝叶斯算法思想及其原理
通过前文我们知道,贝叶斯算法是依据概率来进行分类的,通过我们直观的感觉,对于特定的样本,哪个类概率大,我们就选谁。
那么这么做是以什么为科学依据?为什么这么做会预测的效果最好?下面,我们先来说说贝叶斯的思想。
假设每个样本用一个n维特征向量X={x1,x2,…,xn}来表示,描述属性为A1、A2、…、An(Ai之间相互独立)。类别属性为C,假设样本*有m个类即C1、C2、…、Cm,如下图所示
给定一个未知类别的样本X,朴素贝叶斯分类将预测X属于具有最高后验概率P(Ci|X)的类,也就是说,将X分配给类Ci,当且仅当:
P(Ci|X)>P(Cj|X),1≤j≤m,i≠j
根据贝叶斯定理有:
由于P(X)对于所有类为常数,只需要最大化P(X|Ci)P(Ci)即可。而:
所以对于某个样本(a1,a2,…,an),它所在类别为:
思想简单易懂,在没有给出精确率召回率等评测标准前,还是无法让人信服,那么接下来,我们给出贝叶斯算法的数学推到。
朴素贝叶斯算法将实例分到后验概率最大的类中,这就等价于期望风险最小化。假设我们研究的是二分类问题,选择0-1损失函数。即:
公式中f(X)是分类决策函数,这时期望风险函数为:
我们知道,要想得到的结果最好,我们要做的就是将期望风险函数降到最低。好了,我们接下来要做的就是细节化风险函数,得出最优解。
我们知道,期望是对联合分布P(X,Y)取的,由此取条件期望为:
接着,对X=x进行逐个极小化,就可使期望最小,由此接着推:
到此,我们就得到了朴素贝叶斯算法的后验概率最大化准则,即:
三、代码实现
#二分类朴素贝克斯分类器训练函数
def trainNB0(trainMatrix,trainCategory): #trainMatrix为输入参数的文档矩阵,trainCategory为class标签
numTrainDocs = len(trainMatrix) #数据集中样本的数量
numWords = len(trainMatrix[0]) #数据集中特征的数量
pAbusive = sum(trainCategory) / float(numTrainDocs) #计算class为1的概率
#初始化概率
p0Num = zeros(numWords) #初始化class为0的特征
p1Num = zeros(numWords) #初始化class为1的特征
p0Denmo = 0.0
p1Denmo = 0.0
for i in range(numTrainDocs):
if trainCategory[i] == 1:
p1Num += trainMatrix[i]
p1Denmo += sum(trainMatrix[i])
else:
p0Num += trainMatrix[i]
p0Denmo += sum(trainMatrix[i])
p1Vect = p1Num/p1Denmo
p0Vect = p0Num/p0Denmo
return p0Vect,p1Vect,pAbusive
#构建朴素贝叶斯分类函数
def classifyNB(vec2Classify,p0Vec,p1Vec,PClass1):
p1 = sum(vec2Classify * p1Vec) + log(PClass1)
p0 = sum(vec2Classify * p0Vec) + log(1.0 - PClass1)
if p1 > p0 :
return 1
else:
return 0
上一篇: 抓娃学习笔记(2)