ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-08-26 06:55:21  阅读:233  来源: 互联网

标签:python matplotlib histogram probability


我对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.在以下链接(link to the question)中提出了类似的问题,但我认为这个问题没有得到解决.

我提前感谢您的帮助.

解决方法:

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

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

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,而如果你将bin大小改为0.2那么它的概率介于[0.05]之间. -0.25]或[0.25-0.45]是1/5.现在这些实际概率值取决于箱尺寸,但是,概率密度与箱尺寸无关.因此,这是完成上述操作的唯一正确方法,否则需要在每个图中说明bin宽度.

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

标签:python,matplotlib,histogram,probability
来源: https://codeday.me/bug/20190826/1727609.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有