2011-11-22 35 views
6

我有一个浮点数的数组,它是无序的。我知道价值总是落在几个不知道的点上。为了说明,这个清单组中的浮点数的排序列表

[10.01,5.001,4.89,5.1,9.9,10.1,5.05,4.99] 

有值聚集在5和10左右,所以我想[5,10]作为答案。

我想找到那些具有1000多个值的列表,其中聚类的nunber大概在10左右(对于某些给定的容差)。如何有效地做到这一点?

回答

13

检查python-cluster

有了这个库,你可以做这样的事情:

from cluster import * 

data = [10.01,5.001,4.89,5.1,9.9,10.1,5.05,4.99] 
cl = HierarchicalClustering(data, lambda x,y: abs(x-y)) 
print [mean(cluster) for cluster in cl.getlevel(1.0)] 

而且你会得到:

[5.0062, 10.003333333333332] 

(这是一个非常愚蠢的例子,因为我不真的不知道你想做什么,因为这是我第一次使用这个库)

+0

短使用例将是很好。该链接可能很快就会过时。 –

+0

@Tim您说得对,我已经添加了一个简短的示例 –

+0

该软件包的文档是我需要使用它的所有文档,它的工作原理非常棒。 – eudoxos

2

您可以尝试以下方法:

首先对数组进行排序,然后使用diff()计算两个连续值之间的差异。大于阈值的差可以考虑作为分割位置:

import numpy as np 
x = [10.01,5.001,4.89,5.1,9.9,10.1,5.05,4.99] 
x = np.sort(x) 
th = 0.5 
print [group.mean() for group in np.split(x, np.where(np.diff(x) > th)[0]+1)] 

结果是:

[5.0061999999999998, 10.003333333333332]