如何将数字数组分为两个簇并返回两个对应索引的子集?

问题描述 投票:0回答:1

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

scikit-learn subset cluster-analysis
1个回答
0
投票

基本上,您希望过滤数据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)]
© www.soinside.com 2019 - 2024. All rights reserved.