有没有一种很好的方法来进行这种采矿?

时间:2011-08-16 09:48:48

标签: python algorithm data-mining

我正在尝试找到X和Y方向上最接近空间的点(最后给出的样本数据集),并且我正在寻找比我的琐碎(和未经测试)方法更聪明的方法。这些点在空间中的情节看起来像下面这样,我试图找到标记在框内的点集,即我正在寻找的输出是一组组:

Group 1: (1,23), (2,23), (3,23)...
Group 2: (68,200), (68,201), (68,203), (68,204), (68,100), (68,101), (68,101)...

enter image description here

对于水平波段,我想我可以继续使用尺寸为5或10的小滑动窗口(这应该从全局信息中确定哪个尺寸将给出最大分组点但我是仍在探索一个好的方法)并搜索连续点,因为中断不再被视为水平带。

我猜测同样的方法也适用于垂直波段,但并非在所有情况下都是如此,因为水平和垂直波段之间存在细微差别:点应该看起来接近被视为水平组,但它们可以出现在任何地方被认为是垂直乐队的一部分。观察图中的大垂直带。所以我猜我只能找到具有相同x坐标的点(在这种情况下,x = 68)应该给我很多积分。

除了这个微不足道的解决方案之外,我无法想到任何可以在这里做到的聪明,因为这个问题对我来说看似简单。我在这里错过了什么吗?这是否属于一些已知的问题,如果是这样,是否有一种良好且可扩展的方法来实现这一目标?

示例数据集:

1,23
1,23
2,23
3,23
4,23
5,23
6,23
7,23
8,23
9,23
10,23
11,23
12,23
13,23
14,23
15,23
16,23
10,33
11,33
12,33
13,33
14,33
15,33
16,33
17,33
18,33
19,33
2,28
2,28
3,28
34,75
34,76
34,76
34,77
34,78
34,79
34,80
34,81
34,82
34,83
34,75
34,76
34,76
34,77
34,78
34,79
34,80
34,81
400,28
400,28
400,28
68,200
68,201
68,203
68,204
68,100
68,101
68,103
68,104

2 个答案:

答案 0 :(得分:13)

答案 1 :(得分:3)

您可以尝试使用cluster module。它包含K-means聚类算法的实现。您可以调整getclusters函数的参数来更改所需的集群数。

s = '''
1,23
1,23
2,23
...
68,101
68,103
68,104
'''

from cluster import *

ll = [tuple(map(int,each.split(','))) for each in s.split()]

#horizontal 
cl = HierarchicalClustering(ll, lambda x,y: abs(x[0]-y[0]))

for c in cl.getlevel(1):
    print c

#vertical
cl = HierarchicalClustering(ll, lambda x,y: abs(x[1]-y[1]))

for c in cl.getlevel(1):
    print c