我有一个标量数字数组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或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)]