Matplotlib:如何将直方图转换为离散概率质量函数?

Kot*_*aro 3 python probability matplotlib histogram

我对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()
Run Code Online (Sandbox Code Playgroud)

上面的代码生成一个正确的直方图(由于我没有足够的声誉,我无法发布图像).就频率而言,它看起来像:

[0 0 2 0 1 1 0 0 1 1]
Run Code Online (Sandbox Code Playgroud)

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

[ 0.  0.  0.333333333  0.  0.166666667  0.166666667  0.  0.  0.166666667  0.166666667 ] # each item in the previous array divided by 6)
Run Code Online (Sandbox Code Playgroud)

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

[ 0.  0.  3.33333333  0.  1.66666667  1.66666667  0.  0.  1.66666667  1.66666667 ]
Run Code Online (Sandbox Code Playgroud)

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

我提前感谢您的帮助.

ims*_*msc 6

原因是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]
Run Code Online (Sandbox Code Playgroud)

正如,你可以在上面看到的,概率x将与说谎[0.05-0.15]或者[0.15-0.25]1/10而如果您更改窗口尺寸来0.2那么的概率将之间说谎[0.05-0.25]或者[0.25-0.45]1/5.现在,这些实际概率值取决于箱尺寸,但是,概率密度与箱尺寸无关.因此,这是完成上述操作的唯一正确方法,否则需要在每个图中说明bin宽度.

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