Склеарн: распространение сродства, хорошие иждивенцы, плохие примеры - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь использовать реализацию распространения сродства sklearn для довольно простого кластера, однако я получаю несколько забавных результатов.Я пытался использовать AP с 300 кластерами по 3 точки в каждом, и это с треском провалилось, поэтому я решил, казалось бы, простую задачу кластеризации 5 гауссовских распределенных кластеров по 100 точек в каждом.Полученный график связан ниже.Кто-нибудь знает, где я ошибся?

AP сюжет

Я следовал ответу @ Anony-Mousse от this , однако, увеличивая демпфирование иМаксимальное количество итераций не очень помогло.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import AffinityPropagation
from itertools import cycle

n_per_cluster = 100
n_clusters = 5
n_total = n_per_cluster*n_clusters

x = np.empty(n_total)
y = np.empty(n_total)
labels = np.empty(n_total)
count = 0
for i in range(n_clusters):
    xseed = np.random.random()*100
    yseed = np.random.random()*100
    normX = np.random.normal(xseed,1,n_per_cluster)
    normY = np.random.normal(yseed,1,n_per_cluster)
    normCount = 0
    for j in range(n_per_cluster):
        x[count] = normX[normCount]
        y[count] = normY[normCount]
        labels[count] = i
        normCount+=1
        count+=1

#print(labels)
#print(x, y)
# plt.scatter(x,y)
# plt.show()
preference = -50
max_iter = 1000
xy = np.column_stack((x,y))
af = AffinityPropagation(damping = 0.9, preference = preference, verbose = True, max_iter = max_iter).fit(xy)
_exemplars_index = af.cluster_centers_indices_
_labels = af.labels_
_n_cluster = len(_exemplars_index)

plt.close('all')
plt.figure(1)
plt.clf()

colors = cycle('bgrcmyk')
for k,col in zip(range(_n_cluster),colors):
    class_members = labels == k #error check
    exemplars = xy[_exemplars_index[k]]
    plt.plot(xy[class_members, 0], xy[class_members,1], col + '.')
    plt.plot(exemplars[0], exemplars[1], 'o', markerfacecolor=col,
             markeredgecolor='k', markersize=14)
    for x in xy[class_members]:
        plt.plot([exemplars[0], x[0]], [exemplars[1], x[1]], col)

plt.title('Estimated number of clusters: %d' % _n_cluster)
plt.show()

Кластеры корректны, но примеры на экране.Это довольно прямая проблема кластеризации, поэтому я представляю, что это ошибка пользователя, но я еще не понял ее.Спасибо за помощь

1 Ответ

0 голосов
/ 26 сентября 2019

Извините, я должен был попробовать параметрическую развертку перед публикацией.Очевидно, AP просто очень чувствительна к метрическим данным.Я получил приличные результаты при предпочтении = -100, демпфировании = 0,95 и 1500 итераций.

...