前言

在介绍贝叶斯之前,我们先了解一下几个概率相关的定义:

  1. 条件概率(后验概率):事件A在另一个事件B已经发生的条件下发生概率,公式表示为P(A|B),读作“在B条件下A的概率”。
    P ( A ∣ B ) = P ( A ∩ B ) P ( B ) P(A|B)=\frac{P(A \cap B)}{P(B)} P(AB)=P(B)P(AB)
  2. 联合概率:表示两个事件同时发生的概率, P(AB)。
  3. 边缘概率(先验概率):是某个事件发生的概率, P(A)或P(B)。

贝叶斯定理公式

P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A|B)=\frac{P(B|A)P(A)}{P(B)} P(AB)=P(B)P(BA)P(A)


一、贝叶斯决策论(Bayesian decision theory)

对于分类任务来说,在所有相关概率都已知的理想情形下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。

基于后验概率 P ( c i ∣ x ) P(c_i|x) P(cix)可获得将样本 x x x分类为 c i c_i ci所产生的期望损失(expected loss),即在样本 x x x上的“条件风险”(conditional risk)。
R ( c i ∣ x ) = ∑ j = 1 N λ i j P ( c j ∣ x ) R(c_i|x)=\sum_{j=1}^N \lambda_{ij} P(c_j|x) R(cix)=j=1NλijP(cjx)
决策论中将“期望损失”称为“风险risk”。 λ i j \lambda_{ij} λij为误判损失。

贝叶斯判定准则(Bayes decision rule):为最小化总体风险,只需在每个样本上选择那个能使条件风险 R ( c ∣ x ) R(c|x) R(cx)最小的类别标记,即
h ∗ ( x ) = a r g   m i n c ∈ y R ( c ∣ x ) h^*(x)=\underset{c \in y} {arg \, min} R(c|x) h(x)=cyargminR(cx)
此时, h ∗ h^* h称为贝叶斯最优分类器(Bayes optimal classifier),与之对应的总体风险 R ( h ∗ ) R(h^*) R(h)称为贝叶斯风险(Bayes risk)。

使用贝叶斯判断最小化决策风险,主要有两个策略:
(1)“判别式模型”(discriminative models);
(2)“生成式模型”(generative models)。

基于贝叶斯定理,则
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 ( 类 别 ∣ 样 本 ) = P ( 样 本 ∣ 类 别 ) P ( 类 别 ) P ( 样 本 ) P(类别|样本)=\frac{P(样本|类别)P(类别)}{P(样本)} P()=P()P()P()
其中, P ( c ) P(c) P(c)是类先验概率; P ( x ∣ c ) P(x|c) P(xc)是样本 x x x相对于类标记c的类条件概率(class-conditional probability)或似然(likelihood); P ( x ) P(x) P(x)是用于归一化的证据因子(evidence factor)。

根据数据采样来估计概率分布参数的经典方法:
极大似然估计法(Maximum Likelihood Estimation, MLE),一种给定观察数据来评估模型参数的方法。利用已知的样本结果信息,反推最具有可能(最大概率)导致这些样本结果出现的模型参数值。

对于 p ( x ∣ θ ) p(x|\theta) p(xθ) x x x表示样本数据, θ \theta θ表示模型参数。
如果 θ \theta θ是已知的, x x x是变量,则该函数称为概率函数(probability function)
如果 x x x是已知的, θ \theta θ是变量,则该函数称为似然函数(likelihood function)
D = { x 1 , x 2 , . . . , x N } D= \lbrace x_1,x_2,...,x_N \rbrace D={x1,x2,...,xN},则参数 θ \theta θ对数据集D的似然:
p ( D ∣ θ ) = ∏ i = 1 N p ( x i ∣ θ ) p(D|\theta)=\prod_{i=1}^N p(x_i|\theta) p(Dθ)=i=1Np(xiθ)
θ \theta θ进行极大似然估计,就是去寻找能最大化似然 p ( x ∣ θ ) p(x|\theta) p(xθ)的参数值 θ ^ \hat{\theta} θ^
对数似然(log-likelihood)函数,用来缓解“下溢”问题:
L L ( θ ) = l o g   p ( D ∣ θ ) = ∑ i = 1 N l o g    p ( x ∣ θ ) LL(\theta)=log\ p(D|\theta) = \sum_{i=1}^N log \; p(x| \theta) LL(θ)=log p(Dθ)=i=1Nlogp(xθ)
则参数 θ \theta θ极大似然估计值 θ ^ \hat{\theta} θ^为:
θ ^ = a r g   m a x θ    L L ( θ ) \hat{\theta} = \underset{\theta} {arg\ max} \; LL(\theta) θ^=θarg maxLL(θ)

二、实例:高斯朴素贝叶斯 Gaussian Naive Bayes (GaussianNB)

在 sklearn 库中,基于贝叶斯定理的算法集中在 sklearn.naive_bayes 包中,根据对“似然度”计算方法的不同,将朴素贝叶斯大致分为三种:多项式朴素贝叶斯(MultinomialNB)、伯努利分布朴素贝叶斯(BernoulliNB)、高斯朴素贝叶斯(GaussianNB)。值得注意的是,朴素贝叶斯算法的实现是基于假设而来,在朴素贝叶斯看来,特征之间是相互独立、互不影响的。

高斯朴素贝叶斯适用于特征呈正态分布的,多项式贝叶斯适用于特征是多项式分布的,伯努利贝叶斯适用于二项分布。

class sklearn.naive_bayes.GaussianNB(*, priors=None, var_smoothing=1e-09)[source]
  • priors:类的先验概率
  • var_smoothing:为维持计算的稳定性,将所有特征中最大方差的部分添加到估计的方差中。(1e-09为默认值)

1.引入库

代码如下(示例):

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
# Seaborn提供了许多定制的主题和用于控制matplotlib图形外观的高级界面

from sklearn.datasets import make_blobs  # 产生聚类数据集
from sklearn.naive_bayes import GaussianNB  # 导入高斯朴素贝叶斯模型

2.生成数据

代码如下(示例):

# 生成随机数据(X数据向量)
X,y = make_blobs(n_samples=100, n_features=2, centers=2, random_state=2, cluster_std=1.5)
# make_blobs:为聚类产生数据集
# n_samples:样本点数,n_features:数据的维度,centers:产生数据的中心点,默认值3
# cluster_std:数据集的标准差,浮点数或者浮点数序列,默认值1.0,random_state:随机种子
plt.scatter(X[:,0], X[:,1], c=y, s=50, cmap='RdBu') # s=size; c=color
plt.show()

结果如下:
在这里插入图片描述

3.高斯朴素贝叶斯模型

代码如下(示例):

# 高斯朴素贝叶斯 Gaussian naive bayes,适用于特征呈正态分布的情况
model = GaussianNB()  # 定义模型
model.fit(X,y)  # 训练模型
rng = np.random.RandomState(0)  # 一个伪随机数生成器。伪随机数是用确定性的算法计算出来的似来自[0,1]均匀分布的随机数序列。
X_test = [-6, -14] + [14, 18] * rng.rand(2000, 2)  # 测试向量集X
y_pred = model.predict(X_test)  # 模型预测的分类标签
plt.scatter(X[:,0], X[:,1], c=y, s=50, cmap='RdBu')
lim = plt.axis()  # 设置坐标轴
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred, s=20, cmap='RdBu', alpha=0.1)  # 有透明度的散点图
plt.axis(lim)
plt.show()

# 预测模型概率
# predict_proba()函数 返回的是对于预测为各个类别的概率
yprob = model.predict_proba(X_test)
prob = yprob[-8:].round(2)
print(prob)

结果如下:在这里插入图片描述


总结

具体可以参考以下内容:
高斯朴素贝叶斯原理与实现
通俗理解贝叶斯定理
机器学习——贝叶斯算法
机器学习——极大似然估计
《机器学习》- 周志华

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐