当前位置: 首页 > article >正文

朴素贝叶斯分类

原理:

我们现在用p1(x,y)表示数据点(x,y)属于类别1(图中红色圆点表示的类别)的概率,用p2(x,y)表示数据点(x,y)属于类别2(图中蓝色三角形表示的类别)的概率,那么对于一个新数据点(x,y),可以用下面的规则来判断它的类别:

  • 如果p1(x,y)>p2(x,y),那么类别为1

  • 如果p1(x,y)<p2(x,y),那么类别为2

根据贝叶斯定理,后验概率 P(a|X) 可以表示为:

$P(a|X) = \frac{P(X|a)P(a)}{P(X)}$

我们可以将联合概率 P(X|a) 分解为各个特征的概率乘积:

$P(X|a) = P(x_1, x_2, ..., x_n|a) = P(x_1|a)P(x_2|a)...P(x_n|a)$

将这个条件独立性假设应用于贝叶斯公式,我们得到:
$P(a|X) = \frac{P(x_1|a)P(x_2|a)...P(x_n|a)P(a)}{P(X)}$

这样,朴素贝叶斯分类器就可以通过计算每种可

其中:

  • P(X|a) 是给定类别 ( a ) 下观测到特征向量 $X=(x_1, x_2, ..., x_n) $的概率;

  • P(a) 是类别 a 的先验概率;

  • P(X) 是观测到特征向量 X 的边缘概率,通常作为归一化常数处理。

常见类型

  • 高斯朴素贝叶斯:适用于特征是连续型变量的情况,假设特征服从高斯分布(正态分布)。例如,在根据人的身高、体重等连续特征来判断性别时,可使用高斯朴素贝叶斯。
  • 多项式朴素贝叶斯:常用于文本分类等场景,特征通常是离散的,比如单词出现的次数等。假设特征是由一个多项式分布生成的。例如,在判断一篇文章是属于科技类还是娱乐类时,可将文章中的单词作为特征,使用多项式朴素贝叶斯。
  • 伯努利朴素贝叶斯:适用于特征是二值化的情况,即特征只有 0 和 1 两种取值,比如单词是否在文档中出现。它假设特征服从伯努利分布。例如,在根据关键词是否出现来对新闻进行分类时,可以使用伯努利朴素贝叶斯。

算法流程

  1. 数据准备:收集和整理数据,将数据分为训练集和测试集。对特征进行适当的预处理,如离散化、归一化等。
  2. 计算先验概率:根据训练集计算每个类别的先验概率。
  3. 计算条件概率:对于每个类别和每个特征,根据训练集计算条件概率。
  4. 预测:对于待分类的样本,根据贝叶斯定理计算它属于每个类别的概率,选择概率最大的类别作为预测结果。

应用场景

  • 文本分类:如垃圾邮件过滤、新闻分类、情感分析等。可以根据文本中的词汇等特征,判断文本所属的类别。
  • 医疗诊断:根据患者的症状、检查结果等特征,判断患者可能患有的疾病。
  • 客户细分:根据客户的行为数据、属性特征等,将客户分为不同的类别,以便进行精准营销等。

优缺点

  • 优点:算法简单,训练和预测速度快,对小规模数据表现良好,对缺失值不敏感,在文本分类等领域有较好的性能。
  • 缺点:特征条件独立假设在实际中往往难以满足,可能会影响分类的准确性;对输入数据的表达形式很敏感。

拉普拉斯平滑系数

某些事件或特征可能从未出现过,这会导致它们的概率被估计为零。然而,在实际应用中,即使某个事件或特征没有出现在训练集中,也不能完全排除它在未来样本中出现的可能性。拉普拉斯平滑技术可以避免这种“零概率陷阱”

 

一般α取值1,m的值为总特征数量

通过这种方法,即使某个特征在训练集中从未出现过,它的概率也不会被估计为零,而是会被赋予一个很小但非零的值,从而避免了模型在面对新数据时可能出现的过拟合或预测错误

API

sklearn.naive_bayes.MultinomialNB()
estimator.fit(x_train, y_train)
y_predict = estimator.predict(x_test)

实例:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
# 1)获取数据
news =load_iris()
# 2)划分数据集
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target)
# 3)特征工程:不用做标准化
# 4)朴素贝叶斯算法预估器流程
estimator = MultinomialNB()
estimator.fit(x_train, y_train)
# 5)模型评估
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)
# 6)预测
index=estimator.predict([[2,2,3,1]])
print("预测:\n",index,news.target_names,news.target_names[index])
纹理色泽鼔声类别
1清晰清绿清脆好瓜
2模糊乌黑浊响坏瓜
3模糊清绿浊响坏瓜
4清晰乌黑沉闷好瓜
5清晰清绿浊响好瓜
6模糊乌黑沉闷坏瓜
7清晰乌黑清脆好瓜
8模糊清绿沉闷好瓜
9清晰乌黑浊响坏瓜
10模糊清绿清脆好瓜
11清晰清绿沉闷
12模糊乌黑浊响?
p(a|X) = p(X|a)* p(a)/p(X)  #贝叶斯公式
p(X|a) = p(x1,x2,x3...xn|a) = p(x1|a)*p(x2|a)*p(x3|a)...p(xn|a)
p(X) = p(x1,x2,x3...xn) = p(x1)*p(x2)*p(x3)...p(xn)
p(a|X) = p(x1|a)*p(x2|a)*p(x3|a)...p(xn|a) * p(a) / p(x1)*p(x2)*p(x3)...p(xn)  #朴素贝叶斯公式
​
P(好瓜)=(好瓜数量)/所有瓜
P(坏瓜)=(坏瓜数量)/所有瓜
p(纹理清晰)=(纹理清晰数量)/所有瓜
p(纹理清晰|好瓜)= 好瓜中纹理清晰数量/好瓜数量
p(纹理清晰|坏瓜)= 坏瓜中纹理清晰数量/坏瓜数量
​
p(好瓜|纹理清晰,色泽清绿,鼓声沉闷)
    =【p(好瓜)】*【p(纹理清晰,色泽清绿,鼓声沉闷|好瓜)】/【p(纹理清晰,色泽清绿,鼓声沉闷)】
    =【p(好瓜)】*【p(纹理清晰|好瓜)*p(色泽清绿|好瓜)*p(鼓声沉闷|好瓜)】/【p(纹理清晰)*p(色泽清绿)*p(鼓声沉闷)】
​
p(坏瓜|纹理清晰,色泽清绿,鼓声沉闷)
    =【p(坏瓜)*p(纹理清晰|坏瓜)*p(色泽清绿|坏瓜)*p(鼓声沉闷|坏瓜)】/【p(纹理清晰)*p(色泽清绿)*p(鼓声沉闷)】
​
从公式中判断"p(好瓜|纹理清晰,色泽清绿,鼓声沉闷)"和"p(坏瓜|纹理清晰,色泽清绿,鼓声沉闷)"时,因为它们的分母
值是相同的,[值都是p(纹理清晰)*p(色泽清绿)*p(鼓声沉闷)],所以只要计算它们的分子就可以判断是"好瓜"还是"坏瓜"之间谁大谁小了,所以没有必要计算分母
p(好瓜) = 6/10
p(坏瓜)=4/10
p(纹理清晰|好瓜) = 4/6 
p(色泽清绿|好瓜) = 4/6
p(鼓声沉闷|好瓜) = 2/6
p(纹理清晰|坏瓜) = 1/4 
p(色泽清绿|坏瓜) = 1/4
p(鼓声沉闷|坏瓜) = 1/4
把以上计算代入公式的分子
p(好瓜)*p(纹理清晰|好瓜)*p(色泽清绿|好瓜)*p(鼓声沉闷|好瓜) = 4/45
p(坏瓜)*p(纹理清晰|坏瓜)*p(色泽清绿|坏瓜)*p(鼓声沉闷|坏瓜) = 1/160
所以
p(好瓜|纹理清晰,色泽清绿,鼓声沉闷) >  p(坏瓜|纹理清晰,色泽清绿,鼓声沉闷),
所以把(纹理清晰,色泽清绿,鼓声沉闷)的样本归类为好瓜


 

http://www.kler.cn/a/563633.html

相关文章:

  • Maven+SSM+SpringBoot+Mybatis-Plus
  • 50周学习go语言:第四周 函数与错误处理深度解析
  • Python 网络爬虫实战全解析:案例驱动的技术探索
  • python编写liunx服务器登陆自动巡检脚本
  • Faster-RCNN与DETR:遥感影像目标检测的对比与选择
  • React加TypeScript最新部署完整版
  • 火语言RPA--Excel获取Sheet页列表
  • Redis 基本数据类型及其适用场景与案例
  • Yalmip工具箱(2)——建模
  • 知识图谱的自主学习技术:从数据驱动到知识驱动
  • 面试八股文--数据库基础知识总结(2) MySQL
  • 【LeetCode 热题100】 240. 搜索二维矩阵 II的算法思路及python代码
  • SQL_优化
  • 深度剖析数据中台架构图,铸造数字文明的基石
  • Java进阶学习笔记64——IO流
  • MATLAB下载安装教程(附安装包)2025最新版(MATLAB R2024b)
  • LSTM时序建模:解码时间之河的智能钥匙
  • 玩转Docker | 使用Docker部署IT-tools工具箱
  • 【深入理解JWT】从认证授权到网关安全
  • VMware各个软件的作用