Matplotlib:如何直方图转换成离散概率密度函数?(Matplotlib: How to co

2019-07-30 17:54发布

我有一个关于与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()函数来改变参数以“范= 1”。 不过,我得到下面的柱状图频率:

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

这不是我所期望,我不知道如何让离散概率密度函数谁的总和应为1.0。 类似的问题被要求在以下链接( 链接问题 ),但我不认为这个问题得到了解决。

我很欣赏为您的帮助提前。

Answer 1:

原因是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][0.15-0.25]1/10 ,如果你改变块大小,以而0.2则概率,它会位于之间[0.05-0.25][0.25-0.45]1/5 。 现在,这些实际的概率值依赖于块大小,但是,概率密度是独立于垃圾箱的大小。 因此,这是上面做的唯一正确的方法,否则一个需要说明的Bin宽度在每个情节。

所以你的情况,如果你真的想绘制在每个容器(而不是概率密度)的概率值,那么你可以简单地通过总的元素个数将每个直方图的频率。 不过,我建议你不要这样做,除非你是离散变量工作,每个箱代表这个变量的一个可能值。



Answer 2:

从绘制的直方图的连续概率函数(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()


文章来源: Matplotlib: How to convert a histogram to a discrete probability mass function?