如何计算密度直方图中的高度(它们的总和不等于 1)?

Posted

技术标签:

【中文标题】如何计算密度直方图中的高度(它们的总和不等于 1)?【英文标题】:How are the heights in a density histogram calculated (they don't sum up to 1)? 【发布时间】:2022-01-21 09:14:39 【问题描述】:

我想通过绘制 distplot 来可视化数据。

我有下面的python代码,但我不明白如何计算y轴

为什么x=2对应y=0.3,x=1对应y=0.6? 谁能帮我计算公式?

import seaborn as sns
l = [1,3,2,1,3]
sns.distplot(l, kde=True, bins=3)

【问题讨论】:

【参考方案1】:

probability density function (pdf in short) 仅对连续分布有意义,对离散分布没有意义,尤其是在只有几个值的情况下。

当值是离散的时,应避免bin边界与值重合,以避免边界处的值准任意落入一个bin或另一个。

如果设置bins=3,则计算4个边界,平均分布在最小和最大x之间,所以在1, 1.667, 2.33, 3。对于离散分布,这不是一个好的选择。更好的选择是0.5, 1.5, 2.5, 3.5。添加参数discrete=True会自动选择这些边界,但仅限于distplot的新版本,即histplot

如果您设置stat='density',直方图的总面积(或kde,是连续 pdf 的近似值)将为1。使用discrete=False ,垃圾箱是0.667 宽。要获得 1 的 面积,高度的总和应为 1/0.667=1.5 (sum(heights)*width = 1)。这个度量在这里没有多大意义(在 1 和 1.667 之间,概率为 0.6*0.667 等)。对于宽度为1 的箱子,高度应该与1 (sum(heights)*width = 1) 差不多。这里的高度表示每个值的比例(1的概率为0.4,2的概率为0.2)。

以下代码将stat='density'discrete=TrueFalse 进行比较。

import matplotlib.pyplot as plt
import seaborn as sns

l = [1, 3, 2, 1, 3]
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(10, 4))
sns.histplot(l, bins=3, discrete=False, stat='density', ax=ax1)
ax1.set_title('the default (discrete=False)')
sns.histplot(l, bins=3, discrete=True, stat='density', ax=ax2)
ax2.set_title('with discrete=True')

【讨论】:

【参考方案2】:

请注意seaborn.distplot 已弃用,请改用seaborn.displot(不带t)。

它会默认显示计数,而不是像您的问题中那样显示 密度

import seaborn as sns
l = [1,3,2,1,3]
sns.displot(l, kde=True, bins=3)

输出:

也就是说,如果你想拥有密度(意味着条形的总面积为 1),请添加 stat='density' 参数:

import seaborn as sns
l = [1,3,2,1,3]
sns.displot(l, kde=True, bins=3, stat="density")

【讨论】:

“也就是说,如果你想要密度(意味着所有条的总和为 1)”是错误的 - 条的 面积 将等于 1密度图。 (请注意,在您的示例中,总和约为 1.5)。 @mwaskom 你是对的,我这边的监督!

以上是关于如何计算密度直方图中的高度(它们的总和不等于 1)?的主要内容,如果未能解决你的问题,请参考以下文章

Seaborn 概率直方图 - KDE 归一化

绘制直方图,使直方图的总面积等于 1(密度)

绘制直方图,使条形高度总和为 1(概率)

MATLAB如何将概率密度向量绘制到直方图上?

如何在 matplotlib 直方图中选择 bin

估计python中均匀随机变量之和的概率密度