#python-3.x #graph #networkx #networkit
#python-3.x #График #networkx #networkit
Вопрос:
У меня небольшая графовая сеть, и я искал методы, которые могут использовать структурные свойства небольшой сети для создания сложной сети. Я хотел бы использовать метод, который сохраняет такие свойства, как распределение степеней, кластеризация и т.д..
К счастью, я наткнулся на эту [статью] (https://link.springer.com/article/10.1007/s41109-017-0054-z ), в котором обсуждается создание копии исходной сети с последующим масштабированием сети.
Например, я сгенерировал взвешенный по краям график Networkx, подобный следующему: (случайный график создается для иллюстрации),
import random
import networkx as nx
import matplotlib.pyplot as plt
G = nx.gnm_random_graph(20, 30, seed=1)
for (u, v) in G.edges():
G.edges[u, v]['weight'] = random.randint(0, 10)
nx.draw(G, with_labels=True)
plt.show()
print(G.edges(data=True))
Этот граф имеет 20 узлов. Я хотел бы знать, как масштабировать такие сети с помощью
масштабного коэффициента x, варьирующегося от 5 до 10. Примеры будут действительно полезны.
Кроме того, в документации (https://github.com/networkit/networkit/blob/Dev/notebooks/User-Guide .ipynb) упоминается, что поддерживаемым форматом данных графа является формат смежности METIS. Я хотел бы знать, нужно ли преобразовывать график networkx в график metis. Есть ли возможность напрямую использовать график Networkx в Networkit?
Ответ №1:
Вы можете использовать модуль nxadapter в NetworKit для преобразования графиков из networkx в NetworKit и наоборот. В вашем коде это будет работать следующим образом:
import networkit as nk
import random
import networkx as nx
import matplotlib.pyplot as plt
G = nx.gnm_random_graph(20, 30, seed=1)
for (u, v) in G.edges():
G.edges[u, v]['weight'] = random.randint(0, 10)
nx.draw(G, with_labels=True)
plt.show()
print(G.edges(data=True))
# Networkx graph to NetworKit graph
G_nk = nk.nxadapter.nx2nk(G, weightAttr='weight')
Для генерации сложных сетей вы также можете рассмотреть возможность использования генератора графов, здесь вы можете найти несколько примеров.
Комментарии:
1. Большое вам спасибо. Я взглянул на генераторы графов. Насколько я понимаю, генераторы, перечисленные в вышеупомянутой ссылке, могут использоваться для создания случайных графов. Я не уверен, можно ли использовать эти генераторы для масштабирования существующего графика. Не могли бы вы подробнее остановиться на этом?
2. Это правда, вы можете использовать генераторы для создания сложных сетей, но не для масштабирования существующих графиков. Я хочу сказать, что если вы хотите создать сложную сеть, вы можете использовать множество генераторов, в противном случае я не знаком с масштабированием сети.
3. Спасибо. Я открыл здесь новую тему
4. @angriamn Как было предложено в ветке, опубликованной выше, я попробовал networkit.generators. LFRGenerator.fit(G_nk, scale=2) . Но это возвращает объект, и я не уверен, как получить доступ к масштабированному графику. Не могли бы вы помочь?