Python группировка списка
Как можно разделить такой массив на похожие элементы?
list_coord = [[1, 1, 1], [2, 1, 1], [1, 1, 1], [1, 2, 2],
[12, 11, 11], [11, 13, 13], [13, 12, 12],
[7, 6, 6], [6, 6, 6], [6, 7, 7], [8, 8, 8]]
Чтобы на выходе получить:
dct = [{'Объект 1': [[1, 1, 1], [2, 1, 1], [1, 1, 1], [1, 2, 2]]},
{'Объект 2': [[7, 6, 6], [6, 6, 6], [6, 7, 7], [7, 6, 7]]},
{'Объект 3': [[12, 11, 11], [11, 13, 13], [13, 12, 12]]}]
Моя первая идея посчитать вектор от точки [0, 0, 0] до каждой моей точки
dst = sorted([distance.euclidean(i, [0, 0, 0]) for i in list_coord])
Получаю вот такой массив:
lst = [1.732, 1.732, 2.449, 3.0, 10.392, 11.0, 11.575, 13.856, 19.646, 21.377, 21.424]
Что можно дальше сделать? На выходе впринцепе не обязательно массив из словарей, и такой вариант подойдёт - "list_coord содержит 3 разных объекта"
Предполагаю что могу использовать метод по разнице между "соседями"
допустим (3):
объект_1 = {1.7,1.7,2.4, 3.0}
объект_2 = {10.3, 11.0, 11.5, 13.8}
объект_3 = {19.6, 21.3, 21.4}
Ответы (1 шт):
Можно попробовать использовать KMeans для кластеризации и silhouette_score для оценки, насколько хорошо кластеризация удалась. Таким образом можно найти оптимальное кол-во кластеров. Можно и сами метки кластеров тоже вывести:
from sklearn import metrics
import numpy as np
from sklearn.cluster import KMeans
lst = [1.732, 1.732, 2.449, 3.0, 10.392, 11.0, 11.575, 13.856, 19.646, 21.377, 21.424]
X = np.array(lst).reshape(-1, 1)
scores = []
for i in range(2,10):
kmeans_model = KMeans(n_clusters=i, random_state=1).fit(X)
labels = kmeans_model.labels_
scores.append((metrics.silhouette_score(X, labels, metric='euclidean'),i,labels))
ms = max(scores)
print('Оптимальное число кластеров:', ms[1])
print(list(zip(lst,ms[2])))
Вывод:
Оптимальное число кластеров: 3
[(1.732, 2), (1.732, 2), (2.449, 2), (3.0, 2), (10.392, 0), (11.0, 0), (11.575, 0), (13.856, 0), (19.646, 1), (21.377, 1), (21.424, 1)]
Т.е. оптимум тут 3 кластера, и дальше показано, к какому номеру кластера были отнесены образцы данных.