Как построить вывод кластеризации k-средних для встраивания слов, используя python? - PullRequest
0 голосов
/ 13 марта 2020

Я использовал вложения слов gensims, чтобы найти векторы каждого слова. Затем я использовал K-средства, чтобы найти группы слов. Есть около 10,000 токенов / слов, и я хочу построить их.

Я хочу построить результат следующим образом:

  • Аннотировать точки с именем words
  • Другой цвет для кластеров

Вот что я сделал.

tsne = TSNE(perplexity=40, n_components=2, init='pca', n_iter=500)#, random_state=13)


def tsne_plot(data):
    "Creates and TSNE model and plots it"

    data=data.sample(n = 500).reset_index()
    word=data["word"]
    cluster=data["clusters"]
    data=data.drop(["clusters","word"],axis=1)

    X = tsne.fit_transform(data)

    plt.figure(figsize=(48, 48)) 
    for i in range(len(X)):
        plt.scatter(X[:,0][i],X[:,1][i],c=cluster[i])
        plt.annotate(word[i],
                     xy=(X[:,0][i],X[:,1][i]),
                     xytext=(3, 2),
                     textcoords='offset points',
                     ha='right',
                     va='bottom')
    plt.show()

tsne_plot(data)

Несмотря на то, что он аннотирует words, но не в состоянии окрашивать различные группы / кластеры?

Есть ли какой-либо другой подход, который аннотирует слова anmes и окрашивает различные кластеры?

1 Ответ

1 голос
/ 13 марта 2020

Как обычно это делается; с аннотациями и цветами радуги.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# %matplotlib inline
from sklearn.cluster import KMeans
import seaborn as sns
import matplotlib.pyplot as plt


X = np.array([[5,3],
     [10,15],
     [15,12],
     [24,10],
     [30,45],
     [85,70],
     [71,80],
     [60,78],
     [55,52],
     [80,91],])

kmeans = KMeans(n_clusters=2)
kmeans.fit(X)

print(kmeans.cluster_centers_)

print(kmeans.labels_)

#plt.scatter(X[:,0],X[:,1], c=kmeans.labels_, cmap='rainbow')

data = X
labels = kmeans.labels_


#######################################################################


plt.subplots_adjust(bottom = 0.1)
plt.scatter(data[:, 0], data[:, 1], c=kmeans.labels_, cmap='rainbow') 

for label, x, y in zip(labels, data[:, 0], data[:, 1]):
    plt.annotate(
        label,
        xy=(x, y), xytext=(-20, 20),
        textcoords='offset points', ha='right', va='bottom',
        bbox=dict(boxstyle='round,pad=0.5', fc='red', alpha=0.5),
        arrowprops=dict(arrowstyle = '->', connectionstyle='arc3,rad=0'))

plt.show()


#######################################################################

enter image description here

Для получения подробной информации см. ссылку ниже.

https://stackabuse.com/k-means-clustering-with-scikit-learn/

См. Ссылку ниже для некоторых примеров того, как делать аннотации с символами, а не с загаром.

enter image description here

https://nikkimarinsek.com/blog/7-ways-to-label-a-cluster-plot-python

...