在特殊图表中查找局部最小值

时间:2011-05-13 13:06:15

标签: algorithm graph

手头的问题看起来很简单,但到目前为止我找不到一个简单的解决方案。

我有一个直方图描述了浮点数组的值分布,大致如下所示:

enter image description here

正如你所看到的,有一个局部最大值接近0,它一直下降到局部最小值,然后迅速上升到一个平台,最后下降到0.我想检测局部最小值。 / p>

实际上,直方图并不是那么平滑:

enter image description here

有很多尖峰,局部最小值可能会拉伸和不均匀。我不知道如何解决这个问题。

领域知识很少。第一个最大值甚至可能高于第二个最大值。任何方向都可能出现峰值,值可能低至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%

4 个答案:

答案 0 :(得分:5)

您的“真实”直方图是低频率。你的噪音很高。使用适当的带宽滤波器对数据进行低通滤波将消除大部分噪声。

答案 1 :(得分:3)

这是一个算法:

  1. 通过计算平滑您的数据集 小窗口的移动平均线。
  2. 测试平滑数据的局部最小值(即任何单个数据) 它比它小 邻居。
  3. 如果有两个以上的局部最小值,请增加窗口大小,然后转到步骤1.
  4. <强>更新

    看了你发布的样本数据后,我意识到你需要检测最小的平台而不仅仅是单个点,所以应该调整算法中的第二步,以确定一个点作为最小值的一部分,如果有的话没有在两边最近的较高值邻居之间具有较小值的邻居。然后,当在步骤3中计算最小值时,最小平台应该算作单个最小值。

    我已经在您的示例数据集上测试了此算法,并且效果很好,分别在:18, 12, 15, 13, 23, 20, 2320为您的数据集选择最小值。

答案 2 :(得分:2)

一种可能的启发式方法:使用spline近似来平滑直方图,并使其成为多项式,然后寻找局部最小值。
请注意,这只是一种启发式解决方案,可能会失败......但我认为这将为大多数情况提供一个很好的解决方案。

答案 3 :(得分:2)

这实际上听起来像是基于直方图的图像分割(虽然这不是图像,所以它实际上只是直方图分割)。听起来很奇怪,但请耐心等待。

最小的事实是重要的是它是最小的,还是它将小的最大值除以大的最大值?如果它是分割最大值的事实,那么分割肯定是你想要的。

看看K-means clustering。你有两个集群。这不是一个非常复杂的程序,但维基百科(和其他来源)在解释它方面做得比我能做得好得多,所以我会留给他们。