Wie führe ich Cluster mit Gewichten / Dichte in Python aus? Etwas wie Kmeans mit Gewichten?

8

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?

    
Rolando 11.07.2017, 03:51
quelle

1 Antwort

6
  

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.

Demo

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:

%Vor%

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 .

%Vor%

Als Ergebnis erhalten wir die Gruppenzugehörigkeit (array y ) für jedes zentrale:

%Vor%

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:

%Vor%

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%

    
Tonechas 14.07.2017, 20:53
quelle