3

我对 matplotlib 的 hist() 函数有疑问。

我正在编写代码来绘制值从 0 到 1 不等的数据直方图。例如:

values = [0.21, 0.51, 0.41, 0.21, 0.81, 0.99]

bins = np.arange(0, 1.1, 0.1)
a, b, c = plt.hist(values, bins=bins, normed=0)
plt.show()

上面的代码生成了一个正确的直方图(我无法发布图像,因为我没有足够的声誉)。在频率方面,它看起来像:

[0 0 2 0 1 1 0 0 1 1]

我想将此输出转换为离散概率质量函数,即对于上面的示例,我想获得以下频率值:

[ 0.  0.  0.333333333  0.  0.166666667  0.166666667  0.  0.  0.166666667  0.166666667 ] # each item in the previous array divided by 6)

我想我只需要将 hist() 函数中的参数更改为“normed=1”。但是,我得到以下直方图频率:

[ 0.  0.  3.33333333  0.  1.66666667  1.66666667  0.  0.  1.66666667  1.66666667 ]

这不是我所期望的,我不知道如何获得总和应该为 1.0 的离散概率质量函数。在以下链接(链接到问题)中提出了类似的问题,但我认为问题没有得到解决。

我提前感谢您的帮助。

4

2 回答 2

7

原因是norm=True给出了概率密度函数。在概率论中,概率密度函数或连续随机变量的密度描述了该随机变量取给定值的相对可能性。

让我们考虑一个非常简单的例子。

x=np.arange(0.1,1.1,0.1)
array([ 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])

# Bin size
bins = np.arange(0.05, 1.15, 0.1)
np.histogram(x,bins=bins,normed=1)[0]
[ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.]
np.histogram(x,bins=bins,normed=0)[0]/float(len(x))
[ 0.1,  0.1,  0.1,  0.1,  0.1,  0.1,  0.1,  0.1,  0.1,  0.1]

# Change the bin size
bins = np.arange(0.05, 1.15, 0.2)
np.histogram(x,bins=bins,normed=1)[0]
[ 1.,  1.,  1.,  1.,  1.]
np.histogram(x,bins=bins,normed=0)[0]/float(len(x))
[ 0.2,  0.2,  0.2,  0.2,  0.2]

如上所示,x 位于[0.05-0.15]or[0.15-0.25]之间的概率,1/10而如果将 bin 大小更改为,0.2则它位于[0.05-0.25]or之间的[0.25-0.45]概率1/5。现在这些实际概率值取决于 bin 大小,但是,概率密度与 bin 大小无关。因此,这是执行上述操作的唯一正确方法,否则需要在每个图中说明 bin-width。

因此,在您的情况下,如果您真的想绘制每个箱的概率值(而不是概率密度),那么您可以简单地将每个直方图的频率除以总元素的数量。但是,我建议您不要这样做,除非您使用离散变量并且您的每个 bin 都代表该变量的单个可能值。

于 2012-08-01T08:15:43.087 回答
0

从直方图中绘制连续概率函数 (PDF) – 在 Python 中求解。有关详细说明,请参阅此博客。(http://howdoudoittheeasiestway.blogspot.com/2017/09/plotting-continuous-probability.html)否则您可以使用下面的代码。

n, bins, patches = plt.hist(A, 40, histtype='bar')
plt.show()
n = n/len(A)
n = np.append(n, 0)
mu = np.mean(n)
sigma = np.std(n)
plt.bar(bins,n, width=(bins[len(bins)-1]-bins[0])/40)
y1= (1/(sigma*np.sqrt(2*np.pi))*np.exp(-(bins - mu)**2 /(2*sigma**2)))*0.03
plt.plot(bins, y1, 'r--', linewidth=2)
plt.show()
于 2017-09-13T16:58:01.900 回答