numpy.histogram_bin_edges#
- numpy.histogram_bin_edges(a, bins=10, range=None, weights=None)[source]#
计算
histogram函数所用 bin 的边缘的函数。- 参数:
- a类数组对象
输入数据。直方图在展平后的数组上计算。
- binsint 或 scalar 序列或 str,可选
如果 bins 是一个整数,它定义了给定范围内的等宽 bin 的数量(默认值为 10)。如果 bins 是一个序列,它定义了 bin 的边缘,包括最右边的边缘,允许非均匀 bin 宽度。
如果 bins 是下面列表中的一个字符串,
histogram_bin_edges将使用所选方法来计算最佳 bin 宽度,并因此计算落在请求范围内的 bin 的数量(有关估计器的更多详细信息,请参阅“注释”部分)。虽然 bin 宽度对于范围内的实际数据是最优的,但 bin 的数量将计算为填充整个范围,包括空部分。为了可视化,建议使用“auto”选项。加权数据不支持自动 bin 大小选择。- ‘auto’
‘sturges’ 和 ‘fd’ 估计器之间的最小 bin 宽度。提供良好的通用性能。
- ‘fd’ (Freedman Diaconis Estimator)
鲁棒(对异常值有弹性)的估计器,它考虑了数据变异性和数据大小。
- ‘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, optional
一个权重数组,形状与 a 相同。 a 中的每个值仅贡献其关联的权重来计算 bin 数量(而不是 1)。目前没有任何 bin 估计器使用此参数,但将来可能会使用。
- 返回:
- bin_edgesdtype 为 float 的 array
传递给
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 Estimator)
- \[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\]
最简单、最快的估计器。仅考虑数据大小。
此外,如果数据是整数类型,则 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. ])