2011-11-22 4 views
6

부동 소수점 숫자 배열이 정렬되어 있지 않습니다. 나는 값이 항상 알려지지 않은 몇 가지 지점에 해당된다는 것을 안다. 설명을 위해이 목록그룹의 부동 소수점 숫자 정렬 목록

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

에는 5와 10 주변에 클러스터 된 값이 있으므로 [5,10]을 답으로 사용하고 싶습니다.

나는 1000+ 값을 가진 목록에 대해 클러스터를 찾고 싶습니다. 클러스터 수는 아마도 약 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]