朴素贝叶斯

朴素贝叶斯方法是一组基于贝叶斯定理的监督学习算法,其“朴素”假设是:给定类别变量的每一对特征之间条件独立。贝叶斯定理描述了如下关系:

给定类别变量\(y\)以及属性值向量\(x_1\)至\(x_n\):

\(P(y \mid x_1, \dots, x_n) = \frac{P(y) P(x_1, \dots x_n \mid y)}
{P(x_1, \dots, x_n)}\)

依据朴素条件独立假设可得:

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

对 \(i\) 进行遍历,上式可化为:

\(P(y \mid x_1, \dots, x_n) = \frac{P(y) \prod_{i=1}^{n} P(x_i \mid y)}
{P(x_1, \dots, x_n)}\)

由于输入的\(P(x_1, \dots, x_n)\)是给定的常数值,我们可以得到以下式子:

\(P(y \mid x_1, \dots, x_n) \propto P(y) \prod_{i=1}^{n} P(x_i \mid y)\)

\(\hat{y} = \arg\max_y P(y) \prod_{i=1}^{n} P(x_i \mid y)\)

然后我们可以极大化后验估计(MAP),来估计\(P(y)\) 和 \(P(x_i \mid y)\),前者就是训练集中类别\(y\)的相对频率。

不同的朴素贝叶斯分类器的区别主要在于它们对\(P(x_i \mid y)\)分布的假设不同。

尽管它们的假设显然过于简化,但naive Bayes分类器在许多实际情况下都能很好地工作,比如常见的文档分类和垃圾邮件过滤。

它们需要一些训练数据来估计必要的参数。

与其他更复杂的方法相比,朴素贝叶斯学习器和分类器执行速度非常快。类别条件特征分布的分解意味着每个分布都可以独立地作为一维分布进行估计。这反过来又有助于缓解组合爆炸的问题。

另一方面,尽管朴素贝叶斯被认为是一个不错的分类器,但它是一个糟糕的估计器,所以\(predict\_proba\)输出的概率并太靠谱。

1. 高斯朴素贝叶斯算法

\(GaussianNB\) 实现了高斯朴素贝叶斯分类算法。假设特征的似然为高斯分布:

\(P(x_i \mid y) = \frac{1}{\sqrt{2\pi\sigma^2_y}} \exp\left(-\frac{(x_i - \mu_y)^2}{2\sigma^2_y}\right)\)

参数\(\sigma_y\)和\(\mu_y\)采用极大似然估计。

以鸢尾花分类为例:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
gnb = GaussianNB()
y_pred = gnb.fit(X_train, y_train).predict(X_test)
print("Number of mislabeled points out of a total %d points : %d" % (X_test.shape[0], (y_test != y_pred).sum()))
Number of mislabeled points out of a total 75 points : 4

2. 多项式贝叶斯算法

\(MultinomialNB\)实现了对多项式分布数据的朴素贝叶斯算法,是文本分类中使用的两种经典的朴素贝叶斯变体之一(其中数据通常表示为词向量计数,虽然\(tf-idf\)向量在实践中也很有效)。

这个分布的每个类别\(y\)的参数向量为\(\theta_y = (\theta_{y1},\ldots,\theta_{yn})\),其中\(n\)是特征数量(在文本分类中是词典大小),\(\theta_{yi}\)是特征\(i\)在类别\(y\)的一个样本中出现的概率\(P(x_i \mid y)\)。

参数\(\theta_y\)由最大似然的平滑版本来估计,即相对频率计数:

\(\hat{\theta}_{yi} = \frac{ N_{yi} + \alpha}{N_y + \alpha n}\)

其中\(N_{yi} = \sum_{x \in T} x_i\)是训练集\(T\)上特征\(i\)在类别\(y\)的一个样本中出现的次数。\(N_{y} = \sum_{i=1}^{n} N_{yi}\)是类\(y\)的所有特征的总数。

平滑先验\(\alpha \ge 0\)让学习样本中不存在的特征占一定的比例,并防止在进一步的计算中出现零概率。

\(\alpha = 1\)时为拉普拉斯(Laplace)平滑,\(\alpha < 1\)时为李德斯通(Lidstone)平滑。

以鸢尾花分类为例:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import ComplementNB
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
cnb = ComplementNB()
y_pred = cnb.fit(X_train, y_train).predict(X_test)
print("Number of mislabeled points out of a total %d points : %d" % (X_test.shape[0], (y_test != y_pred).sum()))
Number of mislabeled points out of a total 75 points : 30

3. 伯努利贝叶斯算法

\(BernoulliNB\)是对按多元伯努利分布的数据,实现朴素贝叶斯训练和分类的算法,即,可能有多个特征,但每个特征都被假定为一个二元(伯努利,布尔)变量。因此,该类别要求样本用二值特征向量表示;如果传递任何其他类型的数据,\(BernoulliNB\)的实例可以对该输入进行二值化(取决于二值参数)。

基于贝叶斯的决策规则:

\(P(x_i \mid y) = P(i \mid y) x_i + (1 - P(i \mid y)) (1 - x_i)\)

它与多项式NB规则的不同之处在于,它显式地惩罚了类别\(y\)的指标特征\(i\)的不出现,而多项式贝叶斯变体将简单地忽略一个不出现的特征。

在文本分类的应用中,可以使用单词出现向量(而不是单词计数向量)来训练和使用这个分类器。BernoulliNB可能在某些数据集上表现得更好,特别是那些文档更短的数据集。如果时间允许,最好对两个模型都进行评估。

以鸢尾花分类为例:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import BernoulliNB
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
bnb = BernoulliNB()
y_pred = bnb.fit(X_train, y_train).predict(X_test)
print("Number of mislabeled points out of a total %d points : %d" % (X_test.shape[0], (y_test != y_pred).sum()))
Number of mislabeled points out of a total 75 points : 54

参考文档

scikit-learn 1.9.1, 1.9.2, 1.9.4 Gaussian/Multinomial/Complement Naive Bayes

【sklearn朴素贝叶斯算法】高斯分布/多项式/伯努利贝叶斯算法以及代码实例的更多相关文章

  1. 吴裕雄 python 机器学习——伯努利贝叶斯BernoulliNB模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets,naive_bayes from skl ...

  2. 概率图模型(PGM)学习笔记(四)-贝叶斯网络-伯努利贝叶斯-多项式贝叶斯

    之前忘记强调了一个重要差别:条件概率链式法则和贝叶斯网络链式法则的差别 条件概率链式法则 贝叶斯网络链式法则,如图1 图1 乍一看非常easy认为贝叶斯网络链式法则不就是大家曾经学的链式法则么,事实上 ...

  3. 概率图形模型(PGM)学习笔记(四)-贝叶斯网络-伯努利贝叶斯-贝叶斯多项式

    之前忘记强调重要的差异:链式法则的条件概率和贝叶斯网络的链式法则之间的差异 条件概率链式法则 P\left({D,I,G,S,L} \right) = P\left( D \right)P\left( ...

  4. 【概率论】5-2:伯努利和二项分布(The Bernoulli and Binomial Distributions)

    title: [概率论]5-2:伯努利和二项分布(The Bernoulli and Binomial Distributions) categories: - Mathematic - Probab ...

  5. 估计量|估计值|矩估计|最大似然估计|无偏性|无偏化|有效性|置信区间|枢轴量|似然函数|伯努利大数定理|t分布|单侧置信区间|抽样函数|

    第二章 置信区间估计 估计量和估计值的写法? 估计值希腊字母上边有一个hat 点估计中矩估计的原理? 用样本矩来估计总体矩,用样本矩的连续函数来估计总体矩的连续函数,这种估计法称为矩估计法.Eg:如果 ...

  6. 【智能算法】粒子群算法(Particle Swarm Optimization)超详细解析+入门代码实例讲解

    喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 算法起源 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由E ...

  7. 【优化算法】变邻域搜索算法解决0-1背包问题(Knapsack Problem)代码实例 已

    01 前言 经过小编这几天冒着挂科的风险,日日修炼,终于赶在考试周中又给大家更新了一篇干货文章.关于用变邻域搜索解决0-1背包问题的代码.怎样,大家有没有很感动? 02 什么是0-1背包问题? 0-1 ...

  8. 【笔记】sklearn中的SVM以及使用多项式特征以及核函数

    sklearn中的SVM以及使用多项式特征以及核函数 sklearn中的SVM的使用 SVM的理论部分 需要注意的是,使用SVM算法,和KNN算法一样,都是需要做数据标准化的处理才可以,因为不同尺度的 ...

  9. Java实现 蓝桥杯VIP 算法提高 多项式输出

    算法提高 多项式输出 时间限制:1.0s 内存限制:512.0MB 问题描述 一元n 次多项式可用如下的表达式表示: f(x)=a[n]xn+a[n-1]x(n-1)+-+a[1]x+a[0], a[ ...

随机推荐

  1. 使用自环接口的UDP服务器和客户端

    import argparse,socket from datetime import datetime MAX_BYTES = 65535 def server(port): sock = sock ...

  2. ps-如何移动照片里的内容

    1.我们用内容感知移动工具把所要移动的区域大致勾选出来. 2.然后我们将所选区域拖动(点击鼠标左键不放拖动). 3.松开鼠标 4.仿制图章工具,alt 键取样,涂抹

  3. HDU 6562 lovers 2018CCPC吉林H(线段树)

    题意: 初始n个空串,m个操作: 1.给[l,r]的所有字符串头尾加一个‘d’,将原字符串x变为dxd 2.求[l,r]所有字符串代表的数字之和mod 1e9+7 思路: 据说是硬核线段树.. 对于线 ...

  4. zip压缩包伪加密技术

    一个 ZIP 文件由三个部分组成: 压缩源文件数据区 + 压缩源文件目录区 + 压缩源文件目录结束标志 压缩源文件数据区: 50 4B 03 04:这是头文件标记(0x04034b50) 14 00: ...

  5. kali重置root密码

    像这样,kali系统的root密码忘记了,只需一分钟时间,快速重置root密码 第一步: 电脑开机后kali系统会进入引导界面,这是我们只需 “e” 进入启动前编辑命令(若系统没有出现这个页面,大家在 ...

  6. Python3(六) 面向对象

    一.类的定义 1. class Student():     name = ' ' #定义变量     age = 0     def print_file(self):     #定义函数      ...

  7. 关于ELF文件和BIN文件

    ELF文件执行过程 ELF文件有操作系统的加载器loader执行,比如linux,windows,对于3803处理器是grmon的load命令. 加载器会读取ELF文件program header,比 ...

  8. Nexus 安装

    Windows下安装Nexus OSS 3.12.1 1. Nexus 下载 到sonatype官网下载开源免费的OSS版本.OSS即为Open Source Software. 下载地址:https ...

  9. 在Unity中使用 luajit 64位加密

    参考:https://blog.csdn.net/sun19880421/article/details/68070696 https://blog.csdn.net/mydreamremindme/ ...

  10. css权重导致的样式不生效问题

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...