参考链接: Python朴素贝叶斯分类器

本文实例讲述了Python实现朴素贝叶斯分类器的方法。分享给大家供大家参考,具体如下:

贝叶斯定理

贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进行修正的定理,在概率论中具有重要地位。

先验概率分布(边缘概率)是指基于主观判断而非样本分布的概率分布,后验概率(条件概率)是根据样本分布和未知参数的先验概率分布求得的条件概率分布。

贝叶斯公式:

P(A∩B) = P(A)*P(B|A) = P(B)*P(A|B)

变形得:

P(A|B)=P(B|A)*P(A)/P(B)

其中

P(A)是A的先验概率或边缘概率,称作"先验"是因为它不考虑B因素。

P(A|B)是已知B发生后A的条件概率,也称作A的后验概率。

P(B|A)是已知A发生后B的条件概率,也称作B的后验概率,这里称作似然度。

P(B)是B的先验概率或边缘概率,这里称作标准化常量。

P(B|A)/P(B)称作标准似然度。

朴素贝叶斯分类(Naive Bayes)

朴素贝叶斯分类器在估计类条件概率时假设属性之间条件独立。

首先定义

x = {a1,a2,...}为一个样本向量,a为一个特征属性

div = {d1 = [l1,u1],...} 特征属性的一个划分

class = {y1,y2,...}样本所属的类别

算法流程:

(1) 通过样本集中类别的分布,对每个类别计算先验概率p(y[i])

(2) 计算每个类别下每个特征属性划分的频率p(a[j] in d[k] | y[i])

(3) 计算每个样本的p(x|y[i])

p(x|y[i]) = p(a[1] in d | y[i]) * p(a[2] in d | y[i]) * ...

样本的所有特征属性已知,所以特征属性所属的区间d已知。

可以通过(2)确定p(a[k] in d | y[i])的值,从而求得p(x|y[i])。

(4) 由贝叶斯定理得:

p(y[i]|x) = ( p(x|y[i]) * p(y[i]) ) / p(x)

因为分母相同,只需计算分子。

p(y[i]|x)是观测样本属于分类y[i]的概率,找出最大概率对应的分类作为分类结果。

示例:

导入数据集

{a1 = 0, a2 = 0, C = 0} {a1 = 0, a2 = 0, C = 1}

{a1 = 0, a2 = 0, C = 0} {a1 = 0, a2 = 0, C = 1}

{a1 = 0, a2 = 0, C = 0} {a1 = 0, a2 = 0, C = 1}

{a1 = 1, a2 = 0, C = 0} {a1 = 0, a2 = 0, C = 1}

{a1 = 1, a2 = 0, C = 0} {a1 = 0, a2 = 0, C = 1}

{a1 = 1, a2 = 0, C = 0} {a1 = 1, a2 = 0, C = 1}

{a1 = 1, a2 = 1, C = 0} {a1 = 1, a2 = 0, C = 1}

{a1 = 1, a2 = 1, C = 0} {a1 = 1, a2 = 1, C = 1}

{a1 = 1, a2 = 1, C = 0} {a1 = 1, a2 = 1, C = 1}

{a1 = 1, a2 = 1, C = 0} {a1 = 1, a2 = 1, C = 1}

计算类别的先验概率

P(C = 0) = 0.5

P(C = 1) = 0.5

计算每个特征属性条件概率:

P(a1 = 0 | C = 0) = 0.3

P(a1 = 1 | C = 0) = 0.7

P(a2 = 0 | C = 0) = 0.4

P(a2 = 1 | C = 0) = 0.6

P(a1 = 0 | C = 1) = 0.5

P(a1 = 1 | C = 1) = 0.5

P(a2 = 0 | C = 1) = 0.7

P(a2 = 1 | C = 1) = 0.3

测试样本:

x = { a1 = 1, a2 = 2}

p(x | C = 0) = p(a1 = 1 | C = 0) * p( 2 = 2 | C = 0) = 0.3 * 0.6 = 0.18

p(x | C = 1) = p(a1 = 1 | C = 1) * p (a2 = 2 | C = 1) = 0.5 * 0.3 = 0.15

计算P(C | x) * p(x):

P(C = 0) * p(x | C = 1) = 0.5 * 0.18 = 0.09

P(C = 1) * p(x | C = 2) = 0.5 * 0.15 = 0.075

所以认为测试样本属于类型C1

Python实现

朴素贝叶斯分类器的训练过程为计算(1),(2)中的概率表,应用过程为计算(3),(4)并寻找最大值。

还是使用原来的接口进行类封装:

from numpy import *

class NaiveBayesClassifier(object):

def __init__(self):

self.dataMat = list()

self.labelMat = list()

self.pLabel1 = 0

self.p0Vec = list()

self.p1Vec = list()

def loadDataSet(self,filename):

fr = open(filename)

for line in fr.readlines():

lineArr = line.strip().split()

dataLine = list()

for i in lineArr:

dataLine.append(float(i))

label = dataLine.pop() # pop the last column referring to label

self.dataMat.append(dataLine)

self.labelMat.append(int(label))

def train(self):

dataNum = len(self.dataMat)

featureNum = len(self.dataMat[0])

self.pLabel1 = sum(self.labelMat)/float(dataNum)

p0Num = zeros(featureNum)

p1Num = zeros(featureNum)

p0Denom = 1.0

p1Denom = 1.0

for i in range(dataNum):

if self.labelMat[i] == 1:

p1Num += self.dataMat[i]

p1Denom += sum(self.dataMat[i])

else:

p0Num += self.dataMat[i]

p0Denom += sum(self.dataMat[i])

self.p0Vec = p0Num/p0Denom

self.p1Vec = p1Num/p1Denom

def classify(self, data):

p1 = reduce(lambda x, y: x * y, data * self.p1Vec) * self.pLabel1

p0 = reduce(lambda x, y: x * y, data * self.p0Vec) * (1.0 - self.pLabel1)

if p1 > p0:

return 1

else:

return 0

def test(self):

self.loadDataSet('testNB.txt')

self.train()

print(self.classify([1, 2]))

if __name__ == '__main__':

NB = NaiveBayesClassifier()

NB.test()

Matlab

Matlab的标准工具箱提供了对朴素贝叶斯分类器的支持:

trainData = [0 1; -1 0; 2 2; 3 3; -2 -1;-4.5 -4; 2 -1; -1 -3];

group = [1 1 -1 -1 1 1 -1 -1]';

model = fitcnb(trainData, group)

testData = [5 2;3 1;-4 -3];

predict(model, testData)

fitcnb用来训练模型,predict用来预测。

希望本文所述对大家Python程序设计有所帮助。

[转载] 朴素贝叶斯python实现预测_Python实现朴素贝叶斯分类器的方法详解相关推荐

  1. 朴素贝叶斯python实现预测_Python实现朴素贝叶斯分类器的方法详解

    本文实例讲述了Python实现朴素贝叶斯分类器的方法.分享给大家供大家参考,具体如下: 贝叶斯定理 贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进行修正的定理,在概率论中具有重要地位. 先 ...

  2. 基于python的贝叶斯分类器_Python实现朴素贝叶斯分类器的方法详解

    本文实例讲述了Python实现朴素贝叶斯分类器的方法.分享给大家供大家参考,具体如下: 贝叶斯定理 贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进行修正的定理,在概率论中具有重要地位. 先 ...

  3. python支持向量机回归_Python中支持向量机SVM的使用方法详解

    除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类.因为Python中的sklearn库也集成了SVM算法,本文的运行环境是Pycharm. 一.导 ...

  4. python求乘积_Python实现求笛卡尔乘积方法详解

    这篇文章主要介绍了Python实现求笛卡尔乘积的方法,结合实例形式分析了Python计算笛卡尔乘积的原理与实现技巧,需要的朋友可以参考下 本文实例讲述了Python实现求笛卡尔乘积的方法.分享给大家供 ...

  5. python dicom 测量_python对DICOM图像的读取方法详解

    DICOM介绍 DICOM3.0图像,由医学影像设备产生标准医学影像图像,DICOM被广泛应用于放射医疗,心血管成像以及放射诊疗诊断设备(X射线,CT,核磁共振,超声等),并且在眼科和牙科等其它医学领 ...

  6. python zipfile教程_Python模块zipfile原理及使用方法详解

    zipfile是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率也是比较高的 zipfile里有两个非常重要的class, 分别是ZipFile和Zi ...

  7. python优先级排序_Python实现优先级队列结构的方法详解

    最简单的实现一个队列至少满足2个方法,put和get. 借助最小堆来实现. 这里按"值越大优先级越高"的顺序. #coding=utf-8 from heapq import he ...

  8. 基于朴素贝叶斯+Python实现垃圾邮件分类和结果分析

    基于朴素贝叶斯+Python实现垃圾邮件分类 朴素贝叶斯原理 请参考: 贝叶斯推断及其互联网应用(二):过滤垃圾邮件 Python实现 源代码主干来自: python实现贝叶斯推断--垃圾邮件分类 我 ...

  9. python基于朴素贝叶斯模型的预测概率和标签信息可视化ROC曲线

    python基于朴素贝叶斯模型的预测概率和标签信息可视化ROC曲线 目录 python基于朴素贝叶斯模型的预测概率和标签信息可视化ROC曲线

最新文章

  1. 索引键的唯一性(2/4):唯一与非唯一聚集索引
  2. 随机文件处理函数应用
  3. android中布局全屏,怎么在Android 应用中实现一个全屏与非全屏功能
  4. MT6580热设计要求
  5. 序列化 - 实现ISerializable
  6. c#初学12-12-为什么mian函数必须是static的
  7. 【ssm】极简的极省力的开发方式——针对简单型EasyUI的增删改查的后台管理
  8. Spring cloud Gateway(二) 一个Http请求的流程解析
  9. (转)对SQLSERVER数据库事务日志的疑问
  10. mysql deadlock 记录_MySQL DeadLock故障排查全过程记录
  11. Xcode打包踩过的那些坑
  12. 超级简单:ASP.NET输出缓存
  13. IBM OmniFind Enterprise Starter Edition
  14. matlab的电子线路仿真,高频电子线路Matlab仿真实验
  15. Qt:Label(添加文字、图片、gif动图、网站链接)、添加文件资源、添加LCD显示、添加进度条
  16. bilibili哔哩哔哩网页版中视频资源下载方法(无需任何工具)
  17. FUP A17H/A17CH 微量高速冷冻离心机的优劣势
  18. 鉴频鉴相器(PFD)不同结构讨论
  19. 机器学习实战教程(三):决策树实战篇
  20. [Mysql] CROSS JOIN 交叉连接

热门文章

  1. Visual Studio 2019 C# 断点调试 凯撒密码,单码密码实现
  2. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(3)签到题3题
  3. 【Codeforces 1426 E】Rock, Paper, Scissors,贪心!算反面
  4. 【PAT甲】1006 Sign In and Sign Out (25分)循环模拟
  5. UVA1583 - Digit Generator
  6. JAVA可以赋值分数吗_Java数据类型知多少?
  7. gram矩阵的性质_第十七课:正交矩阵和GramSchmidt正交化——MIT线性代数课程学习笔记...
  8. 查看进程启动时间_Linux服务下通过指令查看JVM(非原创侵删)
  9. dns提供商主机名_DNS域名解析的过程
  10. 若在一分页存储管理系统中,某作业的页表如表所示。已知页面大小为 1024字节,试将逻辑地址 1011,2148,3000,4000,5012转化为相应的物理地址。