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]]
我有一个经过训练的 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]]