手头的问题看起来很简单,但到目前为止我找不到一个简单的解决方案。
我有一个直方图描述了浮点数组的值分布,大致如下所示:
正如你所看到的,有一个局部最大值接近0,它一直下降到局部最小值,然后迅速上升到一个平台,最后下降到0.我想检测局部最小值。 / p>
实际上,直方图并不是那么平滑:
有很多尖峰,局部最小值可能会拉伸和不均匀。我不知道如何解决这个问题。
领域知识很少。第一个最大值甚至可能高于第二个最大值。任何方向都可能出现峰值,值可能低至0。
这是从8个不同的运行中获取的真实样本。它缩放到0 - 10,以便更容易理解。
0: 22% 12% 19% 17% 6% 5% 6% 5%
1: 3% 2% 1% 1% 4% 1% 4% 1%
2: 6% 2% 13% 5% 0% 2% 0% 2%
3: 62% 62% 52% 42% 2% 5% 2% 5%
4: 4% 19% 12% 28% 10% 13% 10% 13%
5: 0% 0% 3% 29% 30% 29% 30%
6: 37% 31% 37% 30%
7: 1% 7% 1% 7%
8: 6% 1% 6% 1%
9:
10:
向下舍入值。缺少值表示没有任何值的出现。
第一行的解释:
0: 22% the initial max
1: 3% local min
2: 6% still min
3: 62% plateau max
4: 4% second min
5: 0% 0
6: no more values
7:
8:
9:
10:
作为参考,列出了相同的数据,这次缩放为0 - 100(根本没有90-100范围内的值)。我搞砸了格式化,但它应该给出一个粗略的想法。
0: 0% 0% 0% 1% 0% 0% 0% 0%
1: 0% 1% 1% 3% 0% 0% 0% 0%
2: 1% 2% 1% 3% 0% 0% 0% 0%
3: 4% 2% 3% 3% 0% 1% 0% 1%
4: 6% 1% 3% 2% 0% 0% 0% 0%
5: 2% 0% 3% 1% 0% 0% 0% 0%
6: 1% 0% 2% 0% 0% 0% 0% 0%
7: 1% 0% 1% 0% 0% 0% 0% 0%
8: 1% 0% 1% 0% 0% 0% 0% 0%
9: 1% 0% 1% 0% 1% 0% 1% 0%
10: 1% 0% 0% 0% 1% 0% 1% 0%
11: 0% 0% 0% 0% 0% 0% 0% 0%
12: 0% 0% 0% 0% 0% 0% 0% 0%
13: 0% 0% 0% 0% 0% 0% 0% 0%
14: 0% 0% 0% 0% 0% 0% 0% 0%
15: 0% 0% 0% 0% 0% 0% 0% 0%
16: 0% 0% 0% 0% 0% 0% 0% 0%
17: 0% 0% 0% 0% 0% 0% 0% 0%
18: 0% 0% 0% 0% 0% 0% 0% 0%
19: 0% 0% 0% 0% 0% 0% 0% 0%
20: 0% 0% 0% 0% 0% 0% 0% 0%
21: 0% 0% 0% 0% 0% 0% 0% 0%
22: 0% 0% 0% 0% 0% 0% 0% 0%
23: 0% 0% 0% 0% 0% 0% 0% 0%
24: 0% 0% 1% 0% 0% 0% 0% 0%
25: 0% 0% 1% 0% 0% 0% 0% 0%
26: 0% 0% 1% 0% 0% 0% 0% 0%
27: 0% 0% 1% 0% 0% 0% 0% 0%
28: 1% 0% 2% 1% 0% 0% 0% 0%
29: 3% 0% 2% 2% 0% 0% 0% 0%
30: 7% 1% 3% 2% 0% 0% 0% 0%
31: 10% 2% 4% 3% 0% 0% 0% 0%
32: 10% 3% 4% 4% 0% 0% 0% 0%
33: 6% 6% 5% 5% 0% 0% 0% 0%
34: 5% 5% 4% 4% 0% 0% 0% 0%
35: 5% 8% 6% 3% 0% 0% 0% 0%
36: 5% 10% 6% 4% 0% 0% 0% 0%
37: 5% 9% 5% 3% 0% 0% 0% 0%
38: 3% 8% 5% 5% 0% 0% 0% 0%
39: 2% 5% 5% 5% 0% 0% 0% 0%
40: 1% 4% 4% 5% 0% 1% 0% 1%
41: 1% 3% 2% 5% 0% 1% 0% 1%
42: 0% 1% 1% 4% 0% 0% 0% 0%
43: 0% 2% 0% 4% 1% 1% 1% 1%
44: 0% 1% 0% 3% 1% 1% 1% 1%
45: 0% 1% 0% 1% 0% 1% 0% 1%
46: 0% 1% 0% 1% 1% 1% 1% 1%
47: 0% 1% 0% 0% 1% 1% 1% 1%
48: 0% 1% 0% 0% 1% 1% 1% 1%
50: 0% 0% 0% 1% 1% 1% 1% 1%
50: 0% 1% 1% 1% 1% 1%
51: 0% 0% 2% 1% 2% 1%
52: 0% 1% 2% 1% 2% 1%
53: 0% 0% 4% 2% 4% 2%
54: 0% 2% 2% 2% 2%
55: 0% 2% 2% 2% 2%
56: 0% 2% 3% 2% 3%
57: 0% 2% 4% 2% 4%
58: 4% 6% 4% 6%
59: 3% 3% 3% 3%
60: 5% 5% 5% 5%
61: 5% 7% 5% 7%
62: 3% 5% 3% 5%
63: 4% 3% 4% 3%
64: 5% 2% 5% 2%
65: 3% 2% 2% 2%
66: 5% 1% 5% 1%
67: 1% 0% 1% 0%
68: 1% 0% 1% 0%
69: 0% 1% 0% 1%
70: 0% 0% 0% 0%
71: 0% 0% 0% 0%
72: 0% 0% 0% 0%
73: 0% 1% 0% 1%
74: 0% 0% 0% 0%
75: 0% 0% 0% 0%
76: 0% 1% 0% 1%
77: 0% 0% 0% 0%
78: 0% 0% 0% 0%
79: 0% 0% 0% 0%
80: 0% 0% 0% 1%
81: 0% 0% 0% 0%
82: 0% 0% 0% 0%
83: 0% 0% 0% 0%
84: 0% 0% 0% 0%
85: 1% 1%
86: 0% 0%
87: 1% 1%
88: 1% 1%
89: 0% 0%
答案 0 :(得分:5)
您的“真实”直方图是低频率。你的噪音很高。使用适当的带宽滤波器对数据进行低通滤波将消除大部分噪声。
答案 1 :(得分:3)
这是一个算法:
<强>更新强>
看了你发布的样本数据后,我意识到你需要检测最小的平台而不仅仅是单个点,所以应该调整算法中的第二步,以确定一个点作为最小值的一部分,如果有的话没有在两边最近的较高值邻居之间具有较小值的邻居。然后,当在步骤3中计算最小值时,最小平台应该算作单个最小值。
我已经在您的示例数据集上测试了此算法,并且效果很好,分别在:18, 12, 15, 13, 23, 20, 23
和20
为您的数据集选择最小值。
答案 2 :(得分:2)
一种可能的启发式方法:使用spline近似来平滑直方图,并使其成为多项式,然后寻找局部最小值。
请注意,这只是一种启发式解决方案,可能会失败......但我认为这将为大多数情况提供一个很好的解决方案。
答案 3 :(得分:2)
这实际上听起来像是基于直方图的图像分割(虽然这不是图像,所以它实际上只是直方图分割)。听起来很奇怪,但请耐心等待。
最小的事实是重要的是它是最小的,还是它将小的最大值除以大的最大值?如果它是分割最大值的事实,那么分割肯定是你想要的。
看看K-means clustering。你有两个集群。这不是一个非常复杂的程序,但维基百科(和其他来源)在解释它方面做得比我能做得好得多,所以我会留给他们。