Как я могу разделить массив чисел на два кластера и вернуть два подмножества соответствующих индексов? - PullRequest
0 голосов
/ 10 марта 2020

У меня есть массив скалярных чисел 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]?

1 Ответ

1 голос
/ 11 марта 2020

в основном вы хотите отфильтровать ваши данные 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)]
...