手动定义聚类中心

Define cluster centers manually

做Kmeans聚类分析,如何手动定义某个聚类中心? 例如,我想说我的聚类中心是 [1,2,3] 和 [3,4,5],现在我想将我的向量聚类到预定义的中心。

类似于 kmeans.cluster_centers_ = [[1,2,3],[3,4,5]] ?

为了解决我的问题,这就是我在 atm 所做的事情:

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

它基本上为每个向量定义了一个簇。但是计算需要很长时间,因为我有数千个 vectors/sentences。必须有一个选项可以直接将矢量坐标设置为簇坐标,而无需使用 kmeans 算法计算它们。 (因为中心输出基本上是我 运行 算法之后的矢量坐标...)

编辑以更具体地说明我的任务:

所以我想要的是我有大量的向量(从句子生成),现在我想对它们进行聚类。但是假设我有两列句子,并且总是想将 B 列句子排序为 A 列句子。互不A列句。这就是为什么我想为 A 列向量设置聚类中心,然后预测最接近这些中心的 B 向量。希望这是有道理的

我正在使用 sklearn kmeans atm

我想我知道你想做什么。因此,您想使用一些已知示例手动 select k-Means 的质心,然后执行聚类以将最接近的数据点分配给您的预定义质心。

您要查找的参数是名为 init 的 k-Means 初始化,请参阅 documentation

我准备了一个小例子来完成这个。

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.        ]])

您可以 select 某些数据点用作您的初始质心

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 参数。