Meine Daten sind wie folgt:
%Vor%Ich möchte in der Lage sein, die Daten in N Cluster zu gruppieren (sagen wir 3). Normalerweise würde ich ein kmeans verwenden:
%Vor%Das Problem dabei ist, dass es keine Gewichtung berücksichtigt (in diesem Fall meinen Stromerzeugungswert). Ich möchte meine Cluster idealerweise den Wert "powergenerated" berücksichtigen lassen und versuchen, die Cluster nicht nur räumlich nahe zu halten, aber auch in der Nähe von relativ gleichen Gesamtleistung erzeugt.
Sollte ich das mit kmeans (oder einer anderen Methode) machen? Oder sollte ich etwas anderes für dieses Problem verwenden, das besser wäre?
Oder sollte ich etwas anderes für dieses Problem verwenden, das besser wäre?
Um gleichzeitig die geographische Entfernung zwischen den Zentralen und die generierte Leistung zu berücksichtigen, sollten Sie eine geeignete Metrik definieren. Die folgende Funktion berechnet den Abstand zwischen zwei Punkten auf der Erdoberfläche von ihren Breiten und Längen durch die hairsine Formel und addiert den absoluten Wert der erzeugten Leistungsdifferenz multipliziert mit einem Gewichtungsfaktor. Der Wert des Gewichtes bestimmt den relativen Einfluss von Abstand und Leistungsunterschied im Clusterprozess.
%Vor%Soll ich das mit kmeans (oder einer anderen Methode) machen?
Leider unterstützen die aktuellen Implementierungen von SciPys kmeans2
und scikit-learns KMeans
nur die euklidische Distanz. Eine alternative Methode bestünde darin, hierarchisches Clustering durchzuführen das SciPy-Clustering-Paket, um die Zentralen gemäß der gerade definierten Metrik zu gruppieren.
Lassen Sie uns zunächst Mock-Daten generieren, nämlich Feature-Vektoren für 8 Zentralen mit zufälligen Werten:
%Vor% Der Inhalt der Variablen data
, die das obige Snippet liefert, sieht folgendermaßen aus:
Um diese Daten in drei verschiedene Gruppen aufzuteilen, müssen wir data
und custom_metric
an die Funktion linkage
übergeben (siehe docs , um mehr über den Parameter method
zu erfahren, und übergeben Sie dann die zurückgegebene Verknüpfungsmatrix an cut_tree
Funktion mit n_clusters=3
.
Als Ergebnis erhalten wir die Gruppenzugehörigkeit (array y
) für jedes zentrale:
Die obigen Ergebnisse hängen vom Wert von weight
ab. Wenn Sie einen anderen Wert als 1
(zB 250
) verwenden möchten, können Sie den Standardwert wie folgt ändern:
Alternativ könnten Sie den Parameter metric
im Aufruf von linkage
auf einen lambda
Ausdruck wie folgt setzen: metric=lambda x, y: custom_metric(x, y, 250)
.
Um schließlich einen tieferen Einblick in das hierarchische / agglomerative Clustering zu erhalten, könnten Sie es als Dendrogramm darstellen:
%Vor%Tags und Links python algorithm cluster-analysis scikit-learn scipy