【问题标题】:Plotting output of kmeans(PyCluster impl)绘制 kmeans 的输出(PyCluster impl)
【发布时间】:2012-04-08 11:24:00
【问题描述】:

python 中 kmeans 聚类的绘图输出如何? 我正在使用 PyCluster 包。 allUserVector 是一个 n x m 维向量,基本上是 n 个用户,具有 m 个特征。

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

我想在图表中很好地打印集群,清楚地显示集群哪些用户在哪个集群中。每个用户都是一个 m 维向量 有输入吗?

【问题讨论】:

    标签: python cluster-analysis k-means


    【解决方案1】:

    绘制m 维数据有点困难。一种方法是通过Principal Component Analysis (PCA) 映射到二维空间。完成此操作后,我们可以使用 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.        ])
    

    【讨论】:

      猜你喜欢
      • 2020-07-19
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 2020-03-09
      • 2014-01-01
      • 2011-07-02
      • 2018-10-28
      相关资源
      最近更新 更多