kmeans scatter plot: участок разных цветов в кластере
Я пытаюсь сделать диаграмму рассеяния вывода 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?
- когда я использую
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()
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 цвета.
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))
теперь у вас есть другой цвет для разных кластеров.
Это должно работать:
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_]);