计算直方图中的最佳箱数

机器算法验证 经验法则 直方图
2022-01-20 15:00:56

我有兴趣找到尽可能优化的方法来确定我应该在直方图中使用多少个 bin。我的数据最多应该在 30 到 350 个对象之间,特别是我正在尝试应用阈值处理(如 Otsu 的方法),其中“好”对象(我应该更少并且应该更分散)与“坏”的对象,它的价值应该更密集。对于每个对象,具体值的得分为 1-10。我有 5-10 个分数为 6-10 的对象,以及 20-25 个分数为 1-4 的对象。我想找到一个直方图分箱模式,它通常允许像 Otsu 的方法这样的方法来限制低得分对象。但是,在我见过的 Otsu 的实现中,bin 大小为 256,而且我的数据点通常比 256 少得多,对我来说,这表明 256 不是一个好的 bin 编号。数据这么少,我应该采取什么方法来计算要使用的 bin 数量?

4个回答

Freedman-Diaconis规则非常稳健并且在实践中运行良好bin-width 设置为所以 bin 的数量是,其中n是观察的数量,max 是最大值,min 是最小值。h=2×IQR×n1/3(maxmin)/hn

在基础 R 中,您可以使用:

hist(x, breaks="FD")

对于没有此选项的其他绘图库(例如ggplot2),您可以将 binwidth 计算为:

bw <- 2 * IQR(x) / length(x)^(1/3)

### for example #####
ggplot() + geom_histogram(aes(x), binwidth = bw)

如果您使用的 bin 太少,直方图并不能很好地描绘数据。如果你有太多的垃圾箱,你会得到一个破梳子的外观,这也不会给人一种分布感。

一种解决方案是创建一个显示每个值的图表。点图或累积频率分布,不需要任何 bin。

如果要创建具有等间距 bin 的频率分布,则需要确定多少 bin(或每个 bin 的宽度)。该决定显然取决于值的数量。如果你有很多值,如果你有很多 bin,你的图表会看起来更好,信息也更丰富。该维基百科页面列出了几种根据观察次数确定 bin 宽度的方法。最简单的方法是将分箱数设置为您要分箱的值数的平方根。

Hideaki Shimazaki 的这个页面解释了另一种方法。计算起来有点复杂,但似乎做得很好。页面的顶部是一个 Java 应用程序。滚动过去以查看理论和解释,然后继续滚动以找到解释该方法的论文的链接。

也许 Denby 和 Mallows 的论文“直方图的变化”会很有趣:

这种我们称之为“dhist”(对角切割直方图)的新显示保留了等宽直方图和等面积直方图的理想特征。当数据中有尖峰时,它将显示像 ea hist 这样的高窄箱,并且会像通​​常的直方图一样显示孤立的异常值。

他们还提到 R 中的代码可应要求提供。

岛崎筱本法你见过吗?

尽管它似乎在计算上很昂贵,但它可能会给您带来很好的结果。如果计算时间不是您的问题,那么值得一试。该方法在java、MATLAB等中有一些实现,在以下链接中,运行速度足够快: web-interface