有人可以向我解释直方图中的“bins”是什么(matplotlib hist函数)?假设我需要绘制一些数据的概率密度函数,我选择的箱子如何影响那个?我该如何选择它们? (我已经在matplotlib.pyplot.hist和numpy.histogram图书馆中了解过它们,但我没有得到这个想法)
答案 0 :(得分:36)
bins
参数告诉您数据将被分成的区域数。您可以将其指定为整数或bin边缘列表。
例如,这里我们要20个箱子:
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(1000)
plt.hist(x, bins=20)
这里我们要求位置[-4,-3,-2 ... 3,4]处的bin边缘。
plt.hist(x, bins=range(-4, 5))
关于如何选择" best"的问题箱子的数量是一个有趣的,并且实际上有关于这个主题的相当广泛的文献。已经提出了一些常用的经验法则(例如Freedman-Diaconis Rule,Sturges' Rule, Scott's Rule, the Square-root rule等),每个都有自己的优点和缺点。
如果你想要一个很好的Python实现各种这些自动调整直方图规则,你可以在最新版本的AstroPy包described here中查看直方图功能。
这与plt.hist
类似,但允许您使用类似的语法,例如hist(x, bins='freedman')
通过上述Freedman-Diaconis规则选择垃圾箱。
我个人最喜欢的是"贝叶斯块" (bins="blocks"
),它解决了不等 bin宽度的最佳分箱。您可以在here上阅读更多内容。
编辑,2017年4月:使用matplotlib版本2.0或更高版本以及numpy版本1.11或更高版本,您现在可以直接在matplotlib中指定自动确定的bin,方法是指定,例如: bins='auto'
。这使用了Sturges和Freedman-Diaconis bin的最大选择。您可以在numpy.histogram
docs中了解有关这些选项的更多信息。
答案 1 :(得分:4)
Bins是您想要将所有数据划分为的间隔数,以便它可以在直方图上显示为条形。使用多少个分箱的简单方法是获取分布中值总数的平方根。
答案 2 :(得分:1)
您认为箱数对近似真实基础分布有重大影响,这是正确的。我自己没有读过原始论文,但根据Scott 1979,一个好的经验法则是使用:
R(N ^(1/3))/(3.49σ)
其中
R 是数据范围(在您的情况下 R = 3 - ( - 3)= 6 ),
n 是样本数量,
σ是您的标准偏差。
答案 3 :(得分:0)
要补充jakes answer,可以使用
numpy.histogram_bin_edges
,如果您只想计算最佳bin边缘,而无需实际执行直方图。 histogram_bin_edges
是专门为优化仓边计算而设计的功能。您可以选择七个不同的算法进行优化。