【机器学习】贝叶斯分类器

贝叶斯分类器是一种概率模型,利用贝叶斯公式来解决分类问题。假设样本的特征向量服从一定的概率分布,我们就可以计算出该特征向量属于各个类的条件概率。分类结果是条件概率最大的分类结果。如果假设特征向量的每个分量彼此独立,则它是朴素贝叶斯分类器。如果假设特征向量服从多维正态分布,则它是正态贝叶斯分类器。

一、原理:

贝叶斯公式(Bayes' theorem)

1511eae3339cfd43eca44271781c62db.png

6ecbb8a88db92656c835cc8218debaa1.png

贝叶斯决策

f9470a36834664b65406e7f04d365524.png

朴素贝叶斯分类器

35a8fa1dbd6dcc55321daa4a37764648.png

朴素贝叶斯分类器特征向量为离散型随机变量

419ba5664e16860a143852c269eb6015.png

拉普拉斯平滑

f89bcbb7ebcfa0395c3ff19bba052961.png

朴素贝叶斯分类器特征向量为连续型随机变量

645320053e7175db82bea7d19edc6e64.png

ln函数的性质

ec158b631946c39d706b90bda1ec283e.png

朴素贝叶斯分类器特征向量为连续型随机变量,对于二分类问题,正态贝叶斯分类器

66af620d9129007d8b12d7a3961883cf.png

6557f41e7964441337881c4277fdf19a.png

协方差朴素贝叶斯

ef220d285d4cfa7868a7c6c9caf27c98.png

协方差朴素贝叶斯的训练过程

20df7ef9e7ca5fc0e70c67f4e6784840.png

协方差朴素贝叶斯的预测算法

4b595ab45c18281a6e64d24862ea5213.png

二、示例程序:

Scikit-learn中提供了多种朴素贝叶斯分类器,其中包括高斯朴素贝叶斯(Gaussian Naive Bayes)分类器。然而,对于鸢尾花数据集,由于其特征是连续型的,因此通常使用的是高斯朴素贝叶斯分类器。

7d4bc01b41b721d8eb17a5429c7aa16d.png

以下是在Scikit-learn中使用高斯朴素贝叶斯分类器对鸢尾花数据集进行分类的示例:

# 导入必要的模块
import numpy as np # 导入NumPy库,并将其命名为np,这是一个用于科学计算的库,提供了多维数组和数学函数的支持
import matplotlib.pyplot as plt  # 导入Matplotlib库的pyplot模块,并将其命名为plt,用于创建静态、交互式和动画图表的绘图库。
from sklearn import datasets # 从Scikit-learn库中导入datasets模块,该模块包含了一些标准的数据集,包括机器学习领域常用的一些数据集
from sklearn.naive_bayes import GaussianNB # 从Scikit-learn库中导入朴素贝叶斯分类器的高斯朴素贝叶斯模型。
import matplotlib # 导入Matplotlib库,这是一个用于绘制图表的广泛使用的库。
%matplotlib inline  # 一个Jupyter Notebook魔术命令,用于在Notebook中嵌入Matplotlib图形,并在代码执行后直接在Notebook中显示图形


# 定义生成测试样本点的函数
def make_meshgrid(x, y, h=.02):
  # 计算x、y的最小值和最大值
  x_min, x_max = x.min() - 1, x.max() + 1
  y_min, y_max = y.min() - 1, y.max() + 1
  # 生成均匀网格
  xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
             np.arange(y_min, y_max, h))
  # 返回网格坐标
  return xx, yy


# 定义预测测试样本并显示的函数
def plot_test_results(ax, clf, xx, yy, **params):
  # 对测试样本进行预测  xx.ravel() 和 yy.ravel() 用于将二维的坐标网格
  # 矩阵展平为一维数组。这是因为 clf.predict() 方法接受一维数组形式的输入
  Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
  # 将预测结果转换为网格图像
  Z = Z.reshape(xx.shape)#返回坐标网格 xx 的形状,即一个包含行数和列数的元组。
  # 在网格图像上绘制等高线
  ax.contourf(xx, yy, Z, **params)


# 载入iris数据集
iris = datasets.load_iris()
# 只使用前面两个特征  即鸢尾花数据集的萼片长度和萼片宽度。
X = iris.data[:, :2]#选择所有行(即所有样本)和前两列的数据
# 样本标签值
y = iris.target


# 创建并训练正态朴素贝叶斯分类器
clf = GaussianNB()
clf.fit(X,y)


# 图形标题
title = ('GaussianBayesClassifier')


# 创建图形 fig 是整个图形对象,而 ax 是包含的子图对象 子图的大小为 (5, 5)
fig, ax = plt.subplots(figsize = (5, 5))
# 调整子图布局   0.4 表示子图之间的宽度/高度间距为整个子图宽度/高度的 0.4 倍
plt.subplots_adjust(wspace=0.4, hspace=0.4)


# 获取第0、1个特征的值
X0, X1 = X[:, 0], X[:, 1]


# 生成测试样本点
xx, yy = make_meshgrid(X0, X1)


# 显示测试样本的分类结果
plot_test_results(ax, clf, xx, yy, cmap=plt.cm.coolwarm, alpha=0.8)


#绘制散点图 显示训练样本
# X0 和 X1 分别是训练样本的前两个特征变量
# c=y 指定了散点的颜色,使用了目标标签 y 中的类别信息。不同的类别用不同的颜色表示。
# cmap=plt.cm.coolwarm 指定了颜色映射,用于将类别映射到具体的颜色。
# s=20 设置了散点的大小为 20。
#edgecolors='k' 设置了散点的边缘颜色为黑色 ('k' 表示黑色)。
ax.scatter(X0, X1, c=y, cmap=plt.cm.coolwarm, s=20, edgecolors='k')


# 设置图形属性
ax.set_xlim(xx.min(), xx.max())
ax.set_ylim(yy.min(), yy.max())
ax.set_xlabel('x1')
ax.set_ylabel('x2')
ax.set_xticks(())# 将 x 轴的刻度标签设为空
ax.set_yticks(())
ax.set_title(title)


# 显示图形
plt.show()

98bb6580331bc3018d756d68b4b7f007.png

三、贝叶斯分类器的应用

d48c83954bc0ef6dd27bebccfb10c258.png

参考网址:
https://programmer.group/principle-of-machine-learning-bayesian-classifier-and-its-sklearn-implementation.html Principle of machine learning Bayesian classifier and its sklearn implementation --- 机器学习贝叶斯分类器原理及其sklearn实现 (programmer.group)

https://zhuanlan.zhihu.com/p/25462307 OpenCV机器学习——朴素贝叶斯NBC - 知乎 (zhihu.com)

https://blog.csdn.net/qinzhongyuan/article/details/106434854 鸢尾花(Iris)数据集_iris数据集-CSDN博客

https://zhuanlan.zhihu.com/p/480326305 数据集 |鸢尾花数据集 - 知乎 (zhihu.com)

The End

猜你喜欢

转载自blog.csdn.net/cxyhjl/article/details/134522465