maxframe.tensor.histogram_bin_edges#

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

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

参数:
  • a (array_like) -- 输入数据。直方图是在展平后的 tensor 上计算的。

  • bins (int or sequence of scalars or str, optional) -- 如果 bins 是一个整数,它定义了在给定范围内的等宽 bins 数量(默认为 10)。如果 bins 是一个序列,它定义了 bin 的边缘,包括最右边的边缘,允许非均匀的 bin 宽度。如果 bins 是下面列表中的字符串,histogram_bin_edges 将使用所选的方法,基于落在请求范围内的数据来计算最优的 bin 宽度,进而计算出 bin 的数量(关于估计器的更多细节,请参见 Notes)。虽然 bin 宽度对实际范围内的数据是最优的,但 bin 数量会计算为填充整个范围,包括没有数据的部分。对于可视化,建议使用 'auto' 选项。带权重的数据不支持自动选择 bin 大小。 'auto' 'sturges' 和 'fd' 估计器的最大值。提供良好的整体性能。 'fd' (Freedman Diaconis 估计器) 对异常值鲁棒的估计器,考虑了数据的可变性和数据量。 'doane' Sturges 估计器的改进版本,适用于非正态数据集。 'scott' 较不鲁棒的估计器,考虑了数据的可变性和数据量。 'stone' 基于留一交叉验证的集成平方误差估计的估计器。可以视为 Scott 规则的推广。 'rice' 估计器不考虑数据的可变性,只考虑数据量。通常会高估所需的 bin 数量。 'sturges' R 的默认方法,仅考虑数据量。仅对高斯数据最优,并且对于大型非高斯数据集会低估 bin 数量。 'sqrt' 平方根(数据量)估计器,被 Excel 和其他程序用于其速度和简单性。

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

  • weights (array_like, optional) -- 一个与 a 相同形状的权重 tensor。a 中的每个值只会将其对应的权重贡献给 bin 计数(而不是 1)。目前任何 bin 估计器都不使用这个参数,但未来可能会使用。

返回:

bin_edges -- 要传递给 histogram 的边缘

返回类型:

tensor of dtype float

参见

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' (Freedman Diaconis 估计器)
\[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}(1 + \frac{|g_1|}{\sigma_{g_1}})\\g_1 = mean[(\frac{x - \mu}{\sigma})^3]\\\sigma_{g_1} = \sqrt{\frac{6(n - 2)}{(n + 1)(n + 3)}}\end{aligned}\end{align} \]

Sturges 公式的改进版本,能为非正态数据集提供更好的估计。该估计器尝试考虑数据的偏度。

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

最简单且最快的估计器。仅考虑数据大小。

示例

>>> import maxframe.tensor as mt
>>> arr = mt.array([0, 0, 0, 1, 2, 3, 3, 4, 5])
>>> mt.histogram_bin_edges(arr, bins='auto', range=(0, 1)).execute()
array([0.  , 0.25, 0.5 , 0.75, 1.  ])
>>> mt.histogram_bin_edges(arr, bins=2).execute()
array([0. , 2.5, 5. ])

为了与 histogram 保持一致,预先计算好的箱数组将以不变形式传入:

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

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

>>> shared_bins = mt.histogram_bin_edges(arr, bins='auto')
>>> shared_bins.execute()
array([0., 1., 2., 3., 4., 5.])
>>> group_id = mt.array([0, 1, 1, 0, 1, 1, 0, 1, 1])
>>> a = arr[group_id == 0]
>>> a.execute()
array([0, 1, 3])
>>> hist_0, _ = mt.histogram(a, bins=shared_bins).execute()
>>> b = arr[group_id == 1]
>>> b.execute()
array([0, 0, 2, 3, 4, 5])
>>> hist_1, _ = mt.histogram(b, bins=shared_bins).execute()
>>> hist_0; hist_1
array([1, 1, 0, 1, 0])
array([2, 0, 1, 1, 2])

这比为每个直方图使用不同箱所得到的结果更易于比较:

>>> hist_0, bins_0 = mt.histogram(a, bins='auto').execute()
>>> hist_1, bins_1 = mt.histogram(b, bins='auto').execute()
>>> 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.  ])