numpy.histogram_bin_edges#

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

该函数仅计算 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), optional

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

weights类数组,可选

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

返回:
bin_edgesfloat 类型的数组

传递到 histogram 的边.

参见

histogram

注释

用于估计最佳 bin 数的方法在文献中有充分的依据,并且受到 R 为直方图可视化提供的选择的启发. 请注意,使 bin 的数量与 \(n^{1/3}\) 成正比是渐近最优的,这就是它出现在大多数估计器中的原因. 这些只是插入式方法,为 bin 数提供良好的起点. 在下面的等式中, \(h\) 是 binwidth, \(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}}\]

binwidth 与四分位距 (IQR) 成正比,与 a.size 的立方根成反比. 对于小型数据集可能过于保守,但对于大型数据集来说非常好. IQR 对异常值非常稳健.

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

binwidth 与数据的标准差成正比,与 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,则 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. ])

为了与 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.  ])