2016-11-13 1 views
1

Ich habe eine Funktion:Wie in KMeans in single shot bedeuten finden mit numpy

def update(points, closest, centroids): 
    return np.array([points[closest==k].mean(axis=0) for k in range(centroids.shape[0])]) 

Es besteht im Wesentlichen die Aktualisierung von Zentroiden in KMeans Algorithmus Schritt. Grundsätzlich weist eine Matrix, in der Nähe ist eine Zuordnung von einem Punkt zu einem Cluster ..

und dann alles, was ich tue, ist das neue Mittel auf Punkte in einem Cluster auf Basis finden ..

aber ich war frage mich, ob ich diese For-Schleife loswerden kann? Welches ist, wenn ich den Cluster-Mittelwert in einem Schuss finden kann?

+0

ich einen Tipp zu diesem Code haben. Sie könnten es gegen einen Generator eintauschen, indem Sie die np.array ([Punkte .., .. Form [0])]) für np.array (Punkte .., .. Form [0])) austauschen, wodurch bedeutungsloser Speicher gelöscht wird Overhead. – Simon

Antwort

1

Hier ist ein vektorisiert Ansatz basiert auf np.add.reduceat -

c = np.bincount(closest,minlength=centroids.shape[0]) 
mask = c != 0 
pts_grp = points[closest.argsort()] 
cut_idx = np.append(0,c[mask].cumsum()[:-1]) 
out = np.full((centroids.shape[0],points.shape[1]),np.nan) 
out[mask] = np.add.reduceat(pts_grp,cut_idx,axis=0)/c[mask,None].astype(float)