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

使用模型的预测功能时,模型会将给定的数据点分配给最近的聚类。 (如预期)

取而代之的是,模型最简单的方法是将数据点分配给SECOND最近的集群或THIRD最近的集群?

我似乎在任何地方都找不到。 (我可能缺少一些必不可少的东西。)

最佳答案

Kmeans分类器具有transform(X)方法,该方法以形状为[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]]

关于python - Kmeans:将数据点重新分配到第二最近的位置?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57833545/

10-12 15:01