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. ])