机器学习--朴素贝叶斯算法

贝叶斯定理

 贝叶斯定理:表达了一个事件发生的概率,而确定这一概率的方法是基于与该事件相关的条件先验知识。条件概率是指在事件B发生的情况下,事件A发生的概率。通常记为 P(A|B)
      P(A|B) = P ( A ) ∗ P ( B ∣ A ) P ( B ) \displaystyle\frac{P(A) * P(B|A) }{P(B)} P(B)P(A)P(BA)


p(A):称为 “先验概率”,即事件B发生之前,对A事件概率的一个判断。
P(A|B):已知B发生后A的条件概率,也由于得自B的取值而被称作A的 “后验概率”
P(B|A):已知A发生后B的条件概率,也由于得自A的取值而被称作B的 “后验概率”
P(B):是B的 “先验概率”,也称作 “标准化常量”"

贝叶斯定理可表述为:
  后验概率 = (相似度 * 先验概率) / 标准化常量


另外,比例P(B|A)/P(B)也有时被称为标准相似度,贝叶斯定理也可表述为:

  后验概率 = 标准相似度 * 先验概率



朴素贝叶斯

   基于贝叶斯定理来估计后验概率P(A|B) 的主要困难在于:类条件概率P(B|A) 是所有属性上的联合概率,难以从有限的训练样本直接估计而得。
   为避开这个障碍,朴素贝叶斯分类器采用 了 “属性条件独立性假设”:对已知类别,假设所有属性相对独立。换言之,假设每个属性独立对分类结果发生影响。
   基于条件属性独立假设:
         P ( c ∣ x ) = P ( c ) P ( x ∣ c ) P ( x ) = P ( x ) P ( c ) ∏ i = 1 d P ( x i ∣ c ) P(c|x) = \displaystyle\frac{P(c)P(x|c)}{P(x)} = \frac{P(x)}{P(c)}\prod_{i=1}^dP(x_i|c) P(cx)=P(x)P(c)P(xc)=P(c)P(x)i=1dP(xic)

d: 属性数目
xi:x在第i个属性上的取值


  对所有类别来说P(x)相同,因此基于以上贝叶斯判定准则有朴素贝叶斯分类器表达式
         h n b ( x ) = a r g max ⁡ ⁡ c ∈ y P ( c ) ∏ i = 1 d P ( x i ∣ c ) h_{nb}(x) = \displaystyle{\underset {c \in y}{\operatorname{arg\max}}}P(c)\prod_{i=1}^{d}P(x_i|c) hnb(x)=cyargmaxP(c)i=1dP(xic)

  朴素贝叶斯分类器训练过程是基于训练集D来估计类先验概率 P ( c ) P(c) P(c),并为每个属性估计条件概率 P ( x i ∣ c ) P(x_i|c) P(xic)
  另Dc表示训练集D中第c类样本组成的集合,若有充足的独立同分布样本,则可容易地估计出类先验概率
         P ( c ) = ∣ D c ∣ ∣ D ∣ P(c) = \displaystyle\frac{|D_c|}{|D|} P(c)=DDc


   对离散属性而言,令 D c D_c Dc, x i x_i xi表示 D c D_c Dc中的第i个属性上取值为 x i x_i xi的样本组成的集合,则条件概率 P ( x i ∣ c ) P(x_i|c) P(xic)可估计为
         P ( x i ∣ c ) = ∣ D c , x i ∣ ∣ D c ∣ P(x_i|c) = \displaystyle\frac{|D_c,x_i|}{|D_c|} P(xic)=DcDc,xi


  对连续属性可考虑概率密度函数,假定 P ( x i ∣ c ) ∼ N ( μ c , i , σ c , i 2 ) P(x_i|c)\sim N(\mu_{c,i},\sigma_{c,i}^2) P(xic)N(μc,i,σc,i2),其中 μ c , i 和 \mu_{c,i}和 μc,i σ c , i 2 \sigma_{c,i}^2 σc,i2分别为第c类样本在第i个属性上取值的均值和方差,则有:
         P ( x i ∣ c ) = 1 2 π σ c , i exp ⁡ ( − ( x i − μ c , i ) 2 2 σ c , i 2 ) P(x_i|c) = \displaystyle\frac{1}{\sqrt{2\pi\sigma_{c,i}}}\exp{(-\frac{(x_i-\mu_{c,i})^2}{2\sigma_{c,i}^2})} P(xic)=2πσc,i 1exp(2σc,i2(xiμc,i)2)



  为了避免其他属性携带的信息被训练集中未出现的属性值“抹去”,在估计概率值时通常要进行“平滑”,常用“拉普拉斯修正”。

  另N表示训练集D中可能的类别数,Ni表示第i个属性可能的取值数
         P ( c ) = ∣ D c ∣ + 1 ∣ D ∣ + N P(c) = \displaystyle\frac{|D_c|+1}{|D|+N} P(c)=D+NDc+1

         P ( x i ∣ c ) = ∣ D c , x i ∣ + 1 ∣ D c ∣ + N i P(x_i|c) = \displaystyle\frac{|D_c,x_i|+1}{|D_c|+N_i} P(xic)=Dc+NiDc,xi+1



朴素贝叶斯工作流程图

Created with Raphaël 2.2.0 1.数据预处理,获取训练样本 2.估计每个类别出现的概率 3.估计每个类别条件下每个属性 值出现的概率出现的概率 4.对每个属性组合计算 所属每个类别的概率 5.选择最大概率值作为该条 数据的推测结果输出

核心代码

以下代码是属于二分类的分类代码,如果有多分类可以根据需求修改

def trainNB0(trainMatrix, trainCategory):
	numTrainDocs = len(trainMatrix);#输入文档矩阵数目
	numWords = len(trainMatrix[0]);#计算输入每篇文档词条数
	pAbusive = sum(trainCategory) / float(numTrainDocs); #文档属于P1类的概率
	p0Num = np.zeros(numWords); p1Num = np.zeros(numWords); #创建一个以0填满的数组
	p0Denom = 0.0; p1Denom = 0.0;  #分母初始化为0
	for i in range(numTrainDocs):
		if trainCategory[i] == 1:  #统计属于类型1的的条件概率需要的数据,即p(w0|1), p(w1|1)
			p1Num += trainMatrix[i]
			p1Denom += sum(trainMatrix[i])
		else:#统计属于类型0的的条件概率需要的数据,即p(w0|0), p(w1|0)
			p0Num += trainMatrix[i]
			p0Denom += sum(trainMatrix[i])
	p1Vect = p1Num/p1Denom
	p0Vect = p0Num/p0Denom
	return p0Vect, p1Vect, pAbusive #返回属性1的条件概率数组,属于属性0的条件概率数组,文档概率

代码分析:
1.输入两个参数:训练文档矩阵,训练类别标签
2.计算每个文档中的文档数目
3.首先计算出文档属于属性1的概率,即p(1)
4.计算p(wi|c1)和p(wi|c0),需要初始化程序中的分子和分母变量
5.根据文档中词条出现类型,分类将数据累加,得到总词数
6.返回类型1,类型0总词条数以及类型1的概率



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 

代码分析:
1.使用函数trainNB0返回的三个概率,以及要分类的vec2Classify传入函数
2.用numpy的数组计算两个向量相乘的结果,再将词汇表中的所有词对应值相加,加到对应类别的概率上
3.返回比较类别概率大的对应标签



朴素贝叶斯算法

优点: 在数据少的情况下仍然有效,可以处理多类别问题
缺点: 对于输入数据的准备方式较为敏感
适用数据类型: 标称型数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值