您将如何标准化直方图以使每个 bin 的总和为 1?

Posted

技术标签:

【中文标题】您将如何标准化直方图以使每个 bin 的总和为 1?【英文标题】:How would you normalize a histogram so the sum of each bin is 1? 【发布时间】:2011-07-15 06:33:25 【问题描述】:

你将如何标准化直方图 A,使每个 bin 的总和为 1

直方图除以bin的宽度,怎么画的

我有这个

dist        = rand(50)    
average     = mean(dist, 1);   
[c,x]       = hist(average, 15);    
normalized  = c/sum(c);
bar(x, normalized, 1)

在这种情况下,n = 50

获取值的公式是什么 均值和方差^2?我们写N(mean, (variance^2) / 50),但是怎么写? 如何绘制均匀分布和正态分布?。

直方图必须接近正态分布。

【问题讨论】:

【参考方案1】:

这是标准化概率密度函数的一种非常不寻常的方法。我假设您想要标准化,使曲线下的面积为 1。在这种情况下,您应该这样做。

[c,x]=hist(average,15);
normalized=c/trapz(x,c);
bar(x,normalized)

无论哪种方式,要回答您的问题,您都可以使用randn 生成正态分布。您现在正在生成一个50x50 均匀分布矩阵并沿一维求和以近似正态高斯。这是不必要的。要生成 1000 个点的正态分布,请使用randn(1000,1),或者如果您需要行向量,请将其转置或翻转数字。要生成均值mu 和方差sigma2 的高斯分布,并绘制其pdf,您可以执行(示例)

mu=2;
sigma2=3;
dist=sqrt(sigma2)*randn(1000,1)+mu;
[c,x]=hist(dist,50);
bar(x,c/trapz(x,c))

虽然这些可以通过统计工具箱中的专用功能来完成,但这同样简单明了,不需要额外的工具箱。

编辑

我错过了您想知道如何生成均匀分布的部分。 rand,默认情况下为您提供来自[0,1] 上均匀分布的随机变量。获得房车从[a, b] 之间的均匀分布,使用a+(b-a)*rand

【讨论】:

M.:想解释一下为什么你的标准化方法是正确的方法吗?在实际情况下the area under the curve is 1 尚不清楚为什么 OP 的c/sum(c) 不够。谢谢 概率密度函数的定义是曲线下面积为 1。在 OP 的情况下,发生的总数被归一化为 1,而不是面积。这和f/N 一样好,其中N 是向量中的元素数(在本例中为50)。当然,它是直方图,但不是密度。您可以在 MATLAB 中绘制两者并查看差异。同意,OP 从不要求密度,我的评论只是一个观察,与答案分开。 M.:密度如何? @darkcminor:密度就是我所展示的。直方图和密度之间的区别仅在于缩放。如果将其缩放到单位面积,则称为密度。 trapz 函数计算面积,您将直方图 bin 值除以面积。如果你重新计算面积,你会得到 1。

以上是关于您将如何标准化直方图以使每个 bin 的总和为 1?的主要内容,如果未能解决你的问题,请参考以下文章

将数组归一化以使总和为 1.0 的两种方法

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

直方图与bin

R语言ggplot2可视化:可视化堆叠的直方图在bin中的每个分组部分添加数值标签为堆叠直方图中的每个分组部分添加数值标签

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

直方图 Matplotlib