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
参见
备注
估计最优箱数的方法在文献中有充分的理论基础,并受到 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. ])