贝叶斯分类进阶

📑 用到的Python函数:

  • matplotlib.pyplot.contour3D():绘制三维等高线图
  • matplotlib.pyplot.contourf():绘制平面填充等高线
  • matplotlib.pyplot.fill_between():区域填充颜色
  • matplotlib.pyplot.plot_wireframe():绘制线框图
  • matplotlib.pyplot.scatter():绘制散点图
  • numpy.ones_like():用来生成和输入矩形形状相同的全1矩阵
  • numpy.outer():计算外积,张量积
  • numpy.vstack():返回竖直堆叠后的数组
  • scipy.stats.gaussian_kde():高斯核密度估计
  • statsmodels.api.nonparametric.KDEUnivariate():构造一元KDE

一、似然概率:给定分类条件下的概率密度

本文采用鸢尾花数据集进行分类预测分析,采用花萼长度、花萼宽度两个特征作为分析对象,其可抽象为如下数学表述:

为了估算\(f_{X1,X2|Y}(x_1,x_2|C_1)\),首先提取标签为\(C_1\)(Setosa)的\(50\)个样本,根据样本所在的具体位置利用高斯KDE估计\(f_{X1,X2|Y}(x_1,x_2|C_1)\)

图1为通过高斯KDE方法估算得到的似然概率PDF曲面\(f_{X1,X2|Y}(x_1,x_2|C_1)\)\(f_{X1,X2|Y}(x_1,x_2|C_1)\)和水平面包括的集合体积为1。标签为\(C_1\)的鸢尾花数据,花萼长度主要集中在4.5~5.5cm区域,花萼宽度集中在3~4cm区域。这个区域的\(f_{X1,X2|Y}(x_1,x_2|C_1)\)曲线高度最高,即可能性最大。

图1 似然概率PDF曲线

图2为似然概率\(f_{X1,X2|Y}(x_1,x_2|C_2)\)曲面。图3为似然概率\(f_{X1,X2|Y}(x_1,x_2|C_3)\)曲面。

(1)标准正态分布核密度函数、箱线图以及小提琴图的绘制

对于正态分布数据,下面定义一个函数用于绘制如下内容:

  • 带有内核密度曲线的正态分布直方图;
  • 箱线图;
  • 小提琴图
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams

#! 解决不显示的问题:中文设置为宋体格式
plt.rcParams['font.family'] = ["Times New Roman", 'SimSun']

rcParams['xtick.direction'] = 'in'
rcParams['ytick.direction'] = 'in'

# 绘制正态分布核密度函数、箱线图以及小提琴图的函数
def plot_comparison(x, title):
    fig, ax = plt.subplots(3, 1, figsize=(7, 5), sharex=True)

    sns.distplot(x, ax=ax[0])
    ax[0].set_title("Histogram + KDE", fontsize=12)
    ax[0].tick_params(axis="both", labelsize=11)
    # ax[0].yaxis.grid(True, zorder=-1)

    sns.boxplot(x, ax=ax[1])
    ax[1].set_title("Boxplot", fontsize=12)
    ax[1].set_ylabel("label", fontsize=12)
    # ax[1].xaxis.grid(True)

    sns.violinplot(x, ax=ax[2])
    ax[2].set_title("Violin plot", fontsize=12)
    ax[2].set_ylabel("label", fontsize=12)
    ax[2].tick_params(axis="both", labelsize=11)
    # ax[2].xaxis.grid(True)

    fig.suptitle(title, fontsize=14)
    plt.show()

# 函数的调用与图片绘制
N = 10 ** 4
sample_gaussian = np.random.normal(size=N)
plot_comparison(sample_gaussian, '标准正态分布')

由上图可以看出,小提琴图的核密度图与添加在直方图上的核密度图是一样的。小提琴图中较宽的部分代表观测值取值的概率较高,较窄的部分则对应于较低的概率。然而这在箱线图中是无法直观表示的,因此小提琴图比箱形图包含更多的数据分布信息。

注意💥:对于细节属性参数需要输入字典格式的数据,其设置方法可参考📖 python-matplotlib | 箱线图及解读 - 知乎

(2)函数返回值

vilinplot()函数的返回值为包含小提琴图相应组件的字典,每个字典元素以列表形式表示:

  • bodies:每个小提琴填分布充面积的PolyCollection实例对象;
  • cmeans:每个小提琴分布的均值的LineCollection实例对象;
  • cmins:小提琴分布下边界的LineCollection实例对象;
  • cmaxes:小提琴分布上边界的LineCollection实例对象;
  • cbars:小提琴分布的分为数线条的LineColletion实例对象;
  • cmedians:每个小提琴分布的中位数的LineCollection实例对象。
  • cquantiles:每个小提琴分位数的LineCollection实例对象。

注意💥:如果不启用小提琴图的相应元素,相应键值则返回空列表。

(3)示例

更为详细的内容可参考matplotlib官方手册📚:matplotlib.pyplot.violinplot — Matplotlib 3.7.2 documentation。这里选取matplotlib官网上一个具有代表性的小提琴图示例作为演示对象(参考🎨:Violin plot customization — Matplotlib 3.7.2 documentation)。在官网示例的基础上,本文添加了相关参数的使用方法并对代码进行注释,代码如下所示:


代码执行结果如下图所示

后续替换中文为宋体的图片

2.2 基于seaborn库的箱线图绘制

Seaborn是基于matplotlib的python数据可视化库。它提供了高层级的接口用于画出统计图。它与pandas库数据接口非常相近,可以直接使用pandas的数据结构。相比较于matplotlib的箱线图绘制,searborn绘制的更加美观。seaborn中绘制箱线图的函数为boxplot(),其函数原型如下所示:

seaborn.boxplot(data=None, *, x=None, y=None, hue=None, hue_order=None, orient=None, color=None, palette=None, saturation=0.75, width=0.8, dodge=True, fliersize=5, linewidth=None, whis=1.5, ax=None, **kwargs)

注意💥:
(1)虽然seaborn的boxplot()能以arraylist以及DataFrame。但是其更适合于对DataFrame格式的数据进行箱线图绘制。因此,在绘制箱线图之前,建议将数据转换为DataFrame格式。本文的介绍以DataFrame格式的数据为例
(2)由于seaborn是基于matplotlib的,因此我们可以直接调用matplotlib.boxplot的参数对箱线图进行设置。

防采坑💣:在使用df = sns.load_dataset("titanic")导入seaborn自带的数据时,由于网络原因会出现加载不了的问题。对此,可参考博文📖 解决seaborn数据无法导入的问题_无法解析导入 seaborn_ryo007gnnu的博客-CSDN博客进行排雷。

附录

博文鉴赏:

本文相关待扩展阅读

posted @ 2024-01-15 22:31  人工智能技术栈  阅读(14)  评论(0编辑  收藏  举报