我有兴趣在直方图中找到大致类似于
的局部最小值
我想找到109.258的局部最小值,最简单的方法是确定109.258处的计数是否低于某些区间内的平均计数(包括109.258) )。它确定了这个区间对我来说是最困难的部分。
对于这些数据的来源,它是一个100个不均匀宽度的直方图。每个bin都有一个值(显示在x轴上),以及落入该bin的样本计数(显示在y轴上)。我想要做的是找到分割直方图的“最佳”位置。分割的每一侧都沿二叉树向下传播,作为分类算法的一部分。
我认为我最好的做法是尝试使用类似Levenberg-Marquardt algorithm之类的曲线拟合此直方图,然后比较局部最小值以找到“最佳”曲线。 “最佳”的适当度量将包括对该分裂的重要性的一些指示,其被测量为左侧区间中的平均计数与右侧区间中的计数的平均值之间的差异,然后可能将每个差异与所包含的计数数量相加以得到“最佳”的复合测量值,如果这是有意义的话。
无论哪种方式,算法的计算复杂性都不是一个大问题,100个箱子大约是我期望遇到的最大数量。但是,对于每个样本,这个计算将执行一次,因此相对于箱数保持线性当然是理想的。
顺便说一下,我正在用C ++做一切,并且使用了boost库和STL,因此在这方面没有任何限制。
非常感谢有关最佳做法的任何想法或见解!
答案 0 :(得分:6)
Levenberg-Marquardt在坚固耐用的优化领域中不是一个很好的选择 - 你的非常坚固。那里有很多当地的迷你。 Levenberg-Marquardt可能会在100左右找到局部最小值。或者它可能会在图的极端情况下找到一个两个全局最小值,函数尾部变为零。
你想要找到最重要的局部最小值的东西。例如,某种聚类算法。这是一个非常简单的问题:
第1步: 在数据集中查找本地极值。这些是极端范围的极值加上内部局部最小值和最大值。使用直方图,您应该有一个奇数个极值,在最小值和最大值之间交替。
第2步: 找到具有最小delta的对。这将是(本地最大,本地最小)或(本地最小,本地最大)对。
第3步: 找到要删除的一对元素,其中一个
如果找到的对包含边界点,则应根据需要使用选项2或3。对于内部对,您可能希望在三个选项之间进行选择时使用一些启发式方法。或者你可以做一些简单的事情并使用找到的那对。
第4步: 删除步骤3中的元素对,跟踪已删除的对。
第5步: 重复步骤2到4,直到极值数据集中只剩下三个元素(范围的极值加上局部最大值,希望是全局最大值)。
最后删除的最小值是你想要的。
还有很多其他的聚类算法。我提出的那个相当粗糙,显然不是特别快。可以很好地扩展到更多数据和更高维度数据的是期望最大化算法。模拟退火(Metropolis-Hastings)也可以适应这个问题。
答案 1 :(得分:4)
如果我理解正确 kmore 想要根据最大间距(直方图计数和bin距离的乘积)划分两个“峰值”。如果是这样的话:
答案 2 :(得分:2)
当然,问题可以转化为通过功能操纵数据的最高发现之一(反转或否定是明显的候选者)。
或者,如果该示例是典型的,则可以从未转换数据中的峰值发现开始,并寻找峰值(相对)广泛分离的区域作为包含良好局部最小值的候选者。
I am forever recommending ROOT TSpectrum类用于寻找高峰的方法。
在
中详细讨论了underling算法这些论文的副本保存在ROOT网站上,并在TSpectrum文档中链接,以供那些没有订阅NIM A的人使用。
答案 3 :(得分:1)
你想要的东西似乎比局部最小值更复杂。此外,当地的最低概念在很大程度上取决于您对垃圾箱的选择。
你听说过Otsu's method吗?它可能更符合您的要求。
这是另一个Otsu's method link。