2012-03-23 17 views
8

Wie erfolgt die Plot-Ausgabe von Kmeans Clustering in Python? Ich verwende PyCluster-Paket. allUserVector ist ein n mal m dimensionaler Vektor, im Prinzip n Benutzer mit m Features.Plotten der Ausgabe von Kmeans (PyCluster impl)

import Pycluster as pc 
import numpy as np 

clusterid,error,nfound = pc.kcluster(allUserVector, nclusters=3, transpose=0,npass=1,method='a',dist='e') 
    clustermap, _, _ = pc.kcluster(allUserVector, nclusters=3,         transpose=0,npass=1,method='a',dist='e',) 

centroids, _ = pc.clustercentroids(allUserVector, clusterid=clustermap) 
print centroids 
print clusterid 
print nfound 

Ich möchte die Cluster schön in einem Diagramm drucken, die die Cluster zeigt deutlich, welche Benutzer in denen cluster.Each Benutzer ein Alle Eingänge m-dimensionalen Vektor ist?

Antwort

15

Es ist schwer zu plotten m -dimensionale Daten. Ein Weg, dies zu tun, besteht darin, in einen 2D-Raum durch Principal Component Analysis (PCA) zu mappen. Sobald wir das getan haben, können wir sie mit matplotlib auf ein Plot werfen (basierend auf this answer).

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import mlab 
import Pycluster as pc 

# make fake user data 
users = np.random.normal(0, 10, (20, 5)) 

# cluster 
clusterid, error, nfound = pc.kcluster(users, nclusters=3, transpose=0, 
             npass=10, method='a', dist='e') 
centroids, _ = pc.clustercentroids(users, clusterid=clusterid) 

# reduce dimensionality 
users_pca = mlab.PCA(users) 
cutoff = users_pca.fracs[1] 
users_2d = users_pca.project(users, minfrac=cutoff) 
centroids_2d = users_pca.project(centroids, minfrac=cutoff) 

# make a plot 
colors = ['red', 'green', 'blue'] 
plt.figure() 
plt.xlim([users_2d[:,0].min() - .5, users_2d[:,0].max() + .5]) 
plt.ylim([users_2d[:,1].min() - .5, users_2d[:,1].max() + .5]) 
plt.xticks([], []); plt.yticks([], []) # numbers aren't meaningful 

# show the centroids 
plt.scatter(centroids_2d[:,0], centroids_2d[:,1], marker='o', c=colors, s=100) 

# show user numbers, colored by their cluster id 
for i, ((x,y), kls) in enumerate(zip(users_2d, clusterid)): 
    plt.annotate(str(i), xy=(x,y), xytext=(0,0), textcoords='offset points', 
       color=colors[kls]) 

Wenn Sie etwas anderes als Zahlen dargestellt werden soll, ändern Sie einfach das erste Argument annotate. Sie können zum Beispiel Benutzernamen oder etwas tun.

Beachten Sie, dass die Cluster in diesem Bereich möglicherweise etwas "falsch" aussehen (z. B. 15 scheint näher an Rot als unten), da es sich nicht um den eigentlichen Speicherplatz handelt. In diesem Fall bleiben die ersten beiden Komponenten erhalten 61% der Abweichung:

>>> np.cumsum(users_pca.fracs) 
array([ 0.36920636, 0.61313708, 0.81661401, 0.95360623, 1.  ])