如何将数字数组分成两个簇和 return 相应索引的两个子集?

How can I separate an array of numbers into two clusters and return two subsets of corresponding indexes?

我有一个标量数组 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]idx2 = [5,6]

基本上你想过滤你的数据 pm 这可以很容易地用你的 idx 数组完成。您可以对过滤后的数据进行聚类以获得两组。

可以完美应用k-Means or SingleLink等基于分区的聚类算法。在 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)]