【问题标题】:kmeans scatter plot: plot different colors per clusterkmeans 散点图:为每个簇绘制不同的颜色
【发布时间】:2015-03-29 10:10:42
【问题描述】:

我正在尝试绘制 kmeans 输出的散点图,它将同一主题的句子聚集在一起。我面临的问题是将属于每个集群的点绘制成某种颜色。

sentence_list=["Hi how are you", "Good morning" ...] #i have 10 setences
km = KMeans(n_clusters=5, init='k-means++',n_init=10, verbose=1) 
#with 5 cluster, i want 5 different colors
km.fit(vectorized)
km.labels_ # [0,1,2,3,3,4,4,5,2,5]

pipeline = Pipeline([('tfidf', TfidfVectorizer())])
X = pipeline.fit_transform(sentence_list).todense()
pca = PCA(n_components=2).fit(X)
data2D = pca.transform(X)
plt.scatter(data2D[:,0], data2D[:,1])

km.fit(X)
centers2D = pca.transform(km.cluster_centers_)
plt.hold(True)
labels=np.array([km.labels_])
print labels

我的问题出在 plt.scatter() 的底部代码中;我应该为参数 c 使用什么?

  1. 当我在代码中使用c=labels 时,我得到这个错误:

number in rbg sequence outside 0-1 range

2.当我设置c= km.labels_ 时,我得到了错误:

ValueError: Color array must be two-dimensional

plt.scatter(centers2D[:,0], centers2D[:,1], 
            marker='x', s=200, linewidths=3, c=labels)
plt.show()

【问题讨论】:

    标签: python numpy matplotlib scipy k-means


    【解决方案1】:
    from sklearn.cluster import KMeans
    import matplotlib.pyplot as plt
    
    # Scaling the data to normalize
    model = KMeans(n_clusters=5).fit(X)
    
    # Visualize it:
    plt.figure(figsize=(8, 6))
    plt.scatter(data[:,0], data[:,1], c=model.labels_.astype(float))
    

    现在不同的簇有不同的颜色。

    【讨论】:

    • 请解释你的答案。
    • 美女!奇怪的是,我无法让 pandas 速记适用于这种情况(即使用 data.plot(...) 会引发 'c=' too many color element 错误。
    • Bang.Great Trick.Thanks for that.
    • 无论n_cluster 有多大,这是否保证每个集群的颜色唯一?
    • 您的答案中的数据来自哪里?你说的是X吗?即使是X,你怎么知道X的形状是(n, 2)?
    【解决方案2】:

    它应该可以工作:

    from sklearn.cluster import KMeans;
    cluster = KMeans(10);
    cluster.fit(M);
    
    cluster.labels_;
    
    plt.scatter(M[:,0],M[:,1], c=[matplotlib.cm.spectral(float(i) /10) for i in cluster.labels_]);   
    

    【讨论】:

    • 我喜欢这个想法,但是 Python 中的分号?
    • 使用分号是一种获取列或行的pythonic方式。这里分别获取包含所有行(列向量)的第一列和第二列。
    【解决方案3】:

    color=c= 属性应该是 matplotlib 颜色,如 plot 的文档中所述。

    要将整数标签映射到颜色,只需这样做

    LABEL_COLOR_MAP = {0 : 'r',
                       1 : 'k',
                       ....,
                       }
    
    label_color = [LABEL_COLOR_MAP[l] for l in labels]
    plt.scatter(x, y, c=label_color)
    

    如果您不想使用内置的单字符颜色名称,您可以使用其他颜色定义。请参阅有关 matplotlib 颜色的文档。

    【讨论】:

    • 我们如何使用 colormap 而不是手动为每个新集群输入颜色,以便将来更改集群编号时,我不必添加又换新颜色了?
    • 或者使用mpl.colors中的内置色图
    • @tcaswell 这是一个选项。但我猜你 1) 可能希望标签 ID 和颜色之间的映射显式,并且 2) 必须知道你的标签 ID 不大于颜色图中的颜色数。
    • 您只需要将它们全部缩放到 0 到 1 之间,以获得连续的颜色贴图。如果标签太多以至于无法解决连续颜色图上的差异,则说明标签过多
    • 是的,我认为你是对的。只是想指出潜在的坑:)
    猜你喜欢
    • 2022-11-05
    • 1970-01-01
    • 2021-01-08
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    相关资源
    最近更新 更多