Kmeans:将数据点重新分配给第二近的?

Kmeans: Reassign data point to second nearest?

我有一个经过训练的 Scikit Kmean 模型。

使用模型预测函数时,模型会将给定数据点分配给最近的集群。 (符合预期)

让模型将数据点分配给第二近或第三近的集群的最简单方法是什么?

我好像到处都找不到这个。 (我可能遗漏了一些重要的东西。)

Kmeans classifier has a transform(X)方法,returns每条记录到每个聚类质心的距离,以数组的形式,形状为[n_observations, n_clusters]

这样,您就可以选择要将记录分配到哪个集群。

示例:

import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import load_digits
from sklearn.preprocessing import scale

np.random.seed(42)

digits = load_digits()
data = scale(digits.data)
n_digits = len(np.unique(digits.target))

km = KMeans(init='k-means++', n_clusters=n_digits, n_init=10)
km.fit(data)
predicted = km.predict(data)
dist_centers = km.transform(data)

为了验证 transform 输出,我们可以将 predict 的结果与取质心距离的最小值进行比较:

>>> np.allclose(km.predict(data), np.argmin(dist_centers, axis=1))
True

最后,我们可以使用np.argsort获取distances数组中每一行排序元素的索引,使得结果的第一列对应最近簇的标签,第二列对应于第二个最近的集群的标签,依此类推。

>>> print(predicted)
[0 3 3 ... 3 7 7]

>>> print(np.argsort(dist_centers, axis=1))
[[0 7 4 ... 8 6 5]
 [3 9 4 ... 6 0 5]
 [3 9 4 ... 8 6 5]
 ...
 [3 1 9 ... 8 6 5]
 [7 0 9 ... 8 6 5]
 [7 3 1 ... 9 6 5]]