Определить кластерные центры вручную - PullRequest
1 голос
/ 13 февраля 2020

Делая кластерный анализ Kmeans, как мне вручную определить определенный кластер-центр? Например, я хочу сказать, что мои кластерные центры - это [1,2,3] и [3,4,5], и теперь я хочу кластеризовать свои векторы в предварительно определенные центры.

что-то вроде kmeans.cluster_centers_ = [[1,2,3],[3,4,5]]?

чтобы обойти мою проблему, вот что я делаю:

number_of_clusters = len(vec)
kmeans = KMeans(number_of_clusters, init='k-means++', n_init=100)
kmeans.fit(vec)

это в основном определяет кластер для каждого вектора. Но требуются годы, чтобы вычислить, поскольку у меня есть тысячи векторов / предложений. Должна быть возможность установить координаты вектора непосредственно как координаты кластера без необходимости вычислять их с помощью алгоритма kmeans. (поскольку выходные данные центра в основном являются векторными координатами после того, как я запустил алгоритм ...)

Изменить, чтобы быть более точным c о моей задаче:

Итак, я хочу, чтобы я есть тонны векторов (сгенерированных из предложений), и теперь я хочу сгруппировать их. Но представьте, у меня есть два столбца предложений и я всегда хочу отсортировать предложение столбца B в предложение столбца A. Не колонка предложений друг другу. Вот почему я хочу установить кластерные центры для векторов столбцов A, а затем предсказать самые короткие векторы B для этих центров. Надеюсь, что это имеет смысл

Я использую Sklearn Kmeans ATM

1 Ответ

2 голосов
/ 17 февраля 2020

Я думаю, я знаю, что ты хочешь сделать. Таким образом, вы хотите вручную выбрать центроиды для k-средних с некоторыми известными примерами, а затем выполнить кластеризацию, чтобы назначить точки данных сгустков для ваших предварительно определенных центроидов.

Параметр, который вы ищете, - это инициализация k-Means с именем init см. документация .

Я подготовил небольшой пример, который будет делать именно это.

import numpy as np
from sklearn.cluster import KMeans
from scipy.spatial import distance_matrix

# 5 datapoints with 3 features
data = [[1, 0, 0],
        [1, 0.2, 0],
        [0, 0, 1],
        [0, 0, 0.9],
        [1, 0, 0.1]]

X = np.array(data)

distance_matrix(X,X)

Матрица парных расстояний показывает, какие примеры являются сгустками.

> array([[0.        , 0.2       , 1.41421356, 1.3453624 , 0.1       ],
>       [0.2       , 0.        , 1.42828569, 1.36014705, 0.2236068 ],
>       [1.41421356, 1.42828569, 0.        , 0.1       , 1.3453624 ],
>       [1.3453624 , 1.36014705, 0.1       , 0.        , 1.28062485],
>       [0.1       , 0.2236068 , 1.3453624 , 1.28062485, 0.        ]])

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

centroid_idx = [0,2] # let data point 0 and 2 be our centroids
centroids = X[centroid_idx,:]
print(centroids) # [[1. 0. 0.]
                 # [0. 0. 1.]]

kmeans = KMeans(n_clusters=2, init=centroids, max_iter=1) # just run one k-Means iteration so that the centroids are not updated

kmeans.fit(X)
kmeans.labels_

>>> array([0, 0, 1, 1, 0], dtype=int32)

Как вы можете видеть, k-Means помечает точки данных, как и ожидалось. Возможно, вы захотите пропустить параметр max_iter, если хотите, чтобы ваши центроиды были обновлены.

...