メインコンテンツへスキップ
見出し画像

書記が数学やるだけ#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



    本記事のもくじはこちら:


    あなたへのおすすめ