2015-06-14 29 views
6

Próba użycia propagacji powinowactwo do proste zadanie klastrów:Powinowactwo propagacji (sklearn) - dziwne zachowanie

from sklearn.cluster import AffinityPropagation 
c = [[0], [0], [0], [0], [0], [0], [0], [0]] 
af = AffinityPropagation (affinity = 'euclidean').fit (c) 
print (af.labels_) 

uzyskać to dziwne wynik: [0 1 0 1 2 1 1 0]

Spodziewam się, aby wszystkie próbki w tym samym klastrze, jak w tym przypadku:

c = [[0], [0], [0]] 
af = AffinityPropagation (affinity = 'euclidean').fit (c) 
print (af.labels_) 

które rzeczywiście stawia wszystkich próbek w tym samym klastrze: [0 0 0]

Czego mi brakuje?

Dzięki

Odpowiedz

3

wierzę to dlatego, że problem jest w zasadzie źle postawione (przekazać mnóstwo tego samego punktu na algorytm, który próbuje znaleźć podobieństwa między różnymi punktami). AffinityPropagation wykonuje macierz matematyczną pod maską, a macierz podobieństwa (która jest zerowa) jest zdegenerowana. Aby nie popełnić błędu, implementacja adds a small random matrix do macierzy podobieństwa uniemożliwiłaby rezygnację algorytmu z napotkania dwóch punktów tego samego punktu.