
書記が数学やるだけ#846 ネットワークの次数,経路
今回からネットワーク科学について扱っていく。基本事項はグラフ理論を参照:
問題

説明
ネットワーク理論は,通信,コンピュータ,生物,ソーシャルなどの複雑ネットワークを研究する分野である。

ネットワークは,ノード(頂点)やエッジ(辺)が属性を持つグラフとして定義される。

グラフの次数とは,頂点に接続している辺の本数である。

ネットワーク全体の性質を表すために,平均次数や次数分布などが用いられる。

ネットワークは,辺の隣接を表した隣接行列によっても表すことができる。

ネットワークの性質のうち経路について,直径や平均経路長などで表される。

ネットワークの集まり具合は,クラスター係数などで表される。

解答
ネットワークを実装するために,Pythonのnetworkxを用いていく。まずはネットワークを作る。
%matplotlib inline
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
# ネットワークの作図
G = nx.Graph([(1, 2), (1,3), (1,4), (2,3), (2, 4), (3,5)])
nx.draw(G, with_labels=True)
次数について,リストで取得する。
nx.degree(G)
#DegreeView({1: 3, 2: 3, 3: 3, 4: 2, 5: 1})平均次数は,次数の合計をノード数で割って求める。
# 次数の合計
total_degree = sum(dict(G.degree()).values())
# 平均次数
average_degree = total_degree / G.number_of_nodes()
print("平均次数:", average_degree)
次数分布をヒストグラムで表す。
degree_dist = [i/5 for i in nx.degree_histogram(G)]
plt.rcParams['font.size'] = 20
plt.bar(range(4), height = degree_dist)
plt.xlabel('$k$')
plt.ylabel('$p(k)$')
plt.ylim(0,1)
隣接行列を得るには,ネットワークをnumpy_arrayに変換する。
A = nx.to_numpy_array(G)
print(A)
#
[[0. 1. 1. 1. 0.]
[1. 0. 1. 1. 0.]
[1. 1. 0. 0. 1.]
[1. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]]最短経路とその長さについて,1~5を例に示す。
print(nx.shortest_path_length(G, 1, 5))
#2
print(nx.shortest_path(G, 1, 5))
#[1, 3, 5]平均経路長と直径を求める。
print('L=', nx.average_shortest_path_length(G))
#L= 1.5
print('D=', nx.diameter(G))
#D= 3最後に平均クラスター係数を求める。
nx.average_clustering(G)
#0.5333333333333333本記事のもくじはこちら: