微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Seaborn 概率直方图 - KDE 归一化

如何解决Seaborn 概率直方图 - KDE 归一化

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

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

以下是密度直方图的示例,认 KDE 归一化为 1。

enter image description here

但是,您也可以绘制具有计数概率统计数据的直方图。在这些之上绘制 KDE 将产生以下结果:

enter image description here

enter image description here

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

解决方法

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

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

对于计数图,直方图高度的总和将是给定数据的长度(每个数据项将恰好属于一个条形)。直方图的面积将是总高度乘以 bin 的宽度。 (当 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),**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,**kws)
axs[2].plot(x,kde(x) * total_area,color='dodgerblue')
axs[2].set_ylabel('count')

plt.tight_layout()
plt.show()

calculating seaborn histograms with kde

,

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

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

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

  • 通过计数估计,您会得到一个标准的 bin/count 分布,而 KDE 只是平滑数字,以便您可以估计值的分布 - 这样您就可以估计您的观察结果,如果您采取更多措施或使用更多垃圾箱。

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。