Комментарии 24
Проверьте на устойчивость. На ваших же данных — прибавьте к координатам каждой точки случайные числа.
Ну и для ваших данных, понятное дело, не подходит k-means — тут нужен какой-то из методов, объединяющих кластеры "по ближайшему соседу", с ними и следовало сравнивать.
Думаю очевидно что помехи и шум не повлияют на результат.
Вот тут уже что-то пишут: https://scikit-learn.org/stable/modules/neighbors.html
На рисунках 1 и 2 приведены результаты классификации метода k-средних и нового метода классификации.
Здесь (и везде в других местах) говорить «классификация» некорректно.
В целом, рекомендую автору ознакомиться с другими алгоритмами кластеризации (например, тут), потому что сравнение с k-means выглядит неубедительно.
По результату сравнения двух методов, видно очевидное преимущество авторского метода, в его способности обнаружения кластеров сложной топологии.
Нет, не очевидно. Дайте метрики какие-нибудь на пачке стандартных датасетов. Дайте результаты на реальных данных.
В конце концов, дайте реализацию с каким-нибудь стандартным интерфейсом (похожим на sklearn-овский, например), чтобы люди могли сравнить.
А то пока звучит как очередное изобретение вечного двигателя.
Отсутствие метрик в статье и сравнение на синтетических данных с сомнительной SotA (k-means для данных такого вида и правда сомнительный, уж простите) выглядит неубедительно.
np.abs(arr_x-arr_y) < d
По результату сравнения двух методов, видно очевидное преимущество авторского метода, в его способности обнаружения кластеров сложной топологии.
нихрена. сам метрика примитивна.
Реализациея на коленке:
import numpy as np
import pprint as pp
arr = np.array([[1,2,3] , [1,3,5] , [1,1,1] , [2,2,2] , [7,7,7]])
def clasterize_woting(arr,d ):
objects_amount = len (arr)
input_dim = len(arr[0])
#woting_mx = np.zeros((objects_amount,objects_amount))
woting_mx = {}
for x in range(objects_amount-1):
arr_x = arr[x]
for y in range(x+1,objects_amount):
arr_y = arr[y]
wotes = np.sum(np.abs(arr_x-arr_y) < d)
woting_mx[(x,y)] = wotes
return woting_mx
w = clasterize_woting(arr,2)
pp.pprint(w)
с результатом:
{(0, 1): 2,
(0, 2): 2,
(0, 3): 3,
(0, 4): 0,
(1, 2): 1,
(1, 3): 2,
(1, 4): 0,
(2, 3): 3,
(2, 4): 0,
(3, 4): 0}
объединил сильно ([1,1,1], [2,2,2],[1,2,3]), слабее ([1,3,5]), вообще в стороне [7,7,7]
почему проблема в метрике, потому что никогда не додумается, что ([1,1,1], [2,2,2], [7,7,7]) могут быть в одном кластере а ([1,2,3], [1,3,5]) в другом
и кстати количество кластеров может быть (и это имхо лучше) неизвестным
Не affinity ли propagation это часом? https://habr.com/ru/post/321216/
Джентльмены верят другу другу на слово? У вас какой-то его частный случай походу, так что да… Другой....
И вообще, заявлений много, а анализа толкового нет. Мне особенно понравилось про сложные топологии :)
Кстати у задачи кластеризации существуют конкретные метрики, silhoutte score например, а не только "интуитивная отличимость" (на игрушечных датасетах).
Так что у вас один выход. Сделать python-библиотеку и собрать на гитхабе звёзд больше чем hdbscan (1300+ на данный момент).
Сейчас появилось довольно много специальных библиотек для вычисления метрик похожести для больших данных (например NMSLIB), это отдельная интересная тема.
Новый метод кластерного анализа