贝叶斯分类进阶
📑 用到的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()
能以array
、list
以及DataFrame
。但是其更适合于对DataFrame
格式的数据进行箱线图绘制。因此,在绘制箱线图之前,建议将数据转换为DataFrame
格式。本文的介绍以DataFrame
格式的数据为例。
(2)由于seaborn是基于matplotlib的,因此我们可以直接调用matplotlib.boxplot
的参数对箱线图进行设置。
防采坑💣:在使用
df = sns.load_dataset("titanic")
导入seaborn自带的数据时,由于网络原因会出现加载不了的问题。对此,可参考博文📖 解决seaborn数据无法导入的问题_无法解析导入 seaborn_ryo007gnnu的博客-CSDN博客进行排雷。
附录
博文鉴赏:
本文相关待扩展阅读
本文来自博客园,作者:人工智能技术栈,转载请注明原文链接:https://www.cnblogs.com/metafullstack/p/17966565