朴素贝叶斯分类算法

news2024/9/23 5:22:15

文章目录

贝叶斯定理

问题背景

当知道事件 B B B 发生的情况下事件 A A A 发生的概率 P ( A ∣ B ) P(A \mid B) P(AB) ,如何求 P ( B ∣ A ) P(B \mid A) P(BA)

根据条件概率公式可以得到:
P ( B ∣ A ) = P ( A B ) P ( A ) (1a) P(B \mid A)=\frac{P(AB)}{P(A)} \tag{1a} P(BA)=P(A)P(AB)(1a)
P ( A B ) = P ( B ∣ A ) × P ( A ) (1b) P(AB)=P(B \mid A) \times P(A) \tag{1b} P(AB)=P(BA)×P(A)(1b)
同理:
P ( A ∣ B ) = P ( A B ) P ( B ) (2a) P(A \mid B)=\frac{P(AB)}{P(B)} \tag{2a} P(AB)=P(B)P(AB)(2a)
P ( A B ) = P ( A ∣ B ) × P ( B ) (1b) P(AB)=P(A \mid B) \times P(B) \tag{1b} P(AB)=P(AB)×P(B)(1b)
联立得贝叶斯定理公式:
P ( B ∣ A ) = P ( A B ) P ( A ) = P ( A ∣ B ) × P ( B ) P ( A ) (3) P(B \mid A)=\frac{P(AB)}{P(A)}=\frac{P(A \mid B) \times P(B)}{P(A)} \tag{3} P(BA)=P(A)P(AB)=P(A)P(AB)×P(B)(3)
请添加图片描述
这里的 P ( A ) , P ( B ) P(A),P(B) P(A),P(B)都是依据原有数据集可知的,称为先验概率;而 P ( B ∣ A ) P(B|A) P(BA)是通过贝叶斯定理求出来的,称为后验概率

在机器学习的背景下,调整贝叶斯公式如下:
P ( 类别 ∣ 特征 ) = P ( 特征 ∣ 类别 ) × P ( 类别 ) P ( 特征 ) (4) P(\text{类别} \mid \text{特征})=\frac{P(\text{特征} \mid \text{类别}) \times P(\text{类别})}{P(\text{特征})} \tag{4} P(类别特征)=P(特征)P(特征类别)×P(类别)(4)
公式 ( 4 ) (4) (4) 利用先验概率,即特征和类别的概率;再利用不同类别中各个特征的概率分布,最后计算得到后验概率,即各个特征分布下的预测不同的类别。

朴素贝叶斯

朴素贝叶斯中的「朴素」,即条件独立,表示其假设预测的各个属性都是相互独立的,每个属性独立地对分类结果产生影响,条件独立在数学上的表示为: P ( A B ) = P ( A ) × P ( B ) P(AB)=P(A) \times P(B) P(AB)=P(A)×P(B)

显然,不同类别之间不一定是完全独立的关系,朴素贝叶斯算法是简化后的算法,但会牺牲一定的分类准确率。

朴素贝叶斯分类算法原理

P ( 类别 ∣ 特征 ) = P ( 特征 ∣ 类别 ) × P ( 类别 ) P ( 特征 ) (4) P(\text{类别} \mid \text{特征})=\frac{P(\text{特征} \mid \text{类别}) \times P(\text{类别})}{P(\text{特征})} \tag{4} P(类别特征)=P(特征)P(特征类别)×P(类别)(4)
公式 ( 4 ) (4) (4) 利用先验概率,即特征和类别的概率;再利用不同类别中各个特征的概率分布,最后计算得到后验概率,即各个特征分布下的预测不同的类别。

对于每个特征,其预测的不同类别中概率最高的就是这个特征的分类的类别,达到分类的目的。对于每种特征来说, P ( 特征 ) P(\text{特征}) P(特征)都是一样的,只需要比较 P ( 特征 ∣ 类别 ) × P ( 类别 ) P(\text{特征} \mid \text{类别}) \times P(\text{类别}) P(特征类别)×P(类别)大小即可。

朴素贝叶斯分类算法步骤

  • 第 1 步:设 X = { a 1 , a 2 , a 3 , … , a n } X = \left \{ a_{1},a_{2},a_{3},…,a_{n} \right \} X={a1,a2,a3,,an} 为预测数据,其中 a i a_{i} ai 是预测数据的特征值。

  • 第 2 步:设 Y = { y 1 , y 2 , y 3 , … , y m } Y = \left \{y_{1},y_{2},y_{3},…,y_{m} \right \} Y={y1,y2,y3,,ym} 为类别集合。

  • 第 3 步:计算 P ( y 1 ∣ x ) P(y_{1}\mid x) P(y1x) , P ( y 2 ∣ x ) P(y_{2}\mid x) P(y2x) , P ( y 3 ∣ x ) P(y_{3}\mid x) P(y3x) , … … , P ( y m ∣ x ) P(y_{m}\mid x) P(ymx)

  • 第 4 步:寻找 P ( y 1 ∣ x ) P(y_{1}\mid x) P(y1x) , P ( y 2 ∣ x ) P(y_{2}\mid x) P(y2x) , P ( y 3 ∣ x ) P(y_{3}\mid x) P(y3x) , … … , P ( y m ∣ x ) P(y_{m}\mid x) P(ymx) 中最大的概率 P ( y k ∣ x ) P(y_{k}\mid x) P(ykx) ,则 x x x 属于类别 y k y_{k} yk

给定示例数据

import pandas as pd

def create_data():
    # 生成示例数据
    data = {"x": ['r', 'g', 'r', 'b', 'g', 'g', 'r', 'r', 'b', 'g', 'g', 'r', 'b', 'b', 'g'],
            "y": ['m', 's', 'l', 's', 'm', 's', 'm', 's', 'm', 'l', 'l', 's', 'm', 'm', 'l'],
            "labels": ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B']}
    data = pd.DataFrame(data, columns=["labels", "x", "y"])
    return data

data = create_data()

极大似然估计

如何求 P ( 特征 ∣ 类别 ) × P ( 类别 ) P(\text{特征} \mid \text{类别}) \times P(\text{类别}) P(特征类别)×P(类别)

如何求 P ( 类别 ) P(\text{类别}) P(类别)

P ( y i = c k ) = ∑ i = 1 N I ( y i = c k ) N , k = 1 , 2 , 3 , … , m (5) P(y_{i}=c_{k})=\frac{\sum_{i=1}^{N}I(y_{i}=c_{k})}{N},k=1,2,3,…,m \tag{5} P(yi=ck)=Ni=1NI(yi=ck),k=1,2,3,,m(5)
这个很好理解,就是每种类别 y i y_i yi的数量 I I I占总样本 N N N的比值。

# 先验概率求解
def get_P_labels(labels):
    # P(\text{类别}) 先验概率计算
    labels = list(labels)  # 转换为 list 类型
    P_label = {}  # 设置空字典用于存入 label 的概率
    label_name=list(set(labels))
    for label in label_name:
        P_label[label] = labels.count(
            label) / float(len(labels))  # p = count(y) / count(Y)
    return P_label

P_labels = get_P_labels(data["labels"])
# {'A': 0.5333333333333333, 'B': 0.4666666666666667}
如何求 P ( 特征 ∣ 类别 ) P(\text{特征} \mid \text{类别}) P(特征类别)

首先我们将特征按序号合并生成一个 NumPy 数组。

import numpy as np
train_data = np.array(data.drop("labels",axis=1))
'''
array([['r', 'm'],
       ['g', 's'],
       ['r', 'l'],
       ['b', 's'],
       ['g', 'm'],
       ['g', 's'],
       ['r', 'm'],
       ['r', 's'],
       ['b', 'm'],
       ['g', 'l'],
       ['g', 'l'],
       ['r', 's'],
       ['b', 'm'],
       ['b', 'm'],
       ['g', 'l']], dtype=object)
'''

得到每一个类别的索引:

labels = data["labels"]
label_index = []
for y in P_labels.keys():
    temp_index = []
    # enumerate 函数返回 Series 类型数的索引和值,其中 i 为索引,label 为值
    for i, label in enumerate(labels):
        if (label == y):
            temp_index.append(i)
        else:
            pass
    label_index.append(temp_index)
# [[0, 1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14]]

得到 A A A B B B 的索引,其中是 A A A 类别为前 8 8 8 条数据, B B B 类别为后 7 7 7 条数据。
在得到类别的索引之后,接下来就是找到我们需要的特征的索引, 以 A A A 类别中 r r r特征 为例。

r_index = [i for i, feature in enumerate(
    train_data[:, 0]) if feature == 'r']  # 效果等同于求类别索引中 for 循环
# [0, 2, 6, 7, 11]

计算出 P ( r ∣ A ) P(r|A) P(rA)

x_label = set(x_index) & set(label_index[0])
print('既符合 x = r 又是 A 类别的索引值:', x_label)
# 既符合 x = r 又是 A 类别的索引值: {0, 2, 6, 7}
x_label_count = len(x_label)
print('先验概率 P(r|A):', x_label_count / float(len(label_index[0])))
# 先验概率 P(r|A): 0.5

将上述流程转化为一个函数:

def get_P_fea_lab(P_label, features, data):
    # P(\text{特征}∣种类) 先验概率计算
    P_fea_lab = {}
    train_data = data.iloc[:, 1:]
    train_data = np.array(train_data)
    labels = data["labels"]
    for each_label in P_label.keys():
        label_index = [i for i, label in enumerate(
            labels) if label == each_label]  # labels 中出现 y 值的所有数值的下标索引
        # features[0] 在 trainData[:,0] 中出现的值的所有下标索引
        for j in range(len(features)):
            feature_index = [i for i, feature in enumerate(
                train_data[:, j]) if feature == features[j]]
            # set(x_index)&set(y_index) 列出两个表相同的元素
            fea_lab_count = len(set(feature_index) & set(label_index))
            key = str(features[j]) + '|' + str(each_label)
            P_fea_lab[key] = fea_lab_count / float(len(label_index))
    return P_fea_lab


features = ['r', 'm']
get_P_fea_lab(P_labels, features, data)
'''
{'r|A': 0.5,
 'm|A': 0.375,
 'r|B': 0.14285714285714285,
 'm|B': 0.42857142857142855}
'''

可以得到当特征 x x x y y y 的值为 r r r m m m 时,在不同类别下的先验概率。

完整代码
def classify(data, features):
    # 朴素贝叶斯分类器
    # 求 labels 中每个 label 的先验概率
    labels = data['labels']
    P_label = get_P_labels(labels)
    P_fea_lab = get_P_fea_lab(P_label, features, data)

    P = {}
    P_show = {}  # 后验概率
    for each_label in P_label:
        P[each_label] = P_label[each_label]
        for each_feature in features:
            key = str(each_label)+'|'+str(features)
            P_show[key] = P[each_label] * \
                P_fea_lab[str(each_feature) + '|' + str(each_label)]
            P[each_label] = P[each_label] * \
                P_fea_lab[str(each_feature) + '|' +
                          str(each_label)]  # 由于分母相同,只需要比较分子
    print(P_show)
    features_label = max(P, key=P.get)  # 概率最大值对应的类别
    return features_label
classify(data, ['r', 'm'])
# {"A|['r', 'm']": 0.1, "B|['r', 'm']": 0.02857142857142857}
# 这里类别A的概率大于B,故[r,m]特征分为A类别

贝叶斯估计

在做极大似然估计时,若类别中缺少一些特征,则就会出现概率值为 0 的情况。此时,就会影响后验概率的计算结果,使得分类产生偏差。于是引入贝叶斯估计。

贝叶斯估计的数学表达式为:
P ( y i = c k ) = ∑ i = 1 N I ( y i = c k ) + λ N + k λ (6) P(y_{i}=c_{k})=\frac{\sum_{i=1}^{N}I(y_{i}=c_{k})+\lambda }{N+k\lambda} \tag{6} P(yi=ck)=N+i=1NI(yi=ck)+λ(6)

其中 λ ≥ 0 \lambda \geq 0 λ0 等价于在随机变量各个取值的频数上赋予一个正数,当 λ = 0 \lambda=0 λ=0 时就是极大似然估计。在平时常取 λ = 1 \lambda=1 λ=1,这时称为拉普拉斯平滑。 k k k取值为类别数目。

朴素贝叶斯的三种常见模型

多项式模型

上述过程就是多项式模型,特征离散,参数估计方法采用贝叶斯估计。

伯努利模型

伯努利模型中每个特征的取值只能是 1 和 0。

高斯模型

处理连续的特征变量,采用高斯模型。高斯模型是假设连续变量的特征数据是服从高斯分布的,高斯分布函数表达式为:
P ( x i ∣ y k ) = 1 2 π σ y k , i e x p ( − ( x − μ y k , i ) 2 2 σ y k 2 , i ) P(x_{i}|y_{k})=\frac{1}{\sqrt{2\pi}\sigma_{y_{k},i}}exp(-\frac{(x-\mu_{y_{k},i}) ^{2}}{2\sigma ^{2}_{y_{k}},i}) P(xiyk)=2π σyk,i1exp(2σyk2,i(xμyk,i)2)

  • μ y k , i \mu_{y_{k},i} μyk,i 表示类别为 y k y_{k} yk 的样本中,第 i i i 维特征的均值。
  • σ y k 2 , i \sigma ^{2}_{y_{k}},i σyk2,i 表示类别为 y k y_{k} yk 的样本中,第 i i i 维特征的方差。

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2084839.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络基础:理解IP地址、默认网关与网段(IP地址是什么,默认网关是什么,网段是什么,IP地址、默认网关与网段)

前言 在计算机网络中,IP地址、默认网关和网段(也称为子网)之间有着密切的关系。它们是网络通信中的至关重要的概念,但它们并不相同。这里来介绍一下它们之间的关系,简单记录一下 一. IP地址 1. 介绍 IP 地址&#xf…

反爬虫策略收录集

前言 反爬虫,是指对扫描器中的网络爬虫环节进行反制,通过一些反制策略来阻碍或干扰爬虫的正常爬行,从而间接地起到防御目的。下面是一些常见的反爬虫策略的收录。 入门版 封IP 由于服务器有防火墙(如果防火墙在TCP/UDP层或者它…

Profinet 从站转 EtherNet/IP 从站网关

产品用途 本产品是 PN(Profinet) 和 EtherNet/IP 网关,使用数据映射方式工作。 本产品在 PN 侧作为 PN IO 从站,接 PN 主站设备,比如西门子 PLC 等;在EtherNet/IP 侧做为 EtherNet/IP 从站,接 EtherNet…

mongodb日期转换

public static void main(String[] args) throws ParseException {// 把mongodb日期转成yyyy-MM-dd HH:mm:ss日期String date "2024-08-27T15:59:40.327Z";date date.replace("Z", " UTC");//注意是空格UTCSimpleDateFormat format new Simpl…

深度学习基础--监督学习

第二章 监督学习(Supervised Learning) 监督学习模型就是将一个或多个输入转化为一个或多个输出的方式。比如,我们可以将某部二手丰田普锐斯的车龄和行驶里程作为输入,预估的车辆价格则是输出。 这个模型其实只是个数学公式&…

第12章 网络 (5)

目录 12.8 网络层 12.8.1 IPv4 12.8.2 接受分组 12.8.3 交付到本地传输层 本专栏文章将有70篇左右,欢迎关注,查看后续文章。 12.8 网络层 12.8.1 IPv4 IPv4首部: version: 值为4。 IHL: IP header leng…

AI模型:追求全能还是专精?详细阐述

AI模型:追求全能还是专精? 近日,OpenAI预计在秋季推出代号为“草莓”的新AI。从专注于数学问题到处理主观营销策略,"草莓"模型展现出惊人的多样性。而这种全能型 AI 是否代表了未来趋势?相比专攻于某一领域…

Python和MATLAB及R平均意见得分导图

🎯要点 文本转语音预测语音视频得分后验分布预测语音质量移动端语音质量测量英伟达GPU深度学习语音质量评估秩统计平均意见得分比较置信区间音频波形质量等分测评转换语音和自然语言相似性评估 JavaScript平均意见得分 平均意见得分是体验质量和电信工程领域中使用…

什么是Cursor?Cursor 是用于编码的 ChatGPT,现在任何人都能在几分钟内制作出应用程序

有时,一款人工智能工具会突然出现,并主导社交媒体上的话题。这款应用程序就是 Cursor,它是一款人工智能编码工具,使用 Claude 3.5 Sonnet 和 GPT-4o 等模型,让你比以往任何时候都更容易构建自己的应用程序。 Cursor 既…

3分钟千人被裁,IBM中国 “灭霸式“裁员背后原因?

2024年8月23日,IMB即有员工传出“无法访问系统”,“无法连接到公司网络”的消息,后续传出裁员的传闻。 图片来源网络 2024年8月26日周一,IBM召开3分钟的会议,宣布彻底关闭IBM中国研发部门,之后直接切断会议…

i.MX6裸机开发(12):eLCDIF——液晶显示

本章参考资料:《IMX6ULRM》(参考手册)Chapter 32: Enhanced LCD Interface (eLCDIF) 显示器介绍,显示器的分类和基本参数。 液晶控制原理,野火液晶屏介绍和控制原理讲解。 eLCDIF液晶显示实验,开发板预留…

安卓蓝牙技术的使用和场景

1.蓝牙协议应用领域 蓝牙协议是一种无线通信技术,广泛应用于短距离的数据和语音传输。以下是蓝牙协议的主要使用场景: 个人设备互联:蓝牙技术允许智能手机、平板电脑、笔记本电脑等设备之间进行数据传输和共享。例如,通过蓝牙将手…

“遥感+”集成技术的碳储量、碳排放、碳循环、温室气体等多领域监测与模拟

以全球变暖为主要特征的气候变化已成为全球性环境问题,对全球可持续发展带来严峻挑战。2015年多国在《巴黎协定》上明确提出缔约方应尽快实现碳达峰和碳中和目标。2019年第49届 IPCC全会明确增加了基于卫星遥感的排放清单校验方法。随着碳中和目标以及全球碳盘点的现…

DP2.0和HDMI2.1的计算

一、HDMI 8K60Hz,需要带宽64Gbps HDMI2.1支持48Gbps,不足以支持8K60Hz 增加HDMI2.1 FRL(Fixed Rate Link)模式,实现接口带宽的增加,满足8Kp60Hz需要。同时需要结合相应的YCbCr 4:2: 0编码和视频压缩技术。 1、变更内…

Redis高级----主从、哨兵、分片、脑裂原理

目前已更新系列: 当前:Redis高级----主从、哨兵、分片的原理 计算机网络--面试知识总结一 计算机网络-----面试知识总结二 计算机网络--面试总结三(Http与Https) 计算机网络--面试总结四(HTTP、RPC、WebSocket、S…

Android 11 ,Android Studio 三方APP调用系统 system/lib 目录下so库使用过程中的BUG(坑)。

背景介绍:最近在做文件管理器,需要把图库的功能集成到文件管理器中,实现在文件管理器中打开图片、切换图片的功能。在实现gif图片打开功能的时候,需要用到系统现成的gifplayer so库,导入Android studio的时候遇到了一堆…

游戏发行技术体系之SDK技术体系

在上篇文章中提现过,SDK主要分为充值、登录、合规、数据、聚合和后台管理。 下面是针对SDK技术体系进行拆分 这个地方没有写账号,是因为我会账号独立出来,这块会在后面的账号技术体系单独规划。

爆改YOLOv8|利用分层特征融合策略MSBlock改进yolov8,暴力涨点

1,本文介绍 MSBlock 是一种分层特征融合策略,用于改进卷积神经网络中的特征融合效果。它通过分层次地融合不同尺度的特征图来提高网络的表达能力和性能。MSBlock 采用多尺度特征融合的方法,确保网络能够有效地捕捉不同层次和尺度的信息&…

FPGA实现HDMI传输(二)

之前的文章简单介绍了HDMI接口、TMDS编码以及ADV611工作原理和寄存器配置,本篇博客将给出具体的代码以及板级验证结果,代码参考自米联客的教程。 一.ADV7611配置 1.i2c驱动模块 timescale 1ns / 1psmodule uii2c# (parameter WMEN_LEN …

Git使用教程(小白也能看懂)

git的使用教程(学习和工作中都能用到) 1、所需工具 git bash 1)安装git bash 官网:https://git-scm.com/download/win 2)在文件夹空白处鼠标右键 若出现 上图说明安装成功 2、使用 1)我们想要克隆一…