我有一个经过训练的 Scikit Kmean 模型。
当使用模型预测函数时,模型将给定的数据点分配给最近的聚类。 (正如预期的那样)
让模型将数据点分配给第二个最近或第三个最近的簇的最简单方法是什么?
我似乎无法在任何地方找到这个。 (我可能错过了一些重要的东西。)
最佳答案
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数组中每行已排序元素的索引,使得结果的第一列对应于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 - K均值: Reassign data point to second nearest?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57833545/