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

article/2025/10/15 15:25:27

贝叶斯处理多分类问题时,对于不同的数据特征要采用不同的贝叶斯变体。这里主要说下处理“连续型”变量的高斯贝叶斯分类和处理”离散型“变量的多项式贝叶斯分类。

回顾:贝叶斯公式

在这里插入图片描述

p(x):对于输入的每个x值是随机的,它们应该有相同的概率,所以P(x)不需要求解。
p(yk):表示先验知识,即 yk类别出现的频数/总样本数。
P(x|yk):对于贝叶斯的几种不同变体,主要是假设x在不同分布(高斯、伯努利、多项式分布…)下求P(x|yk)的概率值。
朴素贝叶斯:P(x|yk)在这里认为是相互独立,也就是说,xi,xj相互之间,则P(x|yk) = P(x1|yk)P(x2|yk)…P(xn|yk)。
贝叶斯的几种变体也就是P(x|yk)在不同分布下,求特征概率的方式不同而已。

1.高斯朴素贝叶斯

1.1 高斯概率分布

对于连续型特征,假设它们服从高斯分布,那么可以使用高斯贝叶斯。
高斯公式:
在这里插入图片描述

式中xi表示样本中的第i个特征,μ表示xi列的均值。σ表示xi列的方差。
通过高斯公式就可以得到每个特征出现的概率值。
计算在yk类条件下,特征xi的概率。然后将概率连乘求最大似然估计。

1.2 代码实现

class GaussianNB:def __init__(self):self.prior = Noneself.avgs = Noneself.vars = Noneself.n_class = None# 计算先验概率def _get_prior(self,label: array)->array:cnt = Counter(label)prior = np.array([cnt[i] / len(label) for i in range(len(cnt))])return prior# 计算训练集均值。每个label分别计算均值def _get_avgs(self, data: array, label: array)->array:return np.array([data[label == i].mean(axis=0) for i in range(self.n_class)])# 计算训练集方差。每一个特征的进行方差def _get_vars(self, data: array, label: array)->array:return np.array([data[label == i].var(axis=0) for i in range(self.n_class)])# 计算似然度,即公式-》P(x|yi)def _get_likelihood(self, row: array)->array:return (1 / sqrt(2 * pi * self.vars) * exp(-(row - self.avgs)**2 / (2 * self.vars))).prod(axis=1) # prod按行连乘# 训练模型def fit(self, data: array, label: array):self.prior = self._get_prior(label)self.n_class = len(self.prior)self.avgs = self._get_avgs(data, label)self.vars = self._get_vars(data, label)# 计算prob,先验概率乘以似然度再归一化得到每个label的prob def predict_prob(self, data: array)->array:likelihood = np.apply_along_axis(self._get_likelihood, axis=1, arr=data) # 基于data按行,调用_get_likehood函数probs = self.prior * likelihoodprobs_sum = probs.sum(axis=1)return probs / probs_sum[:, None]# 预测labeldef predict(self, data: array)->array:return self.predict_prob(data).argmax(axis=1)if __init__=="__main__":# 自己的数据和标签data,label = load(data)data_train, data_test, label_train, label_test = train_test_split(data, label, random_state=100)clf = GaussianNB()clf.fit(data_train, label_train)y_hat = clf.predict(data_test)

2.多项式朴素贝叶斯

2.1 多项式概率分布

对于文本分类任务,通过one-hot编码,将文本进行向量化。这种离散特征,就可以考虑基于多项式分布的贝叶斯。
其实就是基于极大似然估计的方法,把【词频/词频总数】 当做该词出现的概率再连乘。通俗的理解就是:这些词组合在一起,该文本是yk类的概率是多大。
多项式分布公式:
在这里插入图片描述

式中,yk表示在类别k条件下,xi表示样本的第i个词,样本的总长度是词袋的大小。N(yk,xi)表示在yk条件下xi这个次出现的频数,α是平滑因子,一般有α=1(拉普拉斯平滑)。N(yk)表示在条件yk下出现的总词数。
这里只需要将P(xi|yk),采用多项式分布计算在类yk条件下,特征xi的概率。然后将概率连乘求最大似然估计。

2.2 代码实现

#coding: utf-8
import numpy as np
import collectionsclass MultiNB:def __init__(self):self.prior = Noneself.word_freqs = Noneself.n_class = Nonedef _get_prior(self, label: np.array)-> np.array:cnt = collections.Counter(label)prior = np.array([cnt[i]/len(label) for i in range(len(cnt))])return priordef _get_word_freqs(self, data : np.array, label :np.array)-> np.array:word_freqs = []for i in range(self.n_class):num = data[label == i].sum(axis=0) + 1 # 分子加1 ,防止0,做平滑处理,1为拉普拉斯平滑denom = np.sum(data[label==i].sum(axis=0)) + 3 # 分母初始值,设为类别个数word_freqs.append(np.log(num/denom))return np.array(word_freqs)def _get_likelihood(self, row: np.array) -> np.array:return (row * self.word_freqs).sum(axis=1)def fit(self, data: np.array, label:np.array):self.prior = self._get_prior(label)self.n_class = len(self.prior)self.word_freqs = self._get_word_freqs(data, label)def predict_prob(self, data : np.array) -> np.array:likelihood = np.apply_along_axis(self._get_likelihood, axis=1, arr=data) # 这里求最大似然时,对多项式进行了取对数处理,否则相乘的话存在没有改单词的情况。probs = np.log(self.prior) + likelihoodprobs_sum = probs.sum(axis=1)return probs / probs_sum[:,None]def predict(self, data : np.array) -> np.array:return self.predict_prob(data).argmax(axis=1)def text_process(doclist, classlist):def createVocablist(doclist: list) -> list:"""返回所有文本中所有词的集合"""vocabSet = set([])for document in doclist:vocabSet = vocabSet | set(document)return list(vocabSet)def setOfWord2Vec(vocablist: list, inputSentence: list) -> list:"""生成词频矩阵"""returnVec = [0] * len(vocablist)for word in inputSentence:if word in vocablist:returnVec[vocablist.index(word)] = 1return returnVec# 构建词袋vocablist = createVocablist(doclist)# doc进行one-hot编码docMat = [setOfWord2Vec(vocablist,doc) for doc in doclist]return np.array(docMat),np.array(classlist)if __name__ == '__main__':doclist = [['2021', '年', '12', '月', '21', '日'],['云投', '集团', '与', '云南', '交投', '就', '本次'],['无偿', '划转', '事项', '签署', '了', ' '],['《', '国有', '股权', '无偿', '划转', '协议', '》', ',', ' ']]classlist = [0,1,2,1]x_train, y_train = text_process(doclist, classlist)clf = MultiNB()clf.fit(np.array(x_train),np.array(y_train))res = clf.predict(x_train)

注意:就像在代码里说的,这里是求log(P(yk|x)) = ∑log(P(x|yk))+log(P(yk)),因为在进行one-hot编码是,有些文本里面是不存在词袋里的词的,最大似然估计求∏,存在0的情况。所以做了取对数处理。

参考:
https://zhuanlan.zhihu.com/p/64498790
https://scikit-learn.org.cn/search/index?searchkey
贝叶斯应用举例——垃圾邮件


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

相关文章

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

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

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 进行朴素贝叶斯分类

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

数据分类《二》贝叶斯分类

本博客是参考《数据仓库与数据挖掘技术》以及诸多道友的blog。仅作为自己学习的一个总结。 贝叶斯分类是一种基于统计学的分类方法,可以预测一个类成员关系的可能性。数据挖掘主要使用两种分类,朴素贝叶斯和贝叶斯网络方法。前者使用贝叶斯进行预测&…

贝叶斯分类及其代码

学期末的综述报告我选择了贝叶斯分类,既然已经写了就将它分享一下。 主要目的就是以教促学。 如有问题欢迎在评论区进行讨论。 随着现代社会信息技术的发展,对于数据的挖掘越来越重要,分类是数据挖掘中应用领域极其广泛的技术之一[1]&#…

栈和队列、

目录 1、栈: 1.1、栈的概念及结构: 1.2、栈的实现: 1.2.1、test.c源文件: 1.2.2、Stack.c源文件: 1.2.3、Stack.h头文件: 1.3、例题1: 2、队列: 2.1、队列的概念及结构&…

栈和队列——表达式求值大全

表达式求值 一.关于三种表达式的分类 中缀表达式:即我们最为常见的表达式,运算符号位于参与运算的连个操作数中间的表达式称作中缀表达式前缀表达式:前缀表达式是一种没有括号的算术表达式,与中缀表达式不同的是,其将…

栈与队列-

基础 stl中栈和队列不是容器,而是容器适配器。它们提供接口,由其他容器实现。 20. 有效的括号 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否…

数据结构----栈和队列

xdm这玩意我不会导入,只能截图了。 目录 栈篇 1.1栈 1.2.栈操作数据元素的两种动作: 2.代码实现 2.1初始化和销毁 2.2插入 2.3删除和判空 2.4返回栈顶值,计算栈长 队列篇 3.1队列 4.代码实现 4.1初始化和销毁和判空 4.2入列 4.3出列 4.4…

栈(Stack)和队列(Queue)详解

1. 什么是栈,栈存储结构详解 同顺序表和链表一样,栈也是用来存储逻辑关系为 “一对一” 数据的线性存储结构,如图 1 所示。 图 1 栈存储结构示意图 从图 1 我们看到,栈存储结构与之前所学的线性存储结构有所差异,这缘…

栈和队列--栈

1、顺序栈 一组地址连续的存储单元加一个标识栈顶元素的指针。 #define MaxSize 50 //定义栈中最大元素个数 typedef struct{ ElemType data[MaxSize];//存放栈中的元素int Top;//栈顶指针 }SqStack;栈空:s.top-1 栈满:s.topMaxSize-1 栈长&#xff…

什么是栈?什么是队列?栈与队列的特点

栈 栈(Stack)是限定在仅在表尾插入的线性表。 因此对于栈来说,表尾具有特殊的含义。我们把表尾称作栈顶(top),把表头称作栈底(bottom)。不含元素的栈称为空栈。 想象一下进栈的顺序…