2012-03-23 8 views
8

kmeansのプロット出力はどのようにしてPythonでクラスタリングされますか? 私はPyClusterパッケージを使用しています。 allUserVectorは、n×m次元のベクトルであり、基本的にm個の特徴を有するn人のユーザである。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 

私は、ユーザーがcluster.EachユーザがM次元ベクトル 任意の入力である、ある明確クラスタを示すグラフでうまくクラスタを印刷したいですか?

答えて

15

m次元データをプロットするのは難しいです。これを行う1つの方法は、Principal Component Analysis (PCA)を介して2次元空間にマップすることです。これを実行したら、matplotlib(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]) 

あなたは数字以外のものをプロットしたい場合は、単にannotateに最初の引数を変更します。たとえば、ユーザー名などを入力することができます。

クラスタリングは、実際にクラスタリングが行われたスペースではないため、このスペースでは「間違っている」ように見える場合があります(たとえば、15が緑色よりも赤色に近いように見えます)。この場合、分散の61%:

>>> np.cumsum(users_pca.fracs) 
array([ 0.36920636, 0.61313708, 0.81661401, 0.95360623, 1.  ]) 
関連する問題