Как проверить детали кластера данного вектора в k-средних в sklearn - PullRequest
3 голосов
/ 28 июня 2019

Я использую следующий код для кластеризации своих векторов слов с использованием алгоритма кластеризации k-средних.

from sklearn import cluster
model = word2vec.Word2Vec.load("word2vec_model")
X = model[model.wv.vocab]
clusterer = cluster.KMeans (n_clusters=6)
preds = clusterer.fit_predict(X)
centers = clusterer.cluster_centers_

Учитывая слово в словаре word2vec (например, word_vector = model['jeep']), я хочу получить его кластерИдентификатор и косинус расстояние до его центра кластера.

Я попробовал следующий подход.

for i,j in enumerate(set(preds)):
    positions = X[np.where(preds == i)]
    print(positions)

Однако он возвращает все векторы в каждом идентификаторе кластера и не совсем то, что я ищу.

Я с радостью предоставлю более подробную информацию, если это необходимо.

Ответы [ 2 ]

4 голосов
/ 28 июня 2019

После кластеризации вы получаете labels_ для всех ваших входных данных (в том же порядке, что и ваши входные данные), т.е. clusterer.labels_[model.wv.vocab['jeep'].index] даст вам кластер, к которому принадлежит jeep.

Вы можете рассчитать косинусное расстояние с помощью scipy.spatial.distance.cosine

cluster_index = clusterer.labels_[model.wv.vocab['jeep'].index]
print(distance.cosine(model['jeep'], centers[cluster_index]))
>> 0.6935321390628815

Полный код

Я не знаю, как выглядит ваша модель, но давайте использовать GoogleNews-vectors-negative300.bin.

from gensim.models import KeyedVectors
from sklearn import cluster
from scipy.spatial import distance

model = KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)

# let's use a subset to accelerate clustering
X = model[model.wv.vocab][:40000]

clusterer = cluster.KMeans (n_clusters=6)
preds = clusterer.fit_predict(X)
centers = clusterer.cluster_centers_

cluster_index = clusterer.labels_[model.wv.vocab['jeep'].index]
print(cluster_index, distance.cosine(model['jeep'], centers[cluster_index]))
1 голос
/ 28 июня 2019

Вот моя попытка!

from gensim.test.utils import common_texts
from gensim.models import Word2Vec

model = Word2Vec(common_texts, size=100, window=5, min_count=1, workers=4)

from sklearn.cluster import KMeans

clustering_model = KMeans(n_clusters=2)

preds = clustering_model.fit_predict([model.wv.get_vector(w) for w in model.wv.vocab])

Чтобы получить прогноз для идентификатора кластера

>>> clustering_model.predict([model.wv.get_vector('computer')])
# array([1], dtype=int32)

Чтобы получить косинусное сходство между данным словом и кластерными центрами

>>> from sklearn.metrics.pairwise import cosine_similarity
>>> cosine_similarity(clustering_model.cluster_centers_, [model.wv.get_vector('computer')])

# array([[-0.07410881],
       [ 0.34881588]])
...