Juliaでランダム・ネットワークを生成して可視化する
この記事は以下の大著を大いに参考にしています。 いつか書評記事を書きたいですね。
ネットワーク科学: ひと・もの・ことの関係性をデータから解き明かす新しいアプローチ
- 作者: アルバート・ラズロバラバシ,Albert‐L´aszl´o Barab´asi,池田裕一,井上寛康,谷澤俊弘,京都大学ネットワーク社会研究会
- 出版社/メーカー: 共立出版
- 発売日: 2019/02/27
- メディア: 大型本
- この商品を含むブログを見る
ランダム・ネットワークとは
WWW(ワールドワイドウェブ)や交友関係など現実世界にはネットワークは多々あります。ランダム・ネットワークは当初このような現実世界のネットワーク構造を模すものとして提案されました。しかし現実世界のネットワークとランダム・ネットワークは異なる性質が多々あるのですが、ネットワーク構造を研究する上で有用なモデルとなっています。
ランダム・ネットワークは以下の手順で生成されます。
- N個の孤立したノードから始める
- ノードの組み合わせを選び、0から1の間で乱数を生成する。乱数がp未満であればそのノードの組み合わせをリンクで結び、p以上であれば結ばないでそのままにしておく。
- 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)
これを実行すると以下のようなランダム・ネットワークが得られます。
ランダム・ネットワークの性質
ノードの数を100で固定して、ノード間にリンクが生じる確率pを変化させてランダム・ネットワークがどのように変化するか確認します。
N=100, p=0.009
の範囲は亜臨界領域で大きなクラスターは生じません。また各クラスターは閉路のない木構造となります。
N=100, p=0.02
臨界点を超えると超臨界領域に入り、巨大なクラスターが生成しはじめます。クラスター自体の形状も閉路を持つようになります。
N=100, p=0.05
の範囲は連結領域と呼ばれ1つの巨大なクラスターが全てを飲み込むようになります。孤立したノードやクラスターはこの時点では存在しなくなります。
今回は以上になります。これを足がかりにネットワーク分析も進めて行きたいですね。