2013-05-02 3 views
1

Я написал свой собственный алгоритм кластеризации (плохой, я знаю) для своей проблемы. Он работает хорошо, но может работать быстрее.Оптимизация кластеризации в Python

Алгоритм принимает список значений (1D), как на входе, и работает следующим образом:

  1. Для каждого кластера, вычислить расстояние до ближайшего соседнего кластера
  2. Выберите кластер А, который имеет наименьшее расстояние до соседа в
  3. Если расстояние между а и в меньше, то пороговое значение, возвращаемое
  4. Зерноуборочный а и Б
  5. Гото 1.

я, наверное, заново колесо здесь ..

Это мой скотина код Фос, как сделать это быстрее? Я SciPy и Numpy установлен, если есть что-то готовое

#cluster center as simple average value 
def cluster_center(cluster): 
    return sum(cluster)/len(cluster) 

#Distance between clusters 
def cluster_distance(a, b): 
    return abs(cluster_center(a) - cluster_center(b)) 

while True: 
    cluster_distances = [] 

    #If nothing to cluster, ready 
    if len(clusters) < 2: 
    break 

    #Go thru all clusters, calculate shortest distance to neighbor 
    for cluster in clusters: 
    cluster_distances.append((cluster, sorted([(cluster_distance(cluster, c), c) for c in clusters if c != cluster])[0])) 

    #Find out closest pair 
    cluster_distances.sort(cmp=lambda a,b:cmp(a[1], b[1])) 

    #Check if distance is under threshold 15 
    if cluster_distances[0][1][0] < 15: 
    a = cluster_distances[0][0] 
    b = cluster_distances[0][1][1] 
    #Combine clusters (combine lists) 
    a.extend(b) 

    #Form a new cluster list 
    clusters = [c[0] for c in cluster_distances if c[0] != b] 
    else: 
    break 
+0

Я не знаю, с чего начать, но, к счастью, кто-то еще может: https://code.google.com/p/scipy-cluster/ и http://glowingpython.blogspot.com/2012/04/k -means-clustering-with-scipy.html – mdscruggs

+0

K-означает, что кластеризация требует знания количества кластеров, а с scipy-cluster я не знаю, с чего начать :) – Harriv

+0

Вы изобретаете агломеративную кластеризацию? Посмотрите: http://scikit-learn.org/stable/modules/clustering.html#hierarchical-clustering – M456

ответ

2

Обычно термин «кластерный анализ» используется только для мультей-мерного разделов. Потому что в 1d вы можете на самом деле сортировать свои данные и решить эту проблему намного проще.

Чтобы ускорить ваш подход, сортировать данные! И передумайте, что вам тогда нужно делать.

Что касается более продвинутого метода: сделайте оценку плотности ядра и найдите локальные минимумы в качестве точек расщепления.

+0

Да, данные сортируются. Не могли бы вы объяснить, что такое «оценка плотности ядра»? – Harriv

+0

Посмотрите его в своей любимой книге математики/статистики. Или Википедия. –

Смежные вопросы