web-dev-qa-db-ja.com

kmeans散布図:クラスターごとに異なる色をプロット

同じトピックの文をクラスター化する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()
14
jxn

color=またはc=プロパティは、 plot のドキュメントで説明されているように、matplotlibカラーである必要があります。

整数ラベルを色にマッピングするには、次のようにします

LABEL_COLOR_MAP = {0 : 'r',
                   1 : 'k',
                   ....,
                   }

label_color = [LABEL_COLOR_MAP[l] for l in labels]
plt.scatter(x, y, c=label_color)

組み込みの1文字の色名を使用したくない場合は、他の色定義を使用できます。 matplotlibの色に関するドキュメントを参照してください。

5
Hannes Ovrén
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))

これで、クラスターごとに異なる色になります。

17
Zhenye Na

それはうまくいくはずです:

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_]);   
0
user3805442