Als Beispiel I habe die folgenden Eingangsdaten (die Punktwolke ich arbeite mit komplexer ist)Punktwolken Cluster-Analyse in Python - Identifizieren von Clustern von Binärmatrix
Data = [1,1,1,1,1],[1,1,2,1,1],[2,2,2,1,1],[3,3,3,1,1],[4,4,4,1,1],[5,5,5,1,1],[50,50,50,1,1],[95,95,95,1,1],[96,96,96,1,1],[97,97,97,1,1],[98,98,98,1,1],[99,99,99,1,1],[2,2,3,1,1],[2,2,1,1,1],[2,2,4,1,1]
ein Clustering-Algorithmus gibt eine binäre obere Dreiecksmatrix (lassen Sie uns Verbindungsmatrix nennen). Eine 1 bedeutet, dass zwei Punkte verbunden sind. Z.B. Punkt ID 0 (Zeile 0) ist mit sich selbst verbunden (Spalte 0), und 1,2,3,12,13,14. Aber Punkte 4 und 5 werden ebenfalls über 3 erreicht haben, 12, 13 und 14.
[ 1. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1.]
[ 0. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1.]
[ 0. 0. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1.]
[ 0. 0. 0. 1. 1. 1. 0. 0. 0. 0. 0. 0. 1. 1. 1.]
[ 0. 0. 0. 0. 1. 1. 0. 0. 0. 0. 0. 0. 1. 0. 1.]
[ 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
kann ich den Cluster pro Reihe mit rowclustering (n) identifizieren, wobei S die binäre Matrix von oben ist.
def rowclustering(s):
r = 0
idx = []
while r < size(s,0):
row = []
for i in range(size(s,1)):
if s[r][i] == 1:
row = row + [i]
r = r + 1
idx = idx + [row]
return idx
Und die zurück idx ist:
idx = [[0, 1, 2, 3, 12, 13, 14], [1, 2, 3, 12, 13, 14], [2, 3, 4, 12, 13, 14], [3, 4, 5, 12, 13, 14], [4, 5, 12, 14], [5], [6], [7, 8, 9], [8, 9, 10], [9, 10, 11], [10, 11], [11], [12, 13, 14], [13, 14], [14]]
Nun, natürlich gibt es weniger Cluster als 15, weil einige Zeilen über eine gemeinsame ID (zB buchen, ID 4 und 5) verbunden sind, . Was ich haben will ist:
result = [[0, 1, 2, 3, 4, 5, 12, 13, 14], [6], [7, 8, 9, 10, 11]]
Ich habe versucht, eine Funktion (Clustering (idx, f)) zu erstellen, die das tut, wo idx, ist das Ergebnis der rowclustering (e) und f wäre der erste Zeile in idx, z [0, 1, 2, 3, 12, 13, 14]. Diese Funktion wird jedoch nicht ordnungsgemäß beendet. Was wäre der richtige Code, um die Funktion zu unterbrechen, nachdem alle Verbindungen (von IDX-IDs) hergestellt wurden?
def clustering(idx,f):
for i in f:
f = f + idx[i]
f = list(set(f))
clustering(idx,f)
return
Das Problem, das ich versuche zu lösen, ist eine, Art, selbst wachsendes Verfahren. Das Funktionscluster sollte sich selbst aufrufen, bis alle möglichen Punktverbindungen hergestellt sind. Dies könnte auf dem Idx oder (vielleicht besser) auf der Verbindungsmatrix (Matrixreduktion?) Erfolgen.
Jede Hilfe wird sehr geschätzt! Lassen Sie es mich wissen, wenn ich meine Frage klären sollte. Vielen Dank.
Ihr Clustering (idx, f) Funktion kann nie wieder zurückkehrt, wird es bis zu einem Stapelüberlauf – portforwardpodcast
Werfen Sie einen Blick auf DBSCAN und Single-Link-Rekursion nur. Aber du brauchst connected = 0 statt 1. –