Algorytm brzozy nie klastruje zgodnie z oczekiwaniami

10

Używam algorytmu Birch z scipy-learn pakiet Python do grupowania zestawu punktów w jednym małym mieście w zestawy po 10.

Używam następującego kodu:

no = len(list_of_points)/10
brc = Birch(branching_factor=50, n_clusters=no, threshold=0.05,compute_labels=True)

W moim pomyśle zawsze kończyło mi się zestawem 10 punktów. W moim przypadku mam teraz 650 punktów do zgrupowania, a n_clusters to 65.

Ale moim problemem jest to, że przy zbyt niskim progu otrzymuję 1 adres klastra, tylko trochę większy próg - 40 adresów na klaster.

Co robię tutaj źle?

kaboom
źródło
Może to CRS. Problem? Jeśli próbowałeś ze stopniami (jak WGS 84), spróbuj metrycznych. Istnieje dość duża różnica we współrzędnych i obie mogą wymagać innej wartości progowej. Możesz także wypróbować inną bibliotekę Pythona, zdecydowanie zalecamy użycie scikit-learn.
dmh126,
..erm, grupuję na podstawie współrzędnych GPS otrzymanych z Google API, domyślnie są one sformatowane. Nie?
kaboom
Może wklej tutaj te współrzędne, spróbuję to rozgryźć.
dmh126
dmh126 może mieć rację: Goolge API współpracuje z WGS84, jest to (światowy) system geodezyjny, a nie metryka
André

Odpowiedzi:

10

Zrobiłem trochę badań. Wziąłem kilka punktów w dwóch układach współrzędnych niemetrycznych (WGS84) i metrycznych (Polska 1992).

Użyłem tego kodu:

from scipy import loadtxt
from sklearn.cluster import Birch
import matplotlib.pyplot as plt

data84 = loadtxt("/home/damian/workspace/84.csv", delimiter=",")
data90 = loadtxt("/home/damian/workspace/90.csv", delimiter=",")

brc = Birch(threshold=0.5)

Następnie dopasowuję nasz model do danych metrycznych:

brc.fit(data90)

I wykreślić wyniki, w których krzyże były moimi punktami, a koła - moimi podgrupami:

c = brc.subcluster_centers_
plt.plot(data90[:,0], data90[:,1], '+')
plt.plot(c[:,0], c[:,1], 'o')
plt.show()

Oto co mam: wprowadź opis zdjęcia tutaj

Widać, że ta wartość progowa była zbyt mała, ponieważ w każdym punkcie znajdowała się podgrupa.

Definicja progu:

Promień podgrupy uzyskanej przez połączenie nowej próbki i najbliższej podgrupy powinien być mniejszy niż próg. W przeciwnym razie uruchamiany jest nowy pod klaster.

W takim przypadku musimy zwiększyć tę wartość.

Dla:

brc = Birch(threshold=5000)

było znacznie lepiej:

wprowadź opis zdjęcia tutaj

I punkty WGS84 dla progu 0,5:

brc = Birch(threshold=0.5)
brc.fit(data84)

wprowadź opis zdjęcia tutaj

Tylko jedna podgrupa, nie jest dobra. Ale w tym przypadku powinniśmy zmniejszyć wartość progową, więc dla 0,05:

brc = Birch(threshold=0.05)
brc.fit(data84)

wprowadź opis zdjęcia tutaj

Mamy dobre wyniki.

Wniosek:

CRS ma znaczenie. Musisz znaleźć odpowiednią wartość progową, zależy od układu współrzędnych danych i odległości między punktami. Jeśli masz niemetryczny CRS, próg powinien być stosunkowo mniejszy niż w systemie metrycznym. Musisz znać różnicę między metrami i stopniami, jeśli odległość między dwoma punktami jest równa 10000 m, w WGS84 będzie mniejsza niż 1 stopień. Sprawdź w Google, aby uzyskać dokładniejsze wartości.

Jest też więcej punktów niż wartość n_clusters. Jest ok, nie ma centroidów klastrów, ale podgrupy. Jeśli spróbujesz coś przewidzieć lub wydrukować etykiety, sklasyfikujesz swój punkt w jednym z obszarów n_clusters (lub wydrukujesz punkty sklasyfikowane do etykiety 0,1,2, ..., n_clusters).

Jeśli nie chcesz wypróbować różnych parametrów, zawsze możesz wziąć inny algorytm. Bardzo prostym i powszechnym algorytmem dla grupowania jest algorytm K-średnich.

http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html

Powinien znaleźć n klastrów dla danych bez dbania o progi itp.

dmh126
źródło