Я хочу сгруппировать числа в списке, основываясь на том, насколько «велики» числа по сравнению с их соседями, но я хочу делать это непрерывно и, если возможно, с помощью кластеризации. Для пояснения приведу пример:
Предположим, у вас есть список
lst = [10, 11.1, 30.4, 30.0, 32.9, 4.5, 7.2]
тогда, если у нас есть 3 группы, очевидно, как кластеризовать. Запуск алгоритма k-средних из sklearn (см. Код) подтверждает это. Но когда цифры в списке не такие «удобные», у меня возникают проблемы. Предположим, у вас есть список:
lst = [10, 11.1, 30.4, 30.0, 32.9, 6.2, 31.2, 29.8, 12.3, 10.5]
Моя проблема теперь двоякая:
Мне нужна какая-то «линейная» кластеризация с сохранением порядка, которая учитывает порядок данных. Для приведенного выше списка алгоритм кластеризации должен дать мне желаемый результат вида
lst = [0,0,1,1,1,1,1,1,2,2]
Если вы посмотрите на этот вывод выше, вы также увидите, что я хочу, чтобы значение 6,2 кластеризовалось во втором кластере, т.е. я хочу, чтобы алгоритм кластера рассматривал его как выброс, а не как совершенно новый кластер ,
РЕДАКТИРОВАТЬ Для пояснения я хочу иметь возможность указать количество кластеров в процессе линейной кластеризации, то есть «конечную сумму» кластеров.
Код:
import numpy as np
from sklearn.cluster import KMeans
lst = [10, 11.1, 30.4, 30.0, 32.9, 4.5, 7.2]
km = KMeans(3,).fit(np.array(lst).reshape(-1,1))
print(km.labels_)
# [0 0 1 1 1 2 2]: OK output
lst = [10, 11.1, 30.4, 30.0, 32.9, 6.2, 31.2, 29.8, 12.3, 10.5]
km = KMeans(3,).fit(np.array(lst).reshape(-1,1))
print(km.labels_)
# [0 0 1 1 1 2 1 1 0 0]. Desired output: [0 0 1 1 1 1 1 1 2 2]