scikit k-means:查找属于特定质心生成集群的数据点
Posted
技术标签:
【中文标题】scikit k-means:查找属于特定质心生成集群的数据点【英文标题】:scikit k-means: Find data-points that belong to resulting cluster of specific centroids 【发布时间】:2019-11-26 17:13:11 【问题描述】:所以,我有以下 sn-p 在 k-means 上工作以生成 2 个集群。 虽然,我们能够找到 2 个结果聚类的质心以及每个聚类标签有多少数据点的计数, 有没有办法知道质心为特定值或大于某个值的每个集群的数据点。
from sklearn.cluster import KMeans
import numpy as np
x = np.random.random(100)
# print(x)
km = KMeans(n_clusters=2)
# km = KMeans(n_clusters=3, verbose=1)
estimator = km.fit(x.reshape(-1,1))
print("centroids: ", km.cluster_centers_)
print("labels: ", km.labels_)
mydict = i: np.where(km.labels_ == i)[0] for i in range(km.n_clusters)
print(mydict)
输出:
centroids: [[0.78049437]
[0.28805844]]
labels: [0 0 1 0 1 0 0 0 1 1 0 0 1 1 1 1 1 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1
1 1 1 0 1 0 1 0 1 1 1 1 0 1 1 1 1 1 0 1 0 0 0 1 1 0 1 1 1 0 0 0 0 0 1 1 0
0 1 1 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 0 1 1 1 0 1 0 0]
0: array([ 0, 1, 3, 5, 6, 7, 10, 11, 18, 20, 22, 23, 25, 28, 30, 31, 33,
34, 35, 40, 42, 44, 49, 55, 57, 58, 59, 62, 66, 67, 68, 69, 70, 73,
74, 78, 80, 86, 89, 91, 92, 96, 98, 99]), 1: array([ 2, 4, 8, 9, 12, 13, 14, 15, 16, 17, 19, 21, 24, 26, 27, 29, 32,
36, 37, 38, 39, 41, 43, 45, 46, 47, 48, 50, 51, 52, 53, 54, 56, 60,
61, 63, 64, 65, 71, 72, 75, 76, 77, 79, 81, 82, 83, 84, 85, 87, 88,
90, 93, 94, 95, 97])
简而言之,字典中的键现在是我想成为集群中心的集群标签。如下所示:
0.78049437: array[0, 1, 3, 5..]
0.28805844: array[40, 42, 44, 49, ..]
感谢任何帮助。
【问题讨论】:
【参考方案1】:对您的字典理解稍作改动即可:
my_dict = km.cluster_centers_[i, 0]: np.where(km.labels_ == i)[0] for i in range(km.n_clusters)
【讨论】:
【参考方案2】:请注意,k-means 侧重于寻找中心,而不是分割阈值。所以它不是一维数据的特别好的方法(不是很快,因为算法是为多变量数据设计的)。我宁愿在核密度估计中找到最小值来识别分裂点,并将结果范围描述为 (min,max) 区间。
【讨论】:
以上是关于scikit k-means:查找属于特定质心生成集群的数据点的主要内容,如果未能解决你的问题,请参考以下文章
如何在 python Scikit-learn 中获得凝聚聚类“质心”