『ネットワーク科学の道具箱』<スケールフリーネットワーク編>
- 作者: 大久保潤,藤原義久,上林憲行,小野直亮,湯田聴夫,相馬亘,林幸雄
- 出版社/メーカー: 近代科学社
- 発売日: 2007/12/01
- メディア: 単行本
- 購入: 2人 クリック: 36回
- この商品を含むブログ (10件) を見る
かおす
ネットワーク分析の入門書。
スケールフリーネットワークの生成とクラスタリングのアルゴリズムについて解説がある。
- スケールフリーネットワーク
- ランダムネットワーク
- 構成要素:平均次数、結合確率→結合確率p=
/(N-1)でエッジを生成する - ランダムネットワークの次数分布はポアソン分布(P(k)=exp(-
)* ^k/k!) 分布は平均次数 で最大となる。
- 構成要素:平均次数、結合確率→結合確率p=
- スケールフリーネットワーク
- 大きな次数を持つノードの分布が裾野を引く
- 両対数グラフをとると綺麗に直線にのる=べき法則にしたがっている
- 次数分布は P(k)∝k^(-γ) (γ=2〜3が多い)
- スケールフリーネットワークの生成アルゴリズム
- 「(指数的に)非常に沢山のリンクを得る」ようなノードが発生するアルゴリズムを考える。
- 富む者は更に富むしくみ
- ランダムネットワーク
- アルゴリズムその1:BAモデル
:再結合あり×要素増減なし
Step1:完全グラフを生成する
Step2:m個のノードをノードiの次数に比例する確率で選択する
Step3:m本のリンクを持つ新たなノードを1つネットワークに追加する。このとき、新たに付け加えられたm本のリンクはStep2で選ばれたm個のノードに結ばれる。
Step4:Step2とStep3を繰り返す。t時刻後にはネットワークはN=t+m[0]個のノードから構成される。→Setp2を見ればわかるように、より大きい次数を持つノードがより高い確率でリンクを得る!=優先的選択
→Step2がランダム(一様)だと、両対数をとっても直線にのらない。
:再結合なし×要素増減あり
Step1:N個のノードを用意する
Step2:各々のノードiに重みwiを割り当てる。重みの値は確率密度関数からランダムに選ばれる。
Step3:ノードiとノードjに対してwi+wj>=θ(閾値) であればリンクで結ぶ。これをすべてのノードのペアに対して行う。確率密度関数を指数分布f(w)=exp[-w]やパレート分布、コーシー分布などにした場合にも指数-2を与えることが知られている。
- アルゴリズムその3:PRP(Preferential Rewiring Process)
:再結合あり×要素増減なし
Step1:はじめにN個のノードをランダムにM本のリンクでつないでおく。=2M/N
Step2:それぞれのノードiに適応度βiを適応度分布から割り当てる。
Step3:リンクl[i,j]をランダムに選ぶ。
Step4:ノードmを(k[m]+1)^β[m]確率で選択する。
Step5:リンクl[i,j]とリンクl[i,m]をつなぎかえる。
Step6:Step3からStep5を次数分布に変化がなくなるまで行う。
→Step4でノードmが次数kが大きいほど選ばれやすく成る=優先的選択!
- ネットワーク指標
- グラフの表現
- 隣接リスト(pajekの*Adjust):配列やハッシュのデータ構造で保持する。
- 幅優先探索:目的ノードにぶつかるまで子ノードをひたすら展開する探索。探したところが見当違いかつ深すぎて見つかんないorzみたいなことにならず、浅いとこなら確実に見つけられる。but子ノードが多いと爆発する!
- グラフの表現
- 幅優先探索の考え方
- とにかく探す!グラフを木構造に展開する。
- 戦略として、出発点からの次数が低いとこから同心円状に探していく。
- あるノードにぶつかったら、そのノードにもっとも早くアクセスできる経路を記録する
- 経路の記録の戦略として、そのノードにぶつかる時の元のノードをそのノードが保持するキューに(来た順に)記録する。
- サーチの仕方(同心円上に広げていく方法)から、きた順番は出発点からの経路の次数の低さを示しているからこれでいい。
- キューの順位が高いとこを逆にたどれば経路になる!!!
→最短経路がわかってうれしい
- ついでに言うとキューに記録するときに出発点からの次数も一緒に記録しておくと、最短経路が複数あるときに調べやすい。
- wikipediaのcommon lispでのコード例
(defun bfs (node target)
(do ((queue (list node)
(append (cdr queue)
(get (car queue) 'subnodes)))
(ls nil (if (get (car queue) target)
(cons (car queue) ls)
ls)))
((null queue) (reverse ls))))