numpy.histogram_bin_edges#

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

此函数仅用于计算 histogram 函数所使用的 bin 边缘。

参数:
aarray_like

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

binsint 或标量序列 或 str,可选

如果 bins 是一个 int 值,它定义了给定范围内的等宽 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. ])

为了与 histogram 保持一致,预计算的 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])

这比为每个直方图使用单独的 bin 更容易比较结果

>>> 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.  ])