システムとモデリング

modelica, Julia, Design Structure Matrix, SysML, 他モデリング全般について。

Juliaでランダム・ネットワークを生成して可視化する

この記事は以下の大著を大いに参考にしています。 いつか書評記事を書きたいですね。

ネットワーク科学: ひと・もの・ことの関係性をデータから解き明かす新しいアプローチ

ネットワーク科学: ひと・もの・ことの関係性をデータから解き明かす新しいアプローチ

ランダム・ネットワークとは

WWW(ワールドワイドウェブ)や交友関係など現実世界にはネットワークは多々あります。ランダム・ネットワークは当初このような現実世界のネットワーク構造を模すものとして提案されました。しかし現実世界のネットワークとランダム・ネットワークは異なる性質が多々あるのですが、ネットワーク構造を研究する上で有用なモデルとなっています。

ランダム・ネットワークは以下の手順で生成されます。

  1. N個の孤立したノードから始める
  2. ノードの組み合わせを選び、0から1の間で乱数を生成する。乱数がp未満であればそのノードの組み合わせをリンクで結び、p以上であれば結ばないでそのままにしておく。
  3. N(N-1)/2通りのすべてのノードの組み合わせについて手順2を繰り返す

まずこのランダムネットワークをJuliaで生成して可視化できるようにします。

Juliaでの実装

Juliaでの実装は以下のようになりました。 おそらくランダム・ネットワークの関数はパッケージLight Graphsの中にあると思うのですが、勉強のため自力実装としました。

using LinearAlgebra
using LightGraphs
using GraphPlot

function randomnet(N,p)
    A =rand(N,N);
    B=LowerTriangular(A);
    C=Diagonal(A);
    D = B - C;
    D = D + D'


    ##pより大きい数字を0に置き換える
    overp =findall(x->x.> p, D);
    overpc=count(x->x.> p, D);
    D[overp] = zeros(overpc,1);


    ##p以下の数字を1に置き換える
    underp =findall(x-> 0<x.<= p , D);
    underpc=count(x-> 0<x.<= p, D);
    D[underp] = ones(underpc,1);

    return D
end

matrix=randomnet(100,0.1)

G=Graph(matrix)


gplot(G)

これを実行すると以下のようなランダム・ネットワークが得られます。

f:id:Otepipi:20190502181203p:plain

ランダム・ネットワークの性質

ノードの数を100で固定して、ノード間にリンクが生じる確率pを変化させてランダム・ネットワークがどのように変化するか確認します。

N=100, p=0.009

f:id:Otepipi:20190502181642p:plain

 p < \frac{1}{N}の範囲は亜臨界領域で大きなクラスターは生じません。また各クラスターは閉路のない木構造となります。

N=100, p=0.02

f:id:Otepipi:20190502183110p:plain

臨界点 p = \frac{1}{N}を超えると超臨界領域に入り、巨大なクラスターが生成しはじめます。クラスター自体の形状も閉路を持つようになります。

N=100, p=0.05

f:id:Otepipi:20190502183507p:plain

 p > \frac{\ln{N}}{N}の範囲は連結領域と呼ばれ1つの巨大なクラスターが全てを飲み込むようになります。孤立したノードやクラスターはこの時点では存在しなくなります。

今回は以上になります。これを足がかりにネットワーク分析も進めて行きたいですね。