朴素贝叶斯分类器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用来预测。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RDD模型

Spark是Berkeley大学AMP(stands for Algorithms, Machines, and People)实验室开发的一个项目。它是一个基于RDD(Resilient Distributed Datasets)模型,能够支持计算MapReduce模式的作业,主要用于迭代计算和…

计算机视觉python入门_计算机视觉应该怎样入门?

自学了一段时间计算机视觉(Computer Vision),下文简称:CV。内容以基本概念为主,形式以看书为主,跟着敲代码为辅。起因:因工作中会涉及到交通物流风险管理、出险理赔材料审查等内容,会涉及到大量人工介入审阅…

java lambda if_使用Java8的Lambda实现Monda -解道Jdon

使用Java8的Lambda实现MonadMonad是函数语言(Cojure或Scala)中的设计模式概念, 那么现在为什么在Java中变得如此重要?因为Java从版本8以后引入了新的Lambda特性,Lambda或闭包是函数语言的特征,它允许你使用代码块作为一个变量&…

ConcurrentHashMap,一个更快的HashMap

ConcurrentHashMap 是 Doug Lea 的 util.concurrent 包的一部分,它提供比 Hashtable 或者 synchronizedMap 更高程度的并发性。而且,对于大多数成功的 get() 操作它会设法避免完全锁定,其结果就是使得并发应用程序有着非常好的吞吐量。这个月…

python算法与程序设计基础(第二版)第八章实训答案_Python算法与程序设计基础(第2版)...

章程序设计与计算思维1.1程序设计与计算机语言1.1.1程序设计1.1.2设计步骤1.1.3程序设计分类1.1.4基本规范1.1.5计算机语言1.2计算机语言与计算思维的关系1.2.1思维与计算思维1.2.2计算思维与计算科学的关系1.2.3计算思维与程序设计语言的关系1.3初识Python语言1.3.1Python语言…

python处理图片隐写分析_Python3简单实现隐写术

下载W3Cschool手机App,0基础随时随地学编程>>戳此了解导语利用Python简单实现图片隐写术。。。或者说是水印技术。。。说实话,真的只是简单实现。。。没什么技术含量。。。可以说是入门级的隐写术/水印技术。。。Lets Go?相关文件密码: 9ffy开发工…

使用Jquery提交Json格式的数据到Asp.net程序的另类做法

一般我们使用Jquery提交数据到Asp.net程序都有两种方法,今天我再介绍一种方法.以下是详细描述: 1)使用Get请求的方式,将参数接在请求Url的后面.例如: http://www.google.com.hk/search?qjquerypost 获取参数的方法:在Asp.net中可以使用Request.QueryString["q"]来获…

python xml添加命名空间_XML的命名空间与python解析方法

在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突,而XML 命名空间提供避免元素命名冲突的方法。XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:x…

详解在Visual Studio中使用git版本系统(转)

http://www.uml.org.cn/pzgl/201206211.asp 转载于:https://www.cnblogs.com/kevin3274/archive/2012/08/29/2662556.html

java派生类_我可以使派生类从Java的基类继承派生成员...

我有看起来像这样的代码:public class A{public void doStuff(){System.out.print("Stuff successfully done");}}public class B extends A{public void doStuff(){System.out.print("Stuff successfully done, but in a different way");}pub…

流程图中的虚线含义_还在为画流程图烦恼,焦躁?介绍一款画图神器,让你爱上画图!...

在团队协作过程中最常见的就是开会、开会最常用的就是图,而图中最常见的就是流程图,时序图,类图等下面介绍一款画图神器:PlantUMLPlantUML是一个开源项目,支持快速绘制:时序图用例图类图活动图组件图状态图…

有限状态自动机java实现_用java开发编译器之:Thompson构造,将正则表达式转换为有限状态自动机...

阅读博客的朋友可以到我的网易云课堂中,通过视频的方式查看代码的调试和执行过程:上一节,我们通过代码,实现了一个有限状态自动机,并将其应用于对整形和浮点数的识别。构造有限状态自动机,并驱动它&#xf…

Zend Server搭建网站备注

1、Zend Server的使用 Zend Server自带php和apache,所以装zendserver的话不需要再安装其他任何东西。(mysql默认没有安装,可以自行设置) 2、工作路径配置: 在Zend\Apache2\conf\httpd.conf中添加 Alias/test "F:/workbench/t…

python的符号函数得到的数字类型_Python笔记——数字类型的几个函数

标准类型内建函数&#xff1a;cmp(obj1, obj2) 比较obj1和obj2&#xff0c;根据比较结果返回整型i:i < 0 if obj1 < obj2i > 0 if obj1 > obj2i 0 if obj1 obj2repr(obj)或obj 返回一个对象的字符串表示str(obj) 返回对象适合可读性好的字符串表示type(obj) 得到…

将SqlServer的数据导出到Excel/csv中的各种方法 .

以下都只是介绍操作的原理&#xff0c;具体要求要在应用中具体分析改变。 如果大家有其他好的方法&#xff0c;请相互告知&#xff0c;共同学习。 1. 此方法常用在form或者Console Application中&#xff0c;使用时须用要添加Reference&#xff0c;具体做法&#xff1a; …