numpy.histogram_bin_edges #

麻木的。histogram_bin_edges ( a , bins = 10 , range = None , Weights = None ) [来源] #

仅计算函数使用的 bin 边缘的函数histogram

参数
类似数组

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

bins int 或标量序列或 str,可选

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

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

'汽车'

“sturges”和“fd”估计器的最大值。提供良好的全方位性能。

'fd'(Freedman Diaconis 估计器)

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

'多恩'

Sturges 估计器的改进版本,可以更好地处理非正态数据集。

'斯科特'

考虑数据可变性和数据大小的鲁棒性较差的估计器。

'石头'

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

'米'

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

“斯特吉斯”

R的默认方法,只考虑数据大小。仅适用于高斯数据,并且低估了大型非高斯数据集的 bin 数量。

'开方'

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

范围(浮动、浮动),可选

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

权重数组,可选

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

返回
bin_edges dtype float 数组

要传入的边histogram

也可以看看

histogram

笔记

估计最佳箱数的方法在文献中已有充分依据,并且受到 R 为直方图可视化提供的选择的启发。请注意,垃圾箱的数量与\(n^{1/3}\)是渐近最优的,这就是它出现在大多数估计器中的原因。这些只是简单的插件方法,为 bin 数量提供了良好的起点。在下面的等式中,\(h\)是 binwidth 和\(n_h\)是垃圾箱的数量。所有计算 bin 计数的估计器都使用ptp数据的 重新转换为 bin 宽度。最终的 bin 计数是从 获得的 。最终的箱宽度通常小于下面的估计器返回的宽度。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 对于异常值非常稳健。

'斯科特'
\[h = \sigma \sqrt[3]{\frac{24 \sqrt{\pi}}{n}}\]

binwidth 与数据的标准差成正比,与 的立方根成反比x.size。对于小型数据集可能过于保守,但对于大型数据集来说相当不错。标准差对于异常值不是很稳健。在没有异常值的情况下,值与 Freedman-Diaconis 估计量非常相似。

'米'
\[n_h = 2n^{1/3}\]

bin 的数量仅与 的立方根成正比 a.size。它往往会高估分箱的数量,并且没有考虑数据的可变性。

“斯特吉斯”
\[n_h = \log _{2}(n) + 1\]

bin 的数量是以 2 为底的对数a.size。该估计量假设数据呈正态性,对于较大的非正态数据集来说过于保守。这是R方法中的默认方法 hist

'多恩'
\[ \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} \]

斯特吉斯公式的改进版本,可为非正态数据集生成更好的估计。该估计器尝试考虑数据的偏差。

'开方'
\[n_h = \sqrt n\]

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

例子

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

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

与为每个直方图使用单独的箱相比,这可以提供更容易比较的结果:

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