博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
机器学习之朴素贝叶斯分类
阅读量:5843 次
发布时间:2019-06-18

本文共 2433 字,大约阅读时间需要 8 分钟。

朴素贝叶斯分类

所有贝叶斯分类都是基于贝叶斯定理,朴素贝叶斯分类是贝叶斯分类中运用广泛简单的一种,另外,它还基于特征条件独立假设。

贝叶斯定理

贝叶斯定理是计算条件概率的公式,条件概率即是事件B发生的前提下事件A发生的概率,记作P(A|B),叫做事件B发生的情况下A的条件概率。

公式为:P(B|A)=P(A|B)P(B)P(A)

公式大致推导:

这里写图片描述

如图,有P(A|B)=P(AB)P(B)

同样,也有P(B|A)=P(AB)P(A)

于是,P(A|B)P(B)=P(B|A)P(A)

得到,P(B|A)=P(A|B)P(B)P(A)

另外,根据全概率公式还有P(A)=ni=1P(Bi)P(A|Bi)

所以公式还可以写成:

P(B|A)=P(A|B)P(B)ni=1P(Bi)P(A|Bi)

特征条件独立假设

样本集(X,Y),每个样本x有n维特征,即x=(x1,x2,...,xn),类标记集合y=(y1,y2,...,yn)

此时为求最大的后验概率,根据贝叶斯定理和全概率公式有,

P(yk|x)=P(x|yk)P(yk)kP(yk)P(x|yk)

对于P(x|yk)=P(x1,x2,...,xn|yk),假如xi可取的值个数为Si个,则参数个数为kni=1Si

为降低参数规模,提出特征条件独立假设,它假设了n维特征(x1,x2,...,xn)互相独立,于是

P(x|yk)=P(x1,x2,...,xn|yk)=ni=1P(xi|yk),这时参数个数为ni=1Sik

核心思想

基于特征条件独立假设,对给定的训练样本集来学习输入输出的联合概率分布,得到一个模型,然后给定一个输入x,利用贝叶斯定理求出后验概率最大的输出y。

即对于一个输入x,根据概率角度就是求x属于哪个类别的概率最大,也就是说P(y1|x)P(y2|x)、…P(yk|x)中哪个后验概率最大就属于哪个类。

在特征条件独立假设下,有

P(yk|x)=ni=1P(xi|yk)P(yk)kP(yk)ni=1P(xi|yk)

其中分母对于所有分类yk都是相同的,所以其实就是求分子最大值对应的分类。即ni=1P(xi|yk)P(yk)值最大对应的分类。

期望风险

反应到期望风险上就是:将输入实例分配到后验概率最大的类中就是期望风险最小化。

极大似然估计&贝叶斯估计

对于训练样本,朴素贝叶斯法的学习其实就是估计先验概率和条件概率。极大似然估计是一种参数估计的方法,根据训练样本推算出参数的大概值,因为在极大似然估计的思想看来,某个参数能使样本出现的概率最大,那就把这个参数作为真实值。

由于极大似然估计可能会出现概率值为0的情况,这会影响到后验概率的计算结果,为解决这个问题引入贝叶斯估计,即在计算先验概率时在分子加一个λ,分母加一个λ * 类别数,而计算条件概率时在分子加一个λ,分母加一个λ * Si(其中Sixi可取的值个数)。当λ取1时称为拉普拉斯平滑。而当λ为0时即是极大似然估计。

大概流程

  1. 待分类项x=(x1,x2,...,xn)
  2. 类别集合y=(y1,y2,...,yn)
  3. 分别求P(y1|x)P(y2|x)、…P(yk|x),取最大的值对应的分类yk
  4. 要求3就需要训练样本集(X,Y),再根据样本集完成下面5到7的操作。
  5. 根据极大似然估计或贝叶斯估计计算先验概率和条件概率,即P(xi|yk)P(yk)
  6. 由特征条件独立假设后对应公式ni=1P(xi|yk)P(yk)求得最大值。
  7. 得到最大值对应的分类。

实现代码

from numpy import *dataSet = [[0,0],[0,0],[0,0],[0,0],[1,0],[0,0],[1,0],[0,0],[1,0],[1,0],[1,1],[1,0],[1,1],[1,1],[1,1],[1,1],[1,1],[1,1]]ySet = [0,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1]def train():    dataNum = len(dataSet)    featureNum = len(dataSet[0])    p0Num = ones(featureNum)    p1Num = ones(featureNum)    p0Denom = 2.0    p1Denom = 2.0    p0 = 0    for i in range(dataNum):        if ySet[i] == 1:            p1Num += dataSet[i]            p1Denom += sum(dataSet[i])        else:            p0 += 1            p0Num += dataSet[i]            p0Denom += sum(dataSet[i])    p0Rate = p0 / dataNum    p0Vec = log(p0Num / p0Denom)    p1Vec = log(p1Num / p1Denom)    return p0Rate, p0Vec, p1Vecp0Rate, p0Vec, p1Vec = train()test = [1,0]p1 = sum(test * p1Vec) + log(1.0 - p0Rate)p0 = sum(test * p0Vec) + log(p0Rate)if p1 > p0:    print(1)else:    print(0)

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 进行预定。感谢各位朋友。

=========================

欢迎关注:

这里写图片描述

你可能感兴趣的文章
POJ3438 ZOJ2886 UVALive3822 Look and Say【数列】
查看>>
IE6的height小BUG
查看>>
docker~学习笔记索引
查看>>
MongoDB学习笔记~大叔分享批量添加—批量更新—批量删除
查看>>
说说IUnitOfWork~DbContext对象的创建应该向BLL层公开
查看>>
css09浮动属性
查看>>
软考 2015年下半年卷 错题知识点记录
查看>>
强制卸载kernel
查看>>
js 杂项(一)函数篇
查看>>
pythonGUI-wxpython
查看>>
精妙SQL语句集合
查看>>
最小生成树模板 加 例题分析 (最小生成树类型汇总)
查看>>
web渗透测试中WAF绕过讲解(二)基于HTTP协议绕过
查看>>
【CSON原创】CSS的障眼法:利用border实现图片的翻转
查看>>
oracle:plsql学习总结(oracle database 10g sql 开发指南)
查看>>
〔转〕Word域的应用和详解2_等式和公式域
查看>>
FZU 1502 Letter Deletion
查看>>
javascript写的ajax请求
查看>>
寄存器是什么 有什么作用
查看>>
转载 《Python爬虫学习系列教程》学习笔记
查看>>