Der Birkenalgorithmus gruppiert sich nicht wie erwartet

10

Ich verwende den Birch-Algorithmus aus dem Python-Paket scipy-learn, um eine Reihe von Punkten in einer kleinen Stadt in 10er-Gruppen zu gruppieren.

Ich benutze folgenden Code:

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

In meiner Idee würde ich immer mit Sätzen von 10 Punkten enden. In meinem Fall habe ich jetzt 650 Punkte für Cluster und n_clusters ist 65.

Mein Problem ist jedoch, dass ich bei einem zu niedrigen Schwellenwert 1 Adresse pro Cluster habe, nur einen winzigen größeren Schwellenwert - 40 Adressen pro Cluster.

Was mache ich hier falsch?

Kaboom
quelle
Vielleicht ist es CRS. Problem? Wenn Sie es mit Abschlüssen versucht haben (wie WGS 84), versuchen Sie es mit Metrik. Es gibt einen ziemlich großen Unterschied in den Koordinaten und beide können unterschiedliche Schwellenwerte erfordern. Sie können es auch mit verschiedenen Python-Bibliotheken versuchen. Ich empfehle dringend, scikit-learn zu verwenden.
dmh126
..erm, ich gruppiere auf der Grundlage von GPS-Koordinaten, wie sie von der Google API empfangen wurden. Ich gehe davon aus, dass sie standardformatiert sind. Nein?
Kaboom
Vielleicht fügen Sie hier diese Koordinaten ein, ich werde versuchen, dies herauszufinden.
dmh126
dmh126 könnte richtig sein: Goolge API arbeitet mit WGS84, dies ist ein (Welt-) geodätisches System, keine Metrik
André

Antworten:

10

Ich habe einige Nachforschungen angestellt. Ich habe einige Punkte in zwei Koordinatensystemen ohne Metrik (WGS84) und Metrik (Polen 1992) genommen.

Ich habe diesen Code verwendet:

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)

Dann passe ich unser Modell mit metrischen Daten an:

brc.fit(data90)

Und zeichnen Sie die Ergebnisse auf, wobei Kreuze meine Punkte und Kreise meine Subcluster waren:

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

Das habe ich bekommen: Geben Sie hier die Bildbeschreibung ein

Sie können sehen, dass dieser Schwellenwert zu klein war, weil er in jedem Punkt einen Subcluster gefunden hat.

Definition der Schwelle:

Der Radius des Subclusters, der durch Zusammenführen einer neuen Stichprobe und des nächsten Subclusters erhalten wird, sollte kleiner als der Schwellenwert sein. Andernfalls wird ein neuer Subcluster gestartet.

In diesem Fall müssen wir diesen Wert erhöhen.

Zum:

brc = Birch(threshold=5000)

es war viel besser:

Geben Sie hier die Bildbeschreibung ein

Und die WGS84-Punkte für den Schwellenwert 0,5:

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

Geben Sie hier die Bildbeschreibung ein

Nur ein Subcluster, nicht gut. In diesem Fall sollten wir jedoch den Schwellenwert verringern, also für 0,05:

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

Geben Sie hier die Bildbeschreibung ein

Wir haben schöne Ergebnisse.

Fazit:

CRS ist wichtig. Sie müssen einen geeigneten Schwellenwert finden, der von Ihren Datenkoordinatensystemen und dem Abstand zwischen Punkten abhängt. Wenn Sie nicht metrisches CRS haben, sollte der Schwellenwert relativ kleiner sein als beim metrischen System. Sie müssen den Unterschied zwischen Metern und Grad kennen. Wenn der Abstand zwischen zwei Punkten 10000 m beträgt, beträgt er in WGS84 weniger als 1 Grad. Überprüfen Sie Google auf genauere Werte.

Es gibt auch mehr Punkte als den Wert von n_clusters. Es ist in Ordnung, es gibt keine Schwerpunkte von Clustern, sondern Subcluster. Wenn Sie versuchen, etwas vorherzusagen oder Beschriftungen zu drucken, wird Ihr Punkt in einen der Bereiche n_clusters (oder Druckpunkte, die als Beschriftung 0,1,2, ..., n_clusters klassifiziert sind) klassifiziert.

Wenn Sie keine anderen Parameter ausprobieren möchten, können Sie jederzeit einen anderen Algorithmus verwenden. Sehr einfacher und gebräuchlicher Algorithmus für das Clustering ist der K-Mittelwert-Algorithmus.

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

Es sollte n Cluster für Ihre Daten finden, ohne auf Schwellenwerte usw. zu achten.

dmh126
quelle