Алгоритмы группировки / кластеризации с неопределенными метриками расстояния - PullRequest
1 голос
/ 14 июня 2019

Мне нужно несколько советов о том, как улучшить алгоритм кластеризации. Ответ может быть тривиальным или невозможным. Я много гуглил, но я либо не понимаю аналогии между моей проблемой и известными алгоритмами кластеризации, либо такой аномалии нет. Я не специалист по информатике, и, возможно, я неправильно понимаю много жаргона.

Проблема

Мне дан набор N элементов, и мне нужно сгруппировать эти элементы в K групп, с K неизвестно. Группировка основана на вызове функции measure(group), которая возвращает меру того, насколько близко элементы в группе находятся. group обозначает коллекцию по крайней мере из двух элементов. Еще одним усложняющим фактором является то, что результат measure очень неопределенный, когда group имеет только два элемента, и что вызов этой функции стоит дорого.

Мое решение

Возьмите пустой список назначенных элементов, A.

Поскольку результат measure не является точным для двух элементов, чтобы начать "заполнение" группы, я беру первый элемент x0, добавляю его к A, а затем перебираю все остальные элементы, xi. Я звоню measure с комбинациями из двух точек (x0, xi), пока не получу measure, который настолько мал, что я могу быть уверен в этом. Если этого никогда не произойдет, x0 является группой из одного элемента, и я продолжаю. Если я получу хорошую меру, xi добавится в группу и в список назначенных элементов A. Как только это начальное число найдено, я перезапускаю итерацию по всем элементам, исключая элементы уже в A (возможно, я пропустил некоторые элементы в группе, потому что measure неопределенно для двух элементов). Для каждого нового элемента-кандидата x я звоню measure с group, собранным до сих пор, и x, добавленным к нему. Если x не увеличивает "много" measure из group, оно добавляется к group и A. У меня есть способ точно определить «много», но это деталь конкретной проблемы, с которой я столкнулся.

Когда я заканчиваю итерацию по всем элементам, я перезапускаю новую группу с первого элемента, которого еще нет в A, всегда пропуская элементы в A, пока не сгруппирую все элементы.

Что с ним не так?

Решение замечательно устойчиво для конкретной проблемы, с которой я работаю. Однако в худшем случае это n^2 (итерация по всем комбинациям элементов в группах по 2). На практике такого никогда не бывает, и мой n редко превышает несколько сотен, но в некоторых патологических случаях приближается к худшему. Поскольку вызов measure стоит очень дорого, решение проблемы с меньшим количеством итераций было бы весьма полезным. И, думаю, решение n^2 никогда не бывает идеальным ...

...