numpy.histogram_bin_edges#

numpy.histogram_bin_edges(a, bins=10, range=None, weights=None)[source]#

计算 histogram 函数使用的 bin 边界值的函数。

参数:
aarray_like

输入数据。直方图是根据扁平化的数组计算的。

binsint 或标量序列或 str,可选

如果 bins 是一个整数,它定义了给定范围内的等宽 bin 的数量(默认为 10)。如果 bins 是一个序列,它定义了 bin 边界,包括最右边的边界,允许非均匀 bin 宽度。

如果 bins 是以下列表中的字符串,histogram_bin_edges 将使用所选方法根据落在请求范围内的数据计算最佳 bin 宽度,并计算 bin 的数量(有关估计器的更多详细信息,请参阅“注释”部分)。虽然 bin 宽度将针对范围内的实际数据进行优化,但 bin 数量将被计算以填充整个范围,包括空的部分。对于可视化,建议使用“auto”选项。加权数据不支持自动 bin 大小选择。

‘auto’

“sturges”和“fd”估计器之间的最小 bin 宽度。提供良好的全方位性能。

‘fd’(Freedman Diaconis 估计器)

稳健的(对异常值具有弹性)估计器,它考虑了数据变异性和数据大小。

‘doane’

Sturges 估计器的改进版本,在非正态数据集上效果更好。

‘scott’

不太稳健的估计器,它考虑了数据变异性和数据大小。

‘stone’

基于留一法交叉验证估计的积分平方误差的估计器。可以被认为是 Scott 规则的推广。

‘rice’

估计器不考虑变异性,只考虑数据大小。通常会高估所需的 bin 数量。

‘sturges’

R 的默认方法,只考虑数据大小。仅适用于高斯数据,并且对于大型非高斯数据集会低估 bin 的数量。

‘sqrt’

平方根(数据大小)估计器,Excel 和其他程序因其速度和简单性而使用它。

range(float, float),可选

bin 的下限和上限范围。如果没有提供,范围只是 (a.min(), a.max())。范围外的值将被忽略。范围的第一个元素必须小于或等于第二个。 range 也影响自动 bin 计算。虽然 bin 宽度是根据 range 内的实际数据计算出的最佳值,但 bin 计数将填充整个范围,包括不包含数据的部分。

weightsarray_like,可选

权重数组,与 a 的形状相同。 a 中的每个值仅贡献其关联的权重到 bin 计数(而不是 1)。目前任何 bin 估计器都没有使用它,但将来可能会使用。

返回值:
bin_edgesdtype 为 float 的数组

传递给 histogram 的边界值

另请参阅

histogram

注释

估计最佳 bin 数量的方法在文献中得到了很好的论证,并受到了 R 提供的直方图可视化选择的启发。请注意,使 bin 数量与 \(n^{1/3}\) 成比例是渐近最优的,这就是它出现在大多数估计器中的原因。这些只是提供良好 bin 数量起点的插件方法。在下式中,\(h\) 是 bin 宽度,\(n_h\) 是 bin 的数量。所有计算 bin 计数的估计器都使用数据的 ptp 重新转换为 bin 宽度。最终的 bin 计数从 np.round(np.ceil(range / h)) 获得。最终的 bin 宽度通常小于下面估计器返回的值。

‘auto’(“sturges”和“fd”估计器的最小 bin 宽度)

一种获得良好值的折衷方案。对于小型数据集,通常会选择 Sturges 值,而较大的数据集通常默认为 FD。避免了 FD 和 Sturges 分别对于小型和大型数据集过于保守的行为。转换点通常为 \(a.size \approx 1000\)

‘fd’(Freedman Diaconis 估计器)
\[h = 2 \frac{IQR}{n^{1/3}}\]

bin 宽度与四分位数间距 (IQR) 成比例,与 a.size 的立方根成反比。对于小型数据集可能过于保守,但对于大型数据集相当好。IQR 对异常值非常稳健。

‘scott’
\[h = \sigma \sqrt[3]{\frac{24 \sqrt{\pi}}{n}}\]

bin 宽度与数据的标准差成比例,与 x.size 的立方根成反比。对于小型数据集可能过于保守,但对于大型数据集相当好。标准差对异常值不是很稳健。在没有异常值的情况下,值与 Freedman-Diaconis 估计器非常相似。

‘rice’
\[n_h = 2n^{1/3}\]

bin 的数量仅与 a.size 的立方根成比例。它往往会高估 bin 的数量,并且不考虑数据变异性。

‘sturges’
\[n_h = \log _{2}(n) + 1\]

bin 的数量是 a.size 的以 2 为底的对数。该估计器假设数据的正态性,对于较大、非正态的数据集过于保守。这是 R 的 hist 方法中的默认方法。

‘doane’
\[ \begin{align}\begin{aligned}n_h = 1 + \log_{2}(n) + \log_{2}\left(1 + \frac{|g_1|}{\sigma_{g_1}}\right)\\g_1 = mean\left[\left(\frac{x - \mu}{\sigma}\right)^3\right]\\\sigma_{g_1} = \sqrt{\frac{6(n - 2)}{(n + 1)(n + 3)}}\end{aligned}\end{align} \]

Sturges 公式的改进版本,可以为非正态数据集产生更好的估计值。该估计器试图解释数据的偏度。

‘sqrt’
\[n_h = \sqrt n\]

最简单、最快的估计器。只考虑数据大小。

此外,如果数据是整数 dtype,则 bin 宽度永远不会小于 1。

示例

>>> import numpy as np
>>> arr = np.array([0, 0, 0, 1, 2, 3, 3, 4, 5])
>>> np.histogram_bin_edges(arr, bins='auto', range=(0, 1))
array([0.  , 0.25, 0.5 , 0.75, 1.  ])
>>> np.histogram_bin_edges(arr, bins=2)
array([0. , 2.5, 5. ])

为了与直方图保持一致,预先计算的 bin 数组将直接通过而不会被修改

>>> np.histogram_bin_edges(arr, [1, 2])
array([1, 2])

此函数允许计算一组 bin,并在多个直方图中重复使用

>>> shared_bins = np.histogram_bin_edges(arr, bins='auto')
>>> shared_bins
array([0., 1., 2., 3., 4., 5.])
>>> group_id = np.array([0, 1, 1, 0, 1, 1, 0, 1, 1])
>>> hist_0, _ = np.histogram(arr[group_id == 0], bins=shared_bins)
>>> hist_1, _ = np.histogram(arr[group_id == 1], bins=shared_bins)
>>> hist_0; hist_1
array([1, 1, 0, 1, 0])
array([2, 0, 1, 1, 2])

这比对每个直方图使用单独的区间更容易得到可比较的结果。

>>> hist_0, bins_0 = np.histogram(arr[group_id == 0], bins='auto')
>>> hist_1, bins_1 = np.histogram(arr[group_id == 1], bins='auto')
>>> hist_0; hist_1
array([1, 1, 1])
array([2, 1, 1, 2])
>>> bins_0; bins_1
array([0., 1., 2., 3.])
array([0.  , 1.25, 2.5 , 3.75, 5.  ])