Seaborn 概率直方图 - KDE 归一化

Posted

技术标签:

【中文标题】Seaborn 概率直方图 - KDE 归一化【英文标题】:Seaborn probability histplot - KDE normalization 【发布时间】:2021-08-19 10:29:44 【问题描述】:

在默认统计数据(密度)和 KDE 标志设置为 True 的情况下绘制 histplot 时,曲线下的面积等于 1。来自 Seaborn 文档:

“密度轴上的单位是常见的混淆源。虽然核密度估计产生概率分布,但曲线在每个点的高度给出的是密度,而不是概率。概率只能通过积分获得范围内的密度。曲线被归一化,使得所有可能值的积分为 1,这意味着密度轴的比例取决于数据值。"

下面是 density 直方图的示例,默认 KDE 归一化为 1。

不过,您也可以用 countprobability 的形式绘制直方图。在这些之上绘制 KDE 将产生以下结果:

KDE 是如何标准化的?该面积当然不等于 1,但必须以某种方式归一化。我在文档中找不到这个,唯一的解释是关于为密度直方图绘制的 KDE。任何帮助在这里表示赞赏,谢谢!

【问题讨论】:

【参考方案1】:

嗯,kde 的面积是 1。要绘制与直方图匹配的 kde,需要将 kde 乘以直方图的面积。

对于密度图,直方图的面积为1,因此可以按原样使用kde。

对于计数图,直方图高度的总和将是给定数据的长度(每个数据项将恰好属于一个条形)。直方图的面积将是总高度乘以箱的宽度。 (当 bin 的宽度不相等时,调整 kde 会非常棘手)。

对于概率图,直方图高度的总和将为1(对于100 %)。总面积将是bin_width 乘以高度,因此等于bin_width

这里有一些代码来解释发生了什么。它使用标准的 matplotlib 条形图、numpy 来计算 kde 的直方图和 scipy:

import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde
import numpy as np

data = [115, 127, 128, 145, 160]
bin_values, bin_edges = np.histogram(data, bins=4)
bin_width = bin_edges[1] - bin_edges[0]
total_area = bin_width * len(data)

kde = gaussian_kde(data)
x = np.linspace(bin_edges[0], bin_edges[-1], 200)

fig, axs = plt.subplots(ncols=3, figsize=(14, 3))
kws = 'align': 'edge', 'color': 'dodgerblue', 'alpha': 0.4, 'edgecolor': 'white'
axs[0].bar(x=bin_edges[:-1], height=bin_values / total_area, width=bin_width, **kws)
axs[0].plot(x, kde(x), color='dodgerblue')
axs[0].set_ylabel('density')

axs[1].bar(x=bin_edges[:-1], height=bin_values / len(data), width=bin_width, **kws)
axs[1].plot(x, kde(x) * bin_width, color='dodgerblue')
axs[1].set_ylabel('probability')

axs[2].bar(x=bin_edges[:-1], height=bin_values, width=bin_width, **kws)
axs[2].plot(x, kde(x) * total_area, color='dodgerblue')
axs[2].set_ylabel('count')

plt.tight_layout()
plt.show()

【讨论】:

【参考方案2】:

据我了解,KDE(核密度估计)只是平滑由数据点形成的曲线。三种表示之间的变化是计算它的值:

使用密度估计,KDE 曲线下的总面积为 1 ;这意味着您可以通过积分计算来估计在两个边界值之间找到一个值的概率。我认为他们用曲线平滑数据点,计算曲线下的面积并将所有值除以面积,使曲线保持相同的外观,但面积变为 1。

使用概率估计,KDE曲线下的总面积无关紧要:每个类别都有一定的概率(例如P([115; 125]中的x)= 0.2)并且每个类别的概率之和相等为 1。因此,他们不会计算 KDE 曲线下的面积,而是计算所有样本并将每个 bin 的计数除以总数。

通过计数估计,您可以获得标准的 bin/count 分布,而 KDE 只是对数字进行平滑处理,以便您可以估计值的分布 - 这样您就可以估计如果您采取更多措施,您的观察结果可能会是什么样子或使用更多垃圾箱。

总而言之,KDE 曲线保持不变:它是样本数据分布的平滑。但是有一个因素会根据您感兴趣的数据表示形式应用于样本值。

但是,请对我所写的内容持保留态度:从数学的角度来看,我认为我离真相不远,但也许有人可以用更精确的术语来解释它 - 或者如果我纠正我'我错了。

这里是一些关于核密度估计的读物:https://en.wikipedia.org/wiki/Kernel_density_estimation;但简而言之,这是一种平滑方法,具有一些特殊的数学属性,具体取决于所使用的参数。

【讨论】:

以上是关于Seaborn 概率直方图 - KDE 归一化的主要内容,如果未能解决你的问题,请参考以下文章

R语言plotly可视化:plotly可视化归一化的直方图(historgram)并在直方图中添加密度曲线kde并在直方图的底部边缘使用geom_rug函数添加边缘轴须图

R语言plotly可视化:可视化多个数据集归一化直方图(historgram)并在直方图中添加密度曲线kde设置不同的直方图使用不同的分箱大小(bin size)在直方图的底部边缘添加边缘轴须图

「深度学习一遍过」必修12:激活函数池化归一化泛化正则化

[Python] 数组归一化

如何求取一个的图像的归一化直方图?

matlab中直方图归一化问题