机器学习-贝叶斯分类器(附Python代码)

article/2025/10/6 6:15:42

1. 贝叶斯原理

Naive Bayes 官方网址:
https://scikit-learn.org/stable/modules/naive_bayes.html

GitHub地址:https://github.com/gao7025/naive_bayes.git

贝叶斯分类是以贝叶斯定理为基础的一种分类算法,其主要思想为:先验概率+新的数据=后验概率
已知某条件概率,如何得到事件交换后的概率;即在已知P(B|A)的情况下求得P(A|B)。条件概率P(B|A)表示事件A已经发生的前提下,事件B发生的概率。其基本求解公式为:P(B|A)=P(AB)/P(A)。
贝叶斯定理:
在这里插入图片描述

例如:
从家里去公司上班有三种交通方式打车、坐地铁和乘公交,对应概率为P(A1)=0.5、P(A2)=0.3、P(A3)=0.2,在已知每种方式下上班迟到的概率分别为:打车迟到:P(B|A1)=0.2,坐地铁迟到:P(B|A2)=0.4,乘公交迟到P(B|A3)=0.7,求解,若上班迟到了,是打车方式的概率是多少,即求解P(A1|B)。

在这里插入图片描述

其中:

  • P(A1)、P(A2)、P(A3)为先验概率
  • 加入新的条件,即上班迟到了P(B)
  • P(A1|B)为后验概率

全概率公式:

在这里插入图片描述

随机事件A1,A2,…An构成完备事件(互斥,且至少有一个发生),随机事件B伴随着该完备事件的发生而发生
在这里插入图片描述

故:
迟到的概率
在这里插入图片描述

迟到且采用打车方式上班的概率
在这里插入图片描述

2. 贝叶斯分类器

朴素贝叶斯方法是基于贝叶斯定理的一组有监督学习算法,即“简单”地假设每对特征之间相互独立。 给定一个类别 y 和一个从 x_1 到 x_n 的相关的特征向量, 贝叶斯定理阐述了以下关系:
在这里插入图片描述

使用简单(naive)的假设-每对特征之间都相互独立:

P(x_i | y, x_1, \dots, x_{i-1}, x_{i+1}, \dots, x_n) = P(x_i | y) ,

对于所有的 :i 都成立,这个关系式可以简化为

在这里插入图片描述

由于在给定的输入中 P(x_1, \dots, x_n) 是一个常量,我们使用下面的分类规则:

在这里插入图片描述

我们可以使用最大后验概率(Maximum A Posteriori, MAP) 来估计 P(y) 和 P(xi | y) ; 前者是训练集中类别 y 的相对频率。

各种各样的的朴素贝叶斯分类器的差异大部分来自于处理 P(xi | y)分布时的所做的假设不同。

尽管其假设过于简单,在很多实际情况下,朴素贝叶斯工作得很好,特别是文档分类和垃圾邮件过滤。这些工作都要求 一个小的训练集来估计必需参数。

相比于其他更复杂的方法,朴素贝叶斯学习器和分类器非常快。 分类条件分布的解耦意味着可以独立单独地把每个特征视为一维分布来估计。这样反过来有助于缓解维度灾难带来的问题。

另一方面,尽管朴素贝叶斯被认为是一种相当不错的分类器,但却不是好的估计器(estimator),所以不能太过于重视从 predict_proba 输出的概率。

朴素贝叶斯分类器是一种有监督学习,常见有五种算法,这五种算法适合应用在不同的数据场景下,我们应该根据特征变量的不同选择不同的算法,下面是一些常规的区别和介绍。

2.1. 高斯朴素贝叶斯

GaussianNB 实现了运用于分类的高斯朴素贝叶斯算法,特征的可能性(即概率)假设为高斯分布,适用于连续变量。

在这里插入图片描述

2.2. 多项分布朴素贝叶斯

MultinomialNB 实现了服从多项分布数据的朴素贝叶斯算法,适用于离散变量。在计算先验概率和条件概率时,使用平滑过的最大似然估计法来估计,为在学习样本中没有出现的特征而设计,以防在将来的计算中出现0概率输出。

2.3. 补充朴素贝叶斯

ComplementNB 实现了补充朴素贝叶斯(CNB)算法。CNB是标准多项式朴素贝叶斯(MNB)算法的一种改进,适用于不平衡数据集。具体来说,CNB使用来自每个类的补数的统计数据来计算模型的权重。CNB的发明者的研究表明,CNB的参数估计比MNB的参数估计更稳定。此外,CNB在文本分类任务上通常比MNB表现得更好(通常有相当大的优势)。

2.4. 伯努利朴素贝叶斯

BernoulliNB 实现了用于多重伯努利分布数据,要求样本以二元值特征向量表示,如果样本含有其他类型的数据, 一个 BernoulliNB 实例会将其二值化(取决于 binarize 参数)。

伯努利朴素贝叶斯的决策规则基于:

在这里插入图片描述

与多项分布朴素贝叶斯的规则不同 伯努利朴素贝叶斯明确地惩罚类 y 中没有出现作为预测因子的特征 i ,而多项分布分布朴素贝叶斯只是简单地忽略没出现的特征。

2.5. 基于外存的朴素贝叶斯模型拟合

朴素贝叶斯模型可以解决整个训练集不能导入内存的大规模分类问题。 为了解决这个问题, MultinomialNB, BernoulliNB, 和 GaussianNB 实现了 partial_fit 方法,可以动态的增加数据,使用方法与其他分类器的一样,使用示例见 Out-of-core classification of text documents 。所有的朴素贝叶斯分类器都支持样本权重。

与 fit 方法不同,首次调用 partial_fit 方法需要传递一个所有期望的类标签的列表。

3.代码示例

本例使用高斯朴素贝叶斯分类器对iris数据集进行花分类,具体代码如下:

# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
from sklearn import metrics
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn import datasetsclass bayes_model():def __int__(self):passdef load_data(self):data = datasets.load_iris()iris_target = data.targetiris_features = pd.DataFrame(data=data.data, columns=data.feature_names)train_x, test_x, train_y, test_y = train_test_split(iris_features, iris_target, test_size=0.3, random_state=123)return train_x, test_x, train_y, test_ydef train_model(self, train_x, train_y):clf = GaussianNB()clf.fit(train_x, train_y)return clfdef proba_data(self, clf, test_x, test_y):y_predict = clf.predict(test_x)y_proba = clf.predict_proba(test_x)accuracy = metrics.accuracy_score(test_y, y_predict) * 100tot1 = pd.DataFrame([test_y, y_predict]).Ttot2 = pd.DataFrame(y_proba).applymap(lambda x: '%.2f' % x)tot = pd.merge(tot1, tot2, left_index=True, right_index=True)tot.columns=['y_true', 'y_predict', 'predict_0', 'predict_1', 'predict_2']print('The accuracy of Testset is: %d%%' % (accuracy))print('The result of predict is: \n', tot.head())return accuracy, totdef exc_p(self):train_x, test_x, train_y, test_y = self.load_data()clf = self.train_model(train_x, train_y)res = self.proba_data(clf, test_x, test_y)return resif __name__ == '__main__':bayes_model().exc_p()

部分结果截图:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/337k9fon.shtml

相关文章

chrome插件开发入门实战——CSDN免登陆拷贝、免关注查看

官方资料 docextensions官方chrome-extensions-samples 实战CSDN插件(V3) 功能 CSDN: 复制代码免登陆;CSDN: 免关注博主看文章;CSDN: 替换CSDN代码拷贝按钮,登陆也不用CSDN复制按…

Github实用浏览器插件推荐

文章目录 1. github树形目录插件-octotree(有付费功能)2. 快速下载github项目——GitHub加速3. 下载github中指定文件——GitZip for github4. github代码定义跳转浏览插件-Sourcegraph 某天看直播课程的时候看到这样一个界面: 然后就搜了一下…

IDEA必备插件

一、插件入口 二、IDEA必备插件 插件安装目录:C:\Users\用户名\AppData\Roaming\JetBrains\IntelliJIdea2021.3\plugins 1.Alibaba Java Coding Guidelines 推荐指数:★★★ 介绍:阿里巴巴Java编码指南 安装之后右键菜单会多出两个选项&a…

Visual Studio 2017,C++MFC免注册调用大漠插件图文教程,详细版

Visual Studio 2017,CMFC免注册调用大漠插件图文教程,详细版 前言 提示:这里可以添加本文要记录的大概内容: 有很多人都在问CMFC怎么免注册调用?其实这些都有参考但是对于新手来说,编译器对新手的不友好&#xff0c…

PHPstorm必备插件推荐

1、.env files support 对.env 文件的支持 2、 .ignore 对.ignore 文件的支持 3、 Ideolog 对 .log 文件的支持 4、 Chinese (Simplified) Language Pack / 中文语言包 官方版中文语言包 | 汉化语言包 5、 Git 对Git的支持 6、 GitToolBox 支持在文件中展示当前代码最后的…

【BurpSuite】插件之自用插件

自用burpsuite插件汇总 前言 自用的一些burpsute插件,有的是自己改着写的,有的是用别人写的,备份记录为主要目的。万一哪天环境崩了也能快速记起来要用什么插件。 重写右键执行 自己重写的一些代码,核心点是处理http请求&…

插件的使用

1、插件写法:插件通常会为 Vue 添加全局功能,添加全局方法或者属性; 添加全局资源:指令/过滤器/过渡等;通过全局 mixin 方法添加一些组件选项; 添加 Vue 实例方法,通过把它们添加到 Vue.proto…

TypechoCMS通用发布插件-【免登录版本】

Typecho是一个操作简单快速的轻量博客平台。 轻量高效:不足 400KB 的代码,就实现了完整的插件与模板机制。超低的 CPU 和内存使用率,足以发挥主机的最高性能。 先进稳定:支持 BAE/GAE/SAE 等各类云主机,即使面对突如…

【Unity插件】最多的插件合集

一、前言 ? 最近整理了一下文章,发现我分享了很多的插件,但是如果要查找某一款插件,还需要去搜索才能找到,很不方面,就想要将写过的所有的插件分享也好,教程也好,做一个汇总,然后这…

AS常用插件

1.​​adb-idea​​ 支持直接在AS面板中进行ADB操作 2.Android Code Generator 根据布局文件快速生成对应的Activity,Fragment,Adapter,Menu。 http://plugins.jetbrains.com/files/7595/screenshot_14834.png 3.CodeGlance 右边实现代…

油猴插件免费下载

安利一个黑科技,名叫"油猴子"。点击下载 Tampermonkey中文名俗称油猴,是一款免费的浏览器插件,目前最为流行的用户脚本管理器,用户可以通过油猴添加和使用脚本,而脚本是一种可以修改网页JavaScript的程序。…

超实用的浏览器插件:CSDN全站去广告

文章目录 1先下载安装为快2功能分析评测1浏览界面清爽便捷2永久免费去站内广告3神奇的C键搜索功能4 json格式化 3改进建议 最近CSDN官方出了一个插件,一起来see see有啥好玩的地方 hello,我是北京某不知名211大学计算机专业的一名大三学生(哈…

超实用的浏览器插件永久免费!!!

能让工作效率翻N倍 ,是不是心动了主要功能 个性化标签、自动换肤、自定义常用网站,同时可选择多种搜索引擎 永久免费去站内广告 一键万能框搜索 实用快捷工具(日期格式化、时间戳自动转换、在线翻译) 新增一键json转换 占内存…

【Chrome必备插件,一键提升10倍效率】新用户永久免广告,好用!

CSDN 官方出品的浏览器插件–CSDN开发者助手 终于正式更新啦!更多好玩功能等你发现,现在登录⭕️官网即可下载 CSDN浏览器助手,风格简约清爽,体积不到1M,一键极简操作万能工具,让你在工作、学习和技术开发场…

如何用WordPress免插件实现MarkDown语法支持

WordPress默认不支持MarkDown标记(不知道最新版实现没有),虽然提供了很多第三方MarkDown插件,但都无法达到满意的效果。xiaoz一直以来都是用HTML标签来写文章,虽然排版效果好,但是写起来真的很费劲&#xf…

sklearn.svm 多分类

>>> from sklearn import svmX [[0,0], [1,1],[2,2],[3,3]] Y [0, 1,2,3] clf SVC( probabilityTrue) clf.fit(X,Y) print(clf.predict([[0,0], [1,1],[2,2],[3,3]])) print(clf.predict_proba([[0,0], [1,1],[2,2],[3,3]]))打印如下: [0 1 2 3] [[ 0.1…

SVM入门(九)将SVM用于多类分类

从 SVM的那几张图可以看出来,SVM是一种典型的两类分类器,即它只回答属于正类还是负类的问题。而现实中要解决的问题,往往是多类的问题(少部分例外,例如垃圾邮件过滤,就只需要确定“是”还是“不是”垃圾邮件…

OpenCV中的「SVM分类器」:基本原理、函数解析和示例代码

文章目录 1. 引言2. 基本原理3. 函数解析创建模型设置模型类型设置参数C设置核函数设置迭代算法的终止标准训练SVM模型预测结果误差计算保存SVM模型从文件中加载SVM 4. 示例代码官方示例(python)推理阶段(C版本) 5. 小结 1. 引言 …

2.1.SVM线性分类器

文章目录 1.笔记总结1.1.Small Questions1.1.1.图像xi的定义,行列的问题1.1.2.np.hstack函数1.1.3.np.random.randn()正态分布随机数函数 1.2.最优化损失函数1.2.1.寻找更好的W的方法 1.2.2梯度下降1.2.2.1.数值梯度1.2.2.2.实际应用中的梯度下降 2.SVM的…

svm多分类器详解

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步 SVM是一种典型的两类分类器,即它只回答属于正类还是负类的问题。而现实中要解决的问题,往往是多类的问题&#…