朴素贝叶斯

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

给定类别变量\(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. VC实现快递查询

    #include <iostream> #include <string> #include <cstdlib> #include <afxinet.h> ...

  2. Node——request使用代理

    本文知识点 Node环境搭建 使用代理 进阶学习 环境配置 Node 安装request 安装request npm install request 确认环境安装无误 node -v 代码样例 使用代 ...

  3. 关于使用详解ASP.NET State Service

    ASP.NET State Service服务如果启动可以解决这个问题,它会生成一个aspnet_state.exe进程,这个就是Session信息的进程.只要这个进程在,就算是重启了IIS,站点的S ...

  4. Codeforces_821

    A.直接判断每一个数. #include<bits/stdc++.h> using namespace std; ][]; int main() { ios::sync_with_stdi ...

  5. HDU_1506_单调栈

    http://acm.hdu.edu.cn/showproblem.php?pid=1506 从栈底到栈顶从小到大排序,碰到比栈定小的元素,出栈处理,直到栈顶比元素小或者栈为空. 数组最后多加了个-1 ...

  6. Go语言实现:【剑指offer】数组中出现次数超过一半的数字

    该题目来源于牛客网<剑指offer>专题. 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组 ...

  7. one-hot编码(pytorch实现)

    n = 5 #类别数 indices = torch.randint(0, n, size=(15,15)) #生成数组元素0~5的二维数组(15*15) one_hot = torch.nn.fun ...

  8. 3803 register initialization

    wim寄存器 window invalid mask,窗口无效屏蔽寄存器,如果某bit为1,则表示该窗口无效,不能使用. 初始化,设置%psr.CWP=0,即当前使用win0:设置wim=2,即只有w ...

  9. zabbix-mysql迁移分离

    io过高,迁移mysql 停掉zabbix 导出数据库的zabbix库 导入到新机器,并启动mysql 1:修改zabbix_server.conf文件里DB相关的地址,用户名和密码. vim /et ...

  10. [CentOS7]Yum 使用代理

    公司服务器只允许YUM出公网 # vi /etc/yum.conf # 添加下面一行 proxy=http://10.1.1.1:55555 # proxy ip:端口 END