Всем привет!
Нужно найти в некотором наборе сущностей однозначно группы сущностей, которые сильно связаны (это не то определение про связанность в графах, а моё собственное).
У нас есть сущности — A, B, C, D, E, F, G, H, I, J..., есть функция соответствия между ними — match(A,B)==match(B,A) — связанность, от 0 до 100. Получается этакая диагональная матрица:
A B C D E F G H I J
A 100
B 80 100
C 75 81 100
D 49 12 15 100
E 22 9 18 91 100
F 7 13 42 82 94 100
G 4 8 15 13 45 19 100
H ... 100
I ... 100
J ... 100
Итого:
A-B-C: A-B:80, A-C:75, B-C:81 - группа
D-E-F: D-E:91, D-F:82, E-F:94 - группа
A-D:49, C-F:42 - средней силы связи между отдельными элементами групп, но не позволяют слить две группы в одну, слишком слабы для этого
E-G:45 - G - средней силы связь с E - одним элементом группы D-E-F, но в итоге G остаётся без группы
Сущностей — N — от сотен до тысяч. Пока приходит в голову что-то поиск облаков точек в N-мерном пространстве, или как-то так. Не уверен, что это быстро.
Чисто эмпирически я предполагаю, что группы будут довольно сильно связаны между собой, а связь отдельных элементов одних групп с отдельными элементами других будет слабой, но конкретных цифр предположить не могу, хочется подкручивать какими-нибудь коэффициентами. Да, весьма вероятно то, что если сущность входит в одну группу, то не входит в другие, но не факт — возможно, что входит, тогда это будет межгрупповая связь.
Язык — питон, желателен готовый рецепт при помощи какого-нибудь numpy