2015-02-03 5 views
0

Учитывая список пара одномерных координат (или сегментов), как следующее:Нахождение «горячие точки» в одномерном списке в Python

[1]: 1200, 1210 
[2]: 1212, 1222 
[3]: 1190, 1200 
[4]: 300, 310 
... 
[n]: 800, 810 

(где вы можете взять центр каждой пару для представления каждого элемента) Я хочу знать, какой алгоритм или какой алгоритм я могу использовать, чтобы найти «горячие точки» или кластеры.

Точка доступа представляет собой сегмент, содержащий определенное количество элементов в нем (допустим, k).

Например, [3], [1] и [2] будет принадлежать к той же группе, и полученный список будет что-то вроде:

[1']: 1190, 1222 ([1], [2], [3]) 

(начала, конца, содержащиеся элементы)

+1

Определите вашу проблему более точно. Что такое горячая точка? Без хорошего математического определения, как вы теперь «ставите все в одну группу» или «вкладываете все в отдельную группу» - это не правильное или оптимальное решение? Задайте проблему как «разделить« n »сегменты на« k »дизъюнктные множества, чтобы ... минимизировать». –

+0

это хорошее начало.Я думаю, что мне нужно свести к минимуму расстояние между сегментами, но все еще не уверен, как объяснить это более точно –

+0

«положить все в отдельную группу» позволяет свести к минимуму расстояние между сегментами. Пока у вас есть ограничение или более высокая стоимость, вы не можете помочь. –

ответ

0

Проблема на самом деле не определена, но, возможно, это поможет вам.

KMeans - это способ группировки предметов по расстоянию. Scikit-learn имеет реализацию, которая довольно проста в использовании. См. Пример http://scikit-learn.org/stable/auto_examples/cluster/plot_kmeans_digits.html#example-cluster-plot-kmeans-digits-py.

Это позволит вам определить количество кластеров, которые вы хотите найти. Однако вы не можете знать, сколько очков будет в каждом кластере. Во всяком случае, вот небольшой пример:

from sklearn.cluster import KMeans 

data = [[1200, 1210], [1212, 1222], [1190, 1200], [300, 310], [800, 810]] 
centers = [[sum(x)/len(x)] for x in data] 

clf = KMeans(n_clusters=3) 

clf.fit(centers) 

for points in data: 
    center = sum(points)/len(points) 
    print points, center, clf.predict([center]) 

Выход:

[1200, 1210] 1205 [1]

[1212, 1222] 1217 [1]

[1190, 1200 ] 1195 [1]

[300, 310] 305 [0]

[800, 810] 805 [2]

EDIT: Еще один алгоритм, предоставляемый в SKLearn, - это Affinity Propagation, который не требует, чтобы количество кластеров было задано перед рукой. Я не знаю, как это работает, но вы можете найти информацию об этом самостоятельно.

Пример:

from sklearn.cluster import AffinityPropagation 
import numpy as np 

data = [[1200, 1210], [1212, 1222], [1190, 1200], [300, 310], [800, 810]] 
centers = np.array([[sum(x)/len(x)] for x in data]) 

clf = AffinityPropagation() 


for (points, cluster) in zip(data, clf.fit_predict(centers)): 
    center = sum(points)/len(points) 
    print points, center, cluster 

Выход:

[1200, 1210] 1205 0

[1212, 1222] 1217 0

[1190, 1200] 1 195 0

[300, 310] 305 1

[800, 810] 805 2

+0

отлично, есть ли способ изменить этот алгоритм для автоматического определения количества кластеров? –

+0

с данным набором данных результаты не являются постоянными данными [4944, 4964], [4946, 4966], [4935, 4955], [4942, 4962], [4947, 4967], [4934, 4954], [4941 4950, 4965], [4940, 4960], [4943, 4963], [4941, 4961], [4935, 4955], [4930, 4950], [4935, 4955], [4936, 4956 ], [4940, 4960]] –

+0

Ну, что не согласуется? Кажется, что два кластера с отсеченной точкой вокруг центра 4950. Это кажется разумным, учитывая данные и тот факт, что алгоритм не знает, что он представляет. Может быть, если у вас есть дополнительная информация о том, что представляет собой настоящая проблема? Возможно, вы сможете использовать это. –

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

  • Нет связанных вопросов^_^