首页 > 解决方案 > 如何将一组数字分成两个簇并返回对应索引的两个子集?

问题描述

我有一个标量数组pm, 和一个索引列表,idx,所以pm[idx]是 的子集pm。如何pm[idx]分成两个簇(根据欧几里得距离)并获得两组对应的索引(最好使用scikit-learn)?

例如,

pm = array([0,1,2,3,4,100,105])
idx = [0,2,3,5,6]

我怎样才能获得idx1 = [0,2,3]and idx2 = [5,6]

标签: scikit-learnsubsetcluster-analysis

解决方案


基本上你想过滤你的数据pm,这可以用你的 idx 数组轻松完成。您可以对过滤后的数据进行聚类以获得两个组。

可以完美应用基于分区的聚类算法,例如k-MeansSingleLink 。scikit-learn你可以使用/sklearn.cluster.AgglomerativeClustering.

由于这些聚类算法希望您的数据具有列中的特征和行中的实例,因此您需要重塑数据。

然后,您可以从生成的集群标签中使用列表推导创建单独的索引数组。(没有找到一个相同的numpy函数)

您的解决方案可能如下所示:

cluster_algorithm = AgglomerativeClustering(n_clusters=2)
labels = cluster_algorithm.fit_predict(np.expand_dims(pm[idx], axis=-1))

print(labels)
>>> [1 1 1 0 0]

idx_labels = [np.where(labels == e)[0] for e in set(labels)]
idx_labels  # [array([3, 4], dtype=int64), array([0, 1, 2], dtype=int64)]

推荐阅读