Имеется достаточно объемная база данных, включающая в себя документы, пользователей и множественные связи документ->пользователи (т.е. над каждый документом "работает" несколько пользователей).
Требуется выделить микрогруппы пользователей, которые активнее всего работают вместе.
При этом один и тот же пользователь может находиться в нескольких микрогруппах сразу.
Какими алгоритмами можно воспользоваться? Возможно, есть готовые решения или библиотеки?
Также хотелось бы некую управляемость, с помощью которой можно было бы регулировать размеры найденных групп, находить и большие, и маленькие.
В данном случае должны быть выделены группы Вася+Коля (работали над 1 и 2) и Вася+Нина (работали над 2 и 3)
Немного забегая вперед, хотелось бы еще отображать связи между группами и как-то все это визуализировать (возможно, есть какие-то подобные библиотеки?)
Ну и забегая еще вперед — у документов есть категории, при визуализации хочется отображать группы, работающие в одной категории рядом.
В R можно скрамливать данные из MySQL, csv, xls, json, txt. И там довольно быстро (ну, конечно, в зависимости от объема данных) можно сделать дендрограмму для иерархической кластеризации с расчетом расстояний по умолчанию евклидовым методом (или по желанию другим). Вроде бы дендрограммы разукрашиваются даже. Графики из R экспортятся, правда, не особо шикарно (ограниченное число форматов). Впрочем, можно и другой инструмент найти. Но иерархическая кластеризация как раз позволит отобразить связи разных уровней и независимо от количества человек. Если, например, 3 человека наиболее часто работают друг с другом - они будут на одном уровне.
Kruskal алгоритм на Union-Find множестве связей Heap оптимизированном по весу связей. Если вес параметризован критериями, то задавать его Hamming расстоянием. И я не шучу, я это делал в коде на реальной задаче.