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:
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:
I punkty WGS84 dla progu 0,5:
brc = Birch(threshold=0.5)
brc.fit(data84)
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)
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.