Как идентифицировать триады, группы из 4 (или более) в матрице смежности в python

Итак, у меня есть матрица смежности, и я ищу процедуру, которая будет идентифицировать группы из трех, четырех, пяти и т. д.

Я наткнулся на следующий пост: Как эффективно вычислить перепись триады в неориентированном графе в python, который касается очень похожей проблемы, и ему очень понравился ответ, предоставленный Ломтруром (14 июня 2019 г.). Его/ее процедура делает именно то, что мне нужно для триад, когда я создаю словарь словарей из моей матрицы в Excel. Я, однако, не в состоянии распространить эту процедуру на группы из более чем 3 человек (мне только с помощью моего коллеги удалось создать очень неэффективное решение для групп из четырех человек), а также напрямую связаться с Ломтруром, поскольку я не могу комментировать его пост, так как мне не хватает очков репутации - отсюда и такой вопрос.

Если представить очень простую матрицу 0/1 (в моем случае в Excel) размером 5x5 (строки A, B, C, D, E; столбцы A, B, C, D, E), где все узлы равны 0 и только следующие узлы равны 1: (A, B), (A, C), (A, E), (B, A), (B, C), (B, E), (C, A), ( C, B), (C, E), (E, A), (E, B), (E, C), я могу преобразовать его в словарь диктов в Python, используя:

   my_dictionary = pd.read_excel('file.xlsx', index_col=0)
   g = nx.from_pandas_adjacency(my_dictionary)
   _m = nx.convert.to_dict_of_dicts(g)

давая мне:

_m = {'A': {'B': {}, 'C': {}, 'E': {}}, 'B': {'A': {}, 'C': {}, 'E': {}}, 'C': {'A': {}, 'B': {}, 'E': {}}, 'D': {}, 'E': {'A': {}, 'B': {}, 'C': {}}}

или альтернативно:

_m {'A': {'B': {'weight': 1}, 'C': {'weight': 1}, 'E': {'weight': 1}}, 'B': {'A': {'weight': 1}, 'C': {'weight': 1}, 'E': {'weight': 1}}, 'C': {'A': {'weight': 1}, 'B': {'weight': 1}, 'E': {'weight': 1}}, 'D': {}, 'E': {'A': {'weight': 1}, 'B': {'weight': 1}, 'C': {'weight': 1}}}

Запустив код из Lomtrur, он выдает следующие триады/группы из трех: {('A', 'B', 'E'), ('A', 'B', 'C'), ('A' , 'C', 'E'), ('B', 'C', 'E')}, так как, очевидно, A соединено с B, а также с E и E одновременно связано с B, замыкая треугольник / триада. То же самое относится и к остальным трем триадам.

Тем не менее, там также есть группа из четырех, будучи ('A', 'B', 'C', 'E'), поскольку все члены группы также связаны как диады. A имеет прямую ссылку на B, на C, на E, B имеет прямую ссылку на A, C, E и т. д. Я хотел спросить, не будет ли кто-нибудь так любезен и поможет мне расширить код из сообщения связаны выше, так что подпрограмма также идентифицирует не только группы из трех, но и группы из четырех, пяти или даже более членов, если уж на то пошло?!

Заранее большое спасибо, при необходимости буду рад предоставить более подробную информацию!


person Tomas    schedule 01.10.2020    source источник