Время прочтения: 4 мин.

С тех пор как Аристотель заложил основы естественной систематики, классификация и категоризация играют центральную роль в философских и научных исследованиях по организации знаний. Чтобы идти в ногу с большим количеством информации, которую мы собираем в науке, ученые исследовали различные способы автоматической классификации данных еще на заре компьютерной и информационной наук.

Сейчас мы живем в эпоху больших данных и, к счастью, у нас есть несколько инструментов для классификации данных из различных источников, включая облака точек, изображения, текстовые документы и сети. Сети узлов и связей представляют собой простые, но мощные представления наборов взаимодействий данных из большого числа различных источников. Метаболические пути, белково-белковые взаимодействия, регуляция генов, пищевые сети, всемирная паутина, социальные взаимодействия и научное сотрудничество — вот лишь несколько примеров сетевых систем, изучаемых в разных науках.

Многие сети в реальной жизни настолько велики, что мы должны упростить их структуру, прежде чем сможем извлечь полезную информацию о системах, которые они представляют. В этой статье мы сосредоточимся на классификации узлов в сообщества и на визуализации структуры сообщества. В сетях сообщества относятся к группам узлов, которые тесно связаны внутри. Обнаружение сообществ в сетях является сложной задачей, и в последние несколько лет было предложено множество алгоритмов для решения этой сложной проблемы. Текущая реализация Infomap быстра и точна. Infomap может классифицировать миллионы узлов за считанные секунды. Кроме того, структура уравнений карты также гибка и может быть прямо обобщена для анализа различных видов сетевых данных. Например, Infomap не только предоставляет двухуровневые, многоуровневые и перекрывающиеся решения для анализа неориентированных, направленных, невзвешенных и взвешенных графов, но и также для анализа сетей, содержащих данные более высокого порядка, таких как сети памяти и мультиплексные сети.

mapequation.org — сайт, посвященный алгоритму Infomap и его модификациям, от авторов метода. Есть открытый код. Помимо хорошей поддержки и документации, есть изумительные демки, иллюстрирующие работу. Визуализированные примеры работы алгоритма на основе случайного блуждания в многослойной сети можно изучить по ссылкам:

https://www.mapequation.org/apps/Multiplex3D-sampling/index.html

https://www.mapequation.org/apps/Multiplex3D-short-version/index.html

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

Из представленных скриншотов видно, как по мере приближения к узлу нам показывают из каких узлов он состоит.

Также Infomap доступен в виде библиотеки на python.

Установка:

pip install infomap
Подключение:
import infomap
Создание:
im = Infomap()

В параметрах можно передать флаги в виде строки.

Добавление узла:

im.add_node(1)

Добавление именованных узлов в виде кортежа:

nodes = (
    (1, "Node 1"),
    (2, "Node 2"),
    (3, "Node 3")
)
im.add_nodes(nodes)

Добавление узлов многослойной сети:

source_multilayer_node = (0, 1) # ID уровня, ID узла
target_multilayer_node = (1, 2) # ID уровня, ID узла
im.add_multilayer_link(source_multilayer_node, target_multilayer_node)

Добавление связи:

im.add_link(1, 2)
Или сразу несколько передаем в кортеже:
links = (
    (1, 2),
    (1, 3)
)
im.add_links(links)

Третьим параметром можно задать вес. Если при добавлении ссылки окажется, что узел не существует, он будет автоматически создан.

Для многослойной сети:

links = (
    ((0, 1), (1, 2)),
    ((0, 3), (1, 2))
)
im.add_multilayer_links(links)
Запуск построения карты:
im.run()

После этого можем извлекать из построенной карты необходимую информацию, например вывести количество верхних модулей в дереве:

print(im.num_top_modules)

Или вывести максимальную глубину дерева:

print(im. max_depth)

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