贝叶斯分类numpy实现

article/2025/10/15 15:36:33

概述

贝叶斯属于生成模型的一种,其实现很简单,就是应用贝叶斯公式。这是一种指定先验分布,求后验的方法。
概率论课本里著名的贝叶斯公式如下
在这里插入图片描述
p(ci)是i类在数据集的占比,(数一下就可,易)
p(x|ci)是从数据集所有的标记为i的数据中,抽出x的概率(核心)
p(ci|x)即x属于ci的概率
通过argmax(p(ci|x))就可分类了。
所以只要解决p(x|ci)的计算,就ok了。我们假定p(x|ci)是服从多元高斯分布的。如下。其中D为feature数,Σ是(nfeature*nfeature)的协方差矩阵,μ是(nfeature)均值。当然也可以取别的分布。
在这里插入图片描述
在这里插入图片描述
高斯分布的密度图如上所示,μ决定中心位置,Σ的对角线元素就是维度上的方差,决定了上面椭圆状密度图的长轴短轴比,Σ其余元素是协方差,决定椭圆状密度图的倾斜。
为得到每个类的Σ,μ,可以用极大似然估计来做。已经证明了估计结果就是data的mean 和 cov。故至此,我们就可算出数据集每一类的p(x|ci)函数,p(ci|x)自然也就得到了。
预测新点很简单,只需要计算对每个类的p(ci|x),最大的就是其归类。

实现

关于测试数据

使用sklearn的鸢尾花数据集
https://www.cnblogs.com/meelo/p/4272036.html
鸢尾花数据集背景:鸢尾花数据集是原则20世纪30年代的经典数据集。它是用统计进行分类的鼻祖。样本数目150,特征数目4,分别是花萼长度(cm)、花萼宽度(cm)、花瓣长度(cm)、花瓣宽度(cm)。类数为3,是花的名字,每类正好50样本。对前三维可视化如下,可见还是很好分的
在这里插入图片描述

code

代码如下,采用120训练集,30测试集

import numpy as np
from sklearn import datasets
iris = datasets.load_iris()
from sklearn.naive_bayes import GaussianNB
data=iris.data.copy()
target=iris.target.copy().reshape(-1,1)
np.random.seed(1)#!!!seed值的有效次数仅为一次
np.random.shuffle(data) 
np.random.seed(1)
np.random.shuffle(target)train_x=data[0:120]#120*4
test_x=data[120:150]#30*4
train_tar=target[0:120].reshape(-1,1)#(120, 1)
test_tar=target[120:150].reshape(-1,1)#(30 ,1)
print(train_x[0])class Native_Bayes:def __init__(self):#这几个变量由fit函数写,predict函数取用self.P_x_c_fun=Noneself.c_num=Noneself.P_c=Nonedef fit(self,train_x,train_tar):#计算P(c)n=len(train_x)c_num=len(np.unique(train_tar))#分类数self.c_num=c_numP_c=[sum(train_tar==i)/n for i in range(c_num)]P_c=np.array(P_c).reshape(1,-1)#1*c_numself.P_c=P_c#计算P(x|c)P_x_c_fun=[]#计算分布参数,给出概率计算函数for i in range(c_num):data=train_x[(train_tar==i).flatten()]mu=data.mean(axis=0)#(nfeature,)sigma=np.cov(data.T)#(nfeature,nfeature)sigma_det=(np.linalg.det(sigma))sigma_inv=(np.linalg.inv(sigma))temp=(1/(((2*np.pi)**(c_num/2))*(sigma_det**0.5)))#小心闭包错误def g(mu,sigma,sigma_det,sigma_inv,temp):def fun(x):nonlocal temp,mu,sigma_invx=x.reshape(1,-1)res=float(temp*(np.exp(-0.5*(x-mu).dot(sigma_inv).dot((x-mu).T))))return resreturn funP_x_c_fun.append(g(mu,sigma,sigma_det,sigma_inv,temp))self.P_x_c_fun=P_x_c_funP_x_c=np.empty((n,c_num))for i in range(n):for j in range(c_num):P_x_c[i,j]=P_x_c_fun[j](train_x[i])#计算p(c|x)PP=P_x_c*P_cPP=PP/PP.sum(axis=1,keepdims=True)#注意keepdims,不然无法自动扩展c_head=np.argmax(PP,axis=1)return c_headdef predict(self,test_x):n=len(test_x)P_x_c_fun=self.P_x_c_funP_x_c=np.empty((n,self.c_num))for i in range(n):for j in range(self.c_num):P_x_c[i,j]=P_x_c_fun[j](test_x[i])PP=P_x_c*self.P_cPP=PP/PP.sum(axis=1,keepdims=True)c_head=np.argmax(PP,axis=1)return c_head
model=Native_Bayes()
res=model.fit(train_x,train_tar)
print('训练集正确率:{}/120'.format(np.sum(res==train_tar.flatten())))
res=model.predict(test_x)
print('测试集正确率:{}/30'.format(np.sum(res==test_tar.flatten())))
#对比工业实现
gnb = GaussianNB()
res=gnb.fit(train_x, train_tar.flatten()).predict(test_x)
np.sum(res==test_tar.flatten())

结果:
训练集正确率:118/120
测试集正确率:28/30

总结

踩坑:
np.random.seed(1)#!!!seed值的有效次数仅为一次
np.cov输入(nfeaturen)->(nfeaturenfeature)的cov矩阵
其他:
通常这种简单生成模型的效果不会好于逻辑回归之类的方法,但当数据集数量很少时,优势就较为明显,故在数据集比较小时可以考虑。同时可以看到生成模型的空间占用和计算速度都很不错。


http://chatgpt.dhexx.cn/article/mSOwQFGh.shtml

相关文章

python编程实现贝叶斯分类

贝叶斯的思想比较简单,网上阐述也很详细,这里就不赘述了。 这里只是简单的说一下编程的思路 首先明确我们要实验的内容,实现贝叶斯分类,那么要想编程实现,你必须对贝叶斯分类有足够的了解。而贝叶斯分类的过程并不难&a…

机器学习-贝叶斯分类实验

机器学习-贝叶斯分类 1. 中文文本分类介绍2. 文本分类的一般步骤:3. 具体操作4. 实验步骤5. 实验完整代码python 1. 中文文本分类介绍 文本挖掘是指从大量的文本数据中抽取事先未知的、可理解的、最终可用的知识的过程,同时运用这些知识更好的组织信息以…

贝叶斯分类——贝叶斯网络

在“贝叶斯分类——朴素贝叶斯算法”中,我介绍了朴素贝叶斯分类的相关知识。其中的核心思想是利用变量之间的“朴素”性质,计算出联合概率密度。这依赖于朴素贝叶斯分类的一个限制条件,就是特征属性必须有条件独立或基本独立。但现实中各个特…

模式识别:最小错误率贝叶斯决策分类

一、引言 1.用贝叶斯决策理论分类要事先知道两个条件及要求: ①.各类的先验概率: 及特征向量的条件概率密度: 或后验概率: ②.决策分类的类别一定 2.解决的问题: 已知一定数目的样本,设计分类器&…

机器学习——朴素贝叶斯分类

一贝叶斯原理 1.1贝叶斯原理产生背景: 贝叶斯原理是英国数学家托马斯贝叶斯提出的,他写的一篇关于归纳推理的论文直接影响了接下来两个多世纪的统计学,是科学史上著名的论文之一。 贝叶斯原理是贝叶斯为了解决一个叫“逆向概率”问题写了一…

贝叶斯分类器做文本分类案例

贝叶斯分类器做文本分类 文本分类是现代机器学习应用中的一大模块,更是自然语言处理的基础之一。我们可以通过将文字数据处理成数字数据,然后使用贝叶斯来帮助我们判断一段话,或者一篇文章中的主题分类,感情倾向,甚至…

贝叶斯分类——朴素贝叶斯算法

在机器学习分类算法中,大多数的分类算法,比如决策树,KNN,SVM等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数 Yf(x) ,要么是条件分布 P(Y|X)。 但是朴素贝叶斯…

朴素贝叶斯分类:原理

贝叶斯原理是英国数学家托马斯贝叶斯提出的。贝叶斯是个很神奇的人,他的经历类似梵高。生前没有得到重视,死后,他写的一篇关于归纳推理的论文被朋友翻了出来,并发表了。这一发表不要紧,结果这篇论文的思想直接影响了接…

贝叶斯多分类原理与python代码

贝叶斯处理多分类问题时,对于不同的数据特征要采用不同的贝叶斯变体。这里主要说下处理“连续型”变量的高斯贝叶斯分类和处理”离散型“变量的多项式贝叶斯分类。 回顾:贝叶斯公式 p(x):对于输入的每个x值是随机的,它们应该有相…

朴素贝叶斯分类的概念(一)

朴素贝叶斯模型是一组非常简单快速的分类算法,通常适用于维度非常高的数据集.速度快,可调参数少.非常适合为分类问题提供快速粗糙的基本方案. 作为一个数学小白,乍一听到朴素贝叶斯这个名词时一般都是晕的,根据多年的初等数学学习经验,贝叶斯应该是一个人,但是"朴素"…

Python3 实现朴素贝叶斯分类

Python3 实现朴素贝叶斯分类 贝叶斯定理朴素贝叶斯源代码样例测试 贝叶斯定理 贝叶斯定理是由已知事件概率和条件概率计算未知条件概率的概率推理算法,其公式如下: 其中,P(Bi|A)是要计算的目标条件概率,表示事件 A 发生的条件下…

浅谈贝叶斯分类

贝叶斯分类 贝叶斯分类是一类分类算法的总称,以贝叶斯定理为基础。其中我们较为熟悉的朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。 贝叶斯网络 贝叶斯网络是一种概念图模型。概率图模型就是用图论和概率论的知识,利…

基于Python实现的图片贝叶斯分类器分类

使用流程及应用展示: 1. 选择图片: 控制台版本从命令行输入 当直接回车时将读取默认路径图片(./assets/生活照-武.jpg),相对路径是从打开程序的文件夹开始的,若输入路径无效或不可读将继续询问输入 GUI 从文件浏览器…

【贝叶斯分类4】贝叶斯网

文章目录 1. 半朴素贝叶斯分类器知识回顾2. 贝叶斯网学习笔记2.1 引言2.2 知识卡片2.3 概率图模型(PGM)2.3.1 引言2.3.2 为什么引入概率图?2.3.3 概率图的三个基本问题(表示,学习,推断) 2.4 贝叶斯网2.4.1 贝叶斯网的表达2.4.2 结…

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

机器学习算法--朴素贝叶斯分类 引入贝叶斯决策论条件概率和全概率公式贝叶斯推断和朴素贝叶斯推断拉普拉斯平滑 代码实例1、言论过滤器2、垃圾邮件过滤器 代做 引入 贝叶斯决策论(Bayesian decision theory)是概率论框架下实施决策的基本方法。对分类任务来说,在所有…

【ML】贝叶斯分类和朴素贝叶斯分类

一、介绍 贝叶斯定理是英国数学家托马斯贝叶斯提出的,为了解决一个“逆概率”问题。 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种…

机器学习之朴素贝叶斯分类

朴素贝叶斯分类 贝叶斯定理和基础概率论朴素贝叶斯高斯朴素贝叶斯,多项式朴素贝叶斯,伯努利朴素贝叶斯的区别几种朴素贝叶斯实战总结 贝叶斯定理和基础概率论 概率,其实在我们生活中十分常见,它是对未来事件发生可能性的表述&…

机器学习--朴素贝叶斯分类函数

一、前言 朴素贝叶斯算法是有监督的学习算法,解决的是分类问题,如客户是否流失、是否值得投资、信用等级评定等多分类问题。该算法的优点在于简单易懂、学习效率高、在某些领域的分类问题中能够与决策树、神经网络相媲美。但由于该算法以自变量之间的独…

机器学习之贝叶斯算法图像分类

数据集:数据集采用Sort_1000pics数据集。数据集包含1000张图片,总共分为10类。分别是人(0),沙滩(1),建筑(2),大卡车(3),恐龙&#xff…

使用 Python 进行朴素贝叶斯分类

定义 在机器学习中,贝叶斯分类器是一种简单的概率分类器,它基于应用贝叶斯定理。朴素贝叶斯分类器使用的特征模型做出了很强的独立性假设。这意味着一个类的特定特征的存在与其他所有特征的存在是独立的或无关的。 独立事件的定义: 两个事件…