机器学习——朴素贝叶斯分类器及sklearn实现

2023-10-31

前言:参考《机器学习》,简单介绍朴素贝叶斯分类器

机器学习专栏机器学习专栏

一、贝叶斯定理

贝叶斯定理(Bayes’ theorem)是概率论中的一个定理,描述在已知一些条件下,某事件的发生概率。

  1. 条件概率公式: P ( B ∣ A ) = P ( A , B ) P ( B ) P(B|A)=\frac {P(A,B)}{P(B)} P(BA)=P(B)P(A,B)
  2. 贝叶斯公式: P ( A ∣ B ) = P ( A , B ) P ( B ) = P ( B ∣ A ) ⋅ P ( A ) P ( B ) P(A|B)=\frac{P(A,B)}{P(B)}=\frac {P(B|A)·P(A)}{P(B)} P(AB)=P(B)P(A,B)=P(B)P(BA)P(A)

其中,

  • P(A)是A的先验概率或边缘概率,它不考虑任何B方面的因素;
  • P(A|B)是已知B发生后A的条件概率,也由于得自B的取值而被称作A的后验概率;
  • P(B|A)是已知A发生后B的条件概率,也由于得自A的取值而被称作B的后验概率;
  • P(B)是B的先验概率或边缘概率,也作标准化常量(normalized constant)。

二、贝叶斯分类法

现给定数据集 D = ( ( x ( 1 ) , y ( i ) ) , ( x ( 2 ) , y ( 2 ) ) , . . . , ( x ( m ) , y ( m ) ) ) D={((x^{(1)},y^{(i)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)}))} D=((x(1),y(i)),(x(2),y(2)),...,(x(m),y(m))),假设有K种可能的类别标记, C = { c 1 , c 2 , . . . , c K } C=\{c_1,c_2,...,c_K\} C={c1,c2,...,cK},则 , y ( i ) ∈ { c 1 , c 2 , . . . , c k } ,y^{(i)}\in\{c_1,c_2,...,c_k\} ,y(i){c1,c2,...,ck}

贝叶斯分类的实质就是:给定一个样本 x ( i ) x^{(i)} x(i),其属于类别k的概率为: P ( c k ∣ x ( i ) ) P(c_k|x^{(i)}) P(ckx(i)),贝叶斯分类的分类结果就是条件概率 P ( c ∣ x ( i ) ) P(c|x^{(i)}) P(cx(i))(或者称为似然)最大的那个类别,即:
a r g    m a x c k ∈ C    P ( c k ∣ x ( i ) ) \mathop{arg\;max}\limits_{c_k\in C}\;P(c_k|x^{(i)}) ckCargmaxP(ckx(i))
我们将我们前面介绍的贝叶斯公式换成符合数据集D的形式:
P ( c ∣ x ) = P ( x ∣ c ) ⋅ P ( c ) P ( x ) P(c|x)=\frac {P(x|c)·P(c)}{P(x)} P(cx)=P(x)P(xc)P(c)
给定数据集的情况下,我们利用大数定律就可以确定 P ( c ) P(c) P(c),对于确定的样本 x x x x = [ x 1 , x 2 , . . . , x n ] x=[x_1,x_2,...,x_n] x=[x1,x2,...,xn])n为属性个数,对所有类别来说 P ( x ) P(x) P(x)也是确定的。
假设各个属性相互独立(这就是“朴素”),则:
P ( x ∣ c ) = ∏ j = 1 n P ( x j ∣ c ) P(x|c)=\prod_{j=1}^{n}P(x_j|c) P(xc)=j=1nP(xjc)

基于上面所述的贝叶斯判定准则,可以得出朴素贝叶斯分类器的表达式为:
h n b ( x ) = a r g    m a x c ∈ C    P ( c ) ∏ j = 1 n P ( x j ∣ c ) h_{nb}(x)=\mathop{arg\;max}\limits_{c\in C}\;P(c)\prod_{j=1}^{n}P(x_j|c) hnb(x)=cCargmaxP(c)j=1nP(xjc)

  1. 对离散属性,令 D c , x i D_{c,x_i} Dc,xi表示 D c D_c Dc中在第j个属性上取值为 x j x_j xj的样本组成的集合,则:
    P ( x j ∣ c ) = ∣ D c , x i ∣ ∣ D c ∣ P(x_j|c)=\frac{|D_{c,x_i}|}{|D_c|} P(xjc)=DcDc,xi
  2. 对连续属性可使用概率密度函数,假定 p ( x j ∣ c ) ∼ N ( μ c , j , δ c , i 2 ) p(x_j|c)\sim N(\mu_{c,j},\delta^2_{c,i}) p(xjc)N(μc,j,δc,i2),其中 μ c , j , δ c , i 2 \mu_{c,j},\delta^2_{c,i} μc,j,δc,i2分别表示第c类样本在第i个属性上取值的均值和方差,则:
    p ( x i ∣ c ) = 1 2 π δ c , i e x p ( − ( x i − μ c , i ) 2 2 δ c , i 2 ) p(x_i|c)=\frac{1}{\sqrt {2\pi}\delta_{c,i}}exp(-\frac{(x_i-\mu_{c,i})^2}{2\delta^2_{c,i}}) p(xic)=2π δc,i1exp(2δc,i2(xiμc,i)2)

明显可以看出朴素贝叶斯分类器更适用于离散属性,所以我们也可以考虑连续离散化处理的方法。

三、sklearn实现贝叶斯分类

# -*- coding:utf-8 -*-
"""
@author: 1
@file: bayes.py
@time: 2019/11/30 1:25
"""

from sklearn.naive_bayes import GaussianNB
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

df = pd.read_csv(r'D:\workspace\python\machine learning\data\iris.csv')
X = df.iloc[:, 0:3]
Y = df.iloc[:, 4]
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)
# 属性假设为高斯分布
gnb = GaussianNB()
model = gnb.fit(x_train, y_train)
y_pred = model.predict(x_test)
print('accuracy_score:', accuracy_score(y_test, y_pred))

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习——朴素贝叶斯分类器及sklearn实现 的相关文章

  • 强化学习 gridworld P77 模拟

    import numpy as numpy from tabulate import tabulate class State class for each unit on the game def init self id if id 0
  • 实体-联系模型

    实体 联系 Entity Relationship E R 模型 以下简称E R模型 的提出旨在方便数据库的设计 它是通过允许定义代表数据全局逻辑结构的企业模式实现的 E R模型采用三个基本概念 实体集 联系集和属性 实体集 实体 enti
  • VirtualBox虚拟机 Ubuntu分辨率太小的解决方案

    转自 http blog csdn net xubinlxb article details 18092297 今天用VirtualBox成功装上Ubuntu10 04之后发现了一个问题 默认情况下 ubuntu 的分辨率最高只能设到800
  • vba中颜色代码

    更详细的可以看 VBA颜色代码 经典颜色收藏版打印版 豆丁网
  • 测试人员与开发人员的比例究竟多少是合理的?

    在一些软件大会上 人们常常会问这样一个问题 测试人员与开发人员的比例究竟多少是合理的 而这样的问题 很难直接给出一个答案 为什么会有这样的问题 可能来自于两方面的压力 许多公司领导总是希望得到一个合理的比例 然后按这个比例分配招聘的名额 或
  • IDEA中创建Java Web项目方法2

    以下过程使用IntelliJ IDEA 2021 3 一 创建Maven项目 1 File gt New gt Projects 2 选择Maven 点击Next 3 输入项目名称 Name WebDemo3 点击 Finish 生成新的项
  • python中的__doc__,__name__

    模块的name 每个模块都有一个名称 在模块中可以通过语句来找出模块的名称 这在一个场合特别有用 就如前面所提到的 当一个模块被第一次输入的时候 这个模块的主块将被运行 假如我们只想在程序本身被使用的时候运行主块 而在它被别的模块输入的时候
  • 雅克比(Jacobi)方法

    转载 https www cnblogs com ytxwzqin p 9853781 html 雅克比 Jacobi 方法 可以用来求解协方差矩阵的特征值和特征向量 雅可比方法 Jacobian method 求全积分的一种方法 把拉格朗
  • DTO 的替代品

    点击 终码一生 关注 置顶公众号 每日技术干货 第一时间送达 数据传输对象是在进程之间承载数据的对象 使用它的动机是进程之间的通信通常通过远程接口完成 其中每次调用都是昂贵的操作 由于每次调用的大部分成本都与客户端和服务器之间的往返时间有关
  • I/Q信号

    当前的数字射频芯片 无一例外的用到了I Q信号 就算是RFID芯片 内部也用到了I Q信号 然而绝大部分射频人员 对于IQ的了解除了名字之外 基本上一无所知 I Q信号一般是模拟的 也有数字的比如方波 基带内处理的一般是数字信号 在出口处都
  • centos 普通用户操作 supervisor 报错

    当我们在centos系统中使用普通用户操作supervisor时 可能会有以下权限问题 error
  • vue---el-upload使用FormData多文件同时上传

    需求描述 使用el upload 手动上传方式进行文件上传 https element eleme cn zh CN component upload 当选择上传多个文件时 选择几个文件就会向后台发送几次请求 先后台要求同时一次请求发送多个
  • 基于LUT查找表方法的图像gamma校正算法FPGA实现,包括tb测试文件和MATLAB辅助验证

    目录 1 算法运行效果图预览 2 算法运行软件版本 3 部分核心程序 4 算法理论概述 5 算法完整程序工程 1 算法运行效果图预览 将gamma 2 2和gamma 1 2 2的数据分别导入到matlab进行对比 2 算法运行软件版本 m
  • 华为OD机试真题- 不含101的数【2023Q2】【JAVA、Python、C++】

    题目描述 小明在学习二进制时 发现了一类不含101的数 也就是 将数字用二进制表示 不能出现101 现在给定一个正整数区间 请问这个区间内包含了多少个不含101的数 输入描述 输入的唯一一行包含两个正整数 输出描述 输出的唯一一行包含一个整
  • 树莓派教程 - 1.1 树莓派GPIO库wiringPi 硬件PWM可调频率

    Git例程源码仓库 https github com ZhiliangMa raspberry git 使用到的硬件 led 200 左右的电阻 杜邦线 上一节使用最基本的 GPIO数字输出 led亮了 可如果想要调整led亮度怎么办 PW
  • 【C/C++面试必备

    作者 Linux猿 简介 CSDN博客专家 华为云享专家 Linux C C 云计算 物联网 面试 刷题 算法尽管咨询我 关注我 有问题私聊 关注专栏 数据结构和算法成神路 精讲 优质好文持续更新中 欢迎小伙伴们点赞 收藏 留言 一个由 c
  • 【快速部署一个k8s单节点】

    1 初始化脚本 bin bash swapoff a sed i r swap s etc fstab systemctl stop firewalld service systemctl disable firewalld service

随机推荐