使用scikit-learn.k-means库,输出每个簇中最接近的50个样本。

12

我已经使用Python中的scikit-learn库在5000多个样本上运行了一个k-means算法。 我想要输出50个最接近聚类中心的样本。 我如何执行此任务?

3个回答

16
如果km是k-means模型,那么对于数组X中的每个点,到第j个质心的距离为:
d = km.transform(X)[:, j]

这会给出一个长度为len(X)的距离数组。与质心j最接近的50个索引是:
ind = np.argsort(d)[::-1][:50]

因此,到质心最近的50个点是

X[ind]

(如果您的 NumPy 版本足够新,请使用 argpartition,因为它更快)

5
为何在 argsort 后面加上 "-1"?既然你想要最短的距离,而 argsort 默认是升序排列,那么你不应该添加这个参数吗? - mdubez
4
在argsort中的“-1”是不必要的,并且会翻转顺序,正如@mdubez所指出的那样。 - optimist

11

@snarly的回答有一个错误需要更正。

在执行d = km.transform(X)[:, j]之后, d的元素是到centroid(j)距离而不是相似度。

因此,为了给出最接近的前50个索引,您应该删除“-1”,即

ind = np.argsort(d)[::][:50]

(通常,d具有按升序排列的距离得分。)

另外,也许更简短的方法是:

ind = np.argsort(d)[::-1][:50] 可以写成

ind = np.argsort(d)[:-51:-1]


0
如果您有距离中心值的列表,可以使用排序功能。
results = [(distance_to_center, (x, y)), (distance_to_center, (x, y)), ...]
results.sort()
# get closest 50
closest_fifty = results[:50]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接