Как использовать kmedoids от pyclustering с заданным количеством кластеров - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь использовать k-medoids для кластеризации некоторых данных о траекториях, с которыми я работаю (несколько точек вдоль траектории полета самолета). Я хочу объединить их в определенное количество кластеров (поскольку я знаю, сколько типов путей должно быть).

Я обнаружил, что k-medoids реализован внутри пакета pyclustering, и пытаюсь это использовать. Технически я могу получить его в кластер, но я не знаю, как контролировать количество кластеров. Сначала я думал, что это напрямую связано с количеством элементов внутри того, что я назвал initial_medoids, но эксперименты показывают, что это сложнее, чем это. Мой соответствующий фрагмент кода ниже.

Обратите внимание, что D содержит список списков. Каждый список соответствует одной траектории.

def hausdorff( u, v):
    d = max(directed_hausdorff(u, v)[0], directed_hausdorff(v, u)[0])
    return d

traj_count = len(traj_lst)
D = np.zeros((traj_count, traj_count))

for i in range(traj_count):
    for j in range(i + 1, traj_count):
        distance = hausdorff(traj_lst[i], traj_lst[j])
        D[i, j] = distance
        D[j, i] = distance


from pyclustering.cluster.kmedoids import kmedoids
initial_medoids = [104, 345, 123, 1]

kmedoids_instance = kmedoids(traj_lst, initial_medoids)
kmedoids_instance.process()
cluster_lst = kmedoids_instance.get_clusters()[0]

num_clusters = len(np.unique(cluster_lst))
print('There were %i clusters found' %num_clusters)

У меня всего 1900 траекторий, и вышеуказанный код находит 1424 кластера. Я ожидал, что смогу контролировать количество кластеров по длине initial_medoids, так как я не видел никакой опции для ввода количества кластеров в программу, но это, похоже, не связано. Может ли кто-нибудь наставить меня на ошибку, которую я совершаю? Как выбрать количество кластеров?

1 Ответ

0 голосов
/ 16 июля 2019

В случае необходимости получения кластеров вам необходимо позвонить get_clusters():

cluster_lst = kmedoids_instance.get_clusters()

Не get_clusters()[0] (в данном случае это список индексов объектов в первом кластере):

cluster_lst = kmedoids_instance.get_clusters()[0]

И это правильно, вы можете контролировать количество кластеров с помощью initial_medoids.

...