#BA Modelの生成
グラフをpythonのnetworkxで生成する。
ここでそのグラフはスケールフリーなグラフである。
スケールフリーとは次数分布がべき乗則に従うネットワークである。
生成はBarabási–Albert Model(BA Model)を採用する。
n = 10000 #全ノード数
m = 3 #新たに加えるノードのリンク数
G1 = nx.barabasi_albert_graph(n, m)
G2 = nx.barabasi_albert_graph(n, m)
しかしこれは無向グラフしか生成できない。
#有向グラフ化
今、生成したグラフG1、G2のエッジリストをテキストファイルとして保存する。
nx.write_edgelist(G1, 'G1.txt', data=False)
nx.write_edgelist(G2, 'G2.txt', data=False)
このテキストファイルを読み込むことで有向グラフ化する。
G1 = nx.read_edgelist('G1.txt', create_using=nx.DiGraph())
G2 = nx.read_edgelist('G2.txt', create_using=nx.DiGraph())
#次数分布
この方法で生成したG1、G2の次数に相関があるか調べる。
G1degree = dict(G1.degree)
G2degree = dict(G2.degree)
G1_value = []
G2_value = []
for key, value in G1degree.items():
G2_value.append(G2degree['{}'.format(key)])
G1_value.append(value)
plt.scatter(G1_value, G2_value, s=10)
np.corrcoef(G1_value, G2_value)
#=>array([[1. , 0.69557497],
# [0.69557497, 1. ]])
正の相関があるので
シャッフルして相関をなくす。
node = list(G2.node)
node1 = node.copy()
random.shuffle(node1)
mapping = {k: v for k, v in zip(node, node1)}
G2 = nx.relabel_nodes(G2, mapping)
nx.write_edgelist(G2, 'G2.txt', data=False)
ノードのラベルをシャッフルして相関をなくした実際相関のグラフと相関係数は
array([[1. , 0.01120365],
[0.01120365, 1. ]])
よって相関のない二つのグラフが生成できた。
#グラフの結合
networkxにある関数を使い結合する。
G = nx.compose(G1, G2)
これで二つのグラフを結合することができた。