[转载] 朴素贝叶斯python实现预测_Python实现朴素贝叶斯分类器的方法详解
参考链接: 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实现朴素贝叶斯分类器的方法详解相关推荐
- 朴素贝叶斯python实现预测_Python实现朴素贝叶斯分类器的方法详解
本文实例讲述了Python实现朴素贝叶斯分类器的方法.分享给大家供大家参考,具体如下: 贝叶斯定理 贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进行修正的定理,在概率论中具有重要地位. 先 ...
- 基于python的贝叶斯分类器_Python实现朴素贝叶斯分类器的方法详解
本文实例讲述了Python实现朴素贝叶斯分类器的方法.分享给大家供大家参考,具体如下: 贝叶斯定理 贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进行修正的定理,在概率论中具有重要地位. 先 ...
- python支持向量机回归_Python中支持向量机SVM的使用方法详解
除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类.因为Python中的sklearn库也集成了SVM算法,本文的运行环境是Pycharm. 一.导 ...
- python求乘积_Python实现求笛卡尔乘积方法详解
这篇文章主要介绍了Python实现求笛卡尔乘积的方法,结合实例形式分析了Python计算笛卡尔乘积的原理与实现技巧,需要的朋友可以参考下 本文实例讲述了Python实现求笛卡尔乘积的方法.分享给大家供 ...
- python dicom 测量_python对DICOM图像的读取方法详解
DICOM介绍 DICOM3.0图像,由医学影像设备产生标准医学影像图像,DICOM被广泛应用于放射医疗,心血管成像以及放射诊疗诊断设备(X射线,CT,核磁共振,超声等),并且在眼科和牙科等其它医学领 ...
- python zipfile教程_Python模块zipfile原理及使用方法详解
zipfile是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率也是比较高的 zipfile里有两个非常重要的class, 分别是ZipFile和Zi ...
- python优先级排序_Python实现优先级队列结构的方法详解
最简单的实现一个队列至少满足2个方法,put和get. 借助最小堆来实现. 这里按"值越大优先级越高"的顺序. #coding=utf-8 from heapq import he ...
- 基于朴素贝叶斯+Python实现垃圾邮件分类和结果分析
基于朴素贝叶斯+Python实现垃圾邮件分类 朴素贝叶斯原理 请参考: 贝叶斯推断及其互联网应用(二):过滤垃圾邮件 Python实现 源代码主干来自: python实现贝叶斯推断--垃圾邮件分类 我 ...
- python基于朴素贝叶斯模型的预测概率和标签信息可视化ROC曲线
python基于朴素贝叶斯模型的预测概率和标签信息可视化ROC曲线 目录 python基于朴素贝叶斯模型的预测概率和标签信息可视化ROC曲线
最新文章
- 索引键的唯一性(2/4):唯一与非唯一聚集索引
- 随机文件处理函数应用
- android中布局全屏,怎么在Android 应用中实现一个全屏与非全屏功能
- MT6580热设计要求
- 序列化 - 实现ISerializable
- c#初学12-12-为什么mian函数必须是static的
- 【ssm】极简的极省力的开发方式——针对简单型EasyUI的增删改查的后台管理
- Spring cloud Gateway(二) 一个Http请求的流程解析
- (转)对SQLSERVER数据库事务日志的疑问
- mysql deadlock 记录_MySQL DeadLock故障排查全过程记录
- Xcode打包踩过的那些坑
- 超级简单:ASP.NET输出缓存
- IBM OmniFind Enterprise Starter Edition
- matlab的电子线路仿真,高频电子线路Matlab仿真实验
- Qt:Label(添加文字、图片、gif动图、网站链接)、添加文件资源、添加LCD显示、添加进度条
- bilibili哔哩哔哩网页版中视频资源下载方法(无需任何工具)
- FUP A17H/A17CH 微量高速冷冻离心机的优劣势
- 鉴频鉴相器(PFD)不同结构讨论
- 机器学习实战教程(三):决策树实战篇
- [Mysql] CROSS JOIN 交叉连接
热门文章
- Visual Studio 2019 C# 断点调试 凯撒密码,单码密码实现
- 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(3)签到题3题
- 【Codeforces	1426	E】Rock, Paper, Scissors,贪心!算反面
- 【PAT甲】1006 Sign In and Sign Out (25分)循环模拟
- UVA1583 - Digit Generator
- JAVA可以赋值分数吗_Java数据类型知多少?
- gram矩阵的性质_第十七课:正交矩阵和GramSchmidt正交化——MIT线性代数课程学习笔记...
- 查看进程启动时间_Linux服务下通过指令查看JVM(非原创侵删)
- dns提供商主机名_DNS域名解析的过程
- 若在一分页存储管理系统中,某作业的页表如表所示。已知页面大小为 1024字节,试将逻辑地址 1011,2148,3000,4000,5012转化为相应的物理地址。