如何将数字数组分成两个簇和 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)]
我有一个标量数组 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)]