Я думаю, я знаю, что ты хочешь сделать. Таким образом, вы хотите вручную выбрать центроиды для 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
, если хотите, чтобы ваши центроиды были обновлены.