numpy.histogram_bin_edges#
- numpy.histogram_bin_edges(a, bins=10, range=None, weights=None)[源代码]#
计算
histogram
函数使用的箱子的边缘的函数.- 参数:
- aarray_like
输入数据.直方图是基于展平数组计算的.
- bins整数或标量序列或字符串,可选
如果 bins 是一个整数,它定义了给定范围内等宽的箱数(默认是10).如果 bins 是一个序列,它定义了箱边缘,包括最右边的边缘,允许非均匀的箱宽度.
如果 bins 是以下列表中的一个字符串,`histogram_bin_edges` 将使用所选方法计算最佳的箱宽,并因此计算出箱的数量(详见备注部分对估计器的更多细节),从落在请求范围内的数据中.虽然箱宽对于范围内的实际数据将是最佳的,但箱的数量将被计算以填充整个范围,包括空的部分.对于可视化,建议使用 ‘auto’ 选项.不支持加权数据的自动箱大小选择.
- ‘auto’
在 ‘sturges’ 和 ‘fd’ 估计器之间的最小箱宽.提供了良好的全方位性能.
- ‘fd’ (Freedman Diaconis 估计器)
鲁棒(对异常值有弹性)估计器,考虑了数据变异性和数据大小.
- ‘doane’
一个改进版的 Sturges 估计器,对非正态数据集效果更好.
- ‘scott’
考虑到数据变异性和数据大小的较不稳健的估计量.
- ‘stone’
基于留一交叉验证估计的积分平方误差的估计器.可以视为斯科特规则的推广.
- ‘米饭’
估计器不考虑变异性,只考虑数据大小.通常会高估所需的箱数.
- ‘sturges’
R 的默认方法仅考虑数据大小.仅对高斯数据最优,并且低估了大型非高斯数据集的箱数.
- ‘sqrt’
平方根(数据大小)估计器,Excel 和其他程序因其速度和简单性而使用.
- range(浮点数,浮点数),可选
箱的下限和上限范围.如果没有提供,范围仅仅是
(a.min(), a.max())
.范围外的值被忽略.范围的第一个元素必须小于或等于第二个.`range` 也会影响自动箱计算.虽然箱宽是基于 range 内的实际数据计算为最佳,但箱数将填充整个范围,包括不包含数据的部分.- weightsarray_like, 可选
一个权重数组,形状与 a 相同.`a` 中的每个值仅将其相关权重贡献给箱计数(而不是 1).目前这不被任何箱估计器使用,但未来可能会使用.
- 返回:
- bin_edgesdtype 为 float 的数组
传递给
histogram
的边缘
参见
备注
估计最佳箱数的方法在文献中有很好的基础,并且受到R在直方图可视化中选择的启发.请注意,箱数与 \(n^{1/3}\) 成比例在渐近意义上是最优的,这就是为什么它出现在大多数估计器中的原因.这些只是提供良好起点的插件方法.在下面的方程中,:math:h 是箱宽,:math:n_h 是箱数.所有计算箱数的估计器都使用数据的
ptp
转换为箱宽.最终的箱数是通过np.round(np.ceil(range / h))
获得的.最终的箱宽通常小于下面估计器返回的值.- ‘auto’(’sturges’ 和 ‘fd’ 估计器中最小箱宽)
一个折中的方案以获得一个好的值.对于小数据集,通常会选择Sturges值,而较大的数据集通常会默认使用FD.避免了FD和Sturges在小数据集和大数据集上的过度保守行为.切换点通常是 \(a.size \approx 1000\).
- ‘fd’ (Freedman Diaconis 估计器)
- \[h = 2 \frac{IQR}{n^{1/3}}\]
binwidth 与四分位距(IQR)成正比,并与 a.size 的立方根成反比.对于小数据集可能过于保守,但对于大数据集效果很好.IQR 对异常值非常稳健.
- ‘scott’
- \[h = \sigma \sqrt[3]{\frac{24 \sqrt{\pi}}{n}}\]
binwidth 与数据的标准差成正比,与
x.size
的立方根成反比.对于小数据集可能过于保守,但对于大数据集效果很好.标准差对异常值不是很稳健.在没有异常值的情况下,值与 Freedman-Diaconis 估计量非常相似. - ‘米饭’
- \[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\]
最简单和最快的估计器.只考虑数据大小.
此外,如果数据是整数数据类型,则 binwidth 永远不会小于 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. ])