извлекать кластеры / наборы узлов из неориентированного графа - PullRequest
1 голос
/ 20 марта 2019

Описание

Я хотел бы идентифицировать и получить кластеры размера n в виде групп узлов из набора данных неориентированного графа (оптимально в Python).В настоящее время я застрял в какой-то сфере за пределами моей зоны комфорта и знаний, поэтому я подумал, что, возможно, стоит попробовать обратиться к заинтересованным людям здесь.

Кластер здесь характеризуется как набор узлов, которые все взаимосвязанычерез (ненаправленный) край.Для упрощения все веса ребер можно рассматривать с весом = 1. Кроме того, нет никакой дополнительной информации, хранящейся ни в узлах, ни в ребрах.

Ниже на рисунке показана структура данных и зависимости

Схема графика

Graph scheme

Для этого я стремлюсь найти решение, которое автоматически обнаруживает наборыузлов, которые полностью взаимосвязаны, как показано ниже:

Ожидаемые результаты кластера

Expected Cluster Results

Где размер кластера должен распознаваться динамически и всегда учитывать максимальное количество взаимосвязанныхузлы (например, n1 и n2 не считаются собственным кластером, поскольку n3 имеет связь с ними обоими).

Подходы

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

График в виде матрицы

Graph as matrix

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

У кого-нибудь есть идеи о том, как подойти к этому или оптимально поработать над этим с помощью совместного решения, на которое я мог бы ориентироваться?Большое спасибо !!

1 Ответ

0 голосов
/ 20 марта 2019

Правильное наименование вашего кластера - полный подграф .Ваша проблема известна как проблема клики .Одна из лучших библиотек обработки графов для Python - networkx - имеет несколько алгоритмов для решения этой проблемы: networkx клик

Ваша проблема может быть решена с помощью этой функции: networkx.algorithms.clique.enumerate_all_cliques

Вы должны преобразовать свой график в формат networkx и использовать эти алгоритмы, чтобы найти его.

...