numpy.histogram_bin_edges#

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

用于仅计算 histogram 函数使用的直方图箱边缘的函数。

参数:
aarray_like

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

binsint 或标量序列或 str,可选

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

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

‘auto’

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

‘fd’(弗里德曼-迪亚科尼斯估计器)

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

‘doane’

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

‘scott’

不太鲁棒的估计器,它考虑了数据可变性和数据大小。

‘stone’

基于留一法交叉验证估计的积分平方误差的估计器。可以看作是斯科特规则的推广。

‘rice’

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

‘sturges’

R 的默认方法,只考虑数据大小。仅对高斯数据最优,并且对大型非高斯数据集会低估箱数。

‘sqrt’

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

range(float, float),可选

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

weightsarray_like,可选

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

返回:
bin_edgesdtype 为 float 的数组

要传递到 histogram 的边缘

另请参阅

histogram

注释

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

‘auto’('sturges' 和 'fd' 估计器的最小箱宽度)

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

‘fd’(弗里德曼-迪亚科尼斯估计器)
\[h = 2 \frac{IQR}{n^{1/3}}\]

箱宽度与四分位距 (IQR) 成比例,与 a.size 的立方根成反比。对于小型数据集可能过于保守,但对于大型数据集来说相当不错。IQR 对异常值非常鲁棒。

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

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

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

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

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

箱数是 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\]

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

此外,如果数据是整数类型,则箱宽度永远不会小于 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. ])

为了与直方图保持一致,一组预先计算的箱将被直接传递。

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

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

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