大規模グラフに対する 高速クリーク列挙アルゴリズム 宇野 毅明 国立情報学研究所 & 総合研究大学院大学(博士入学者募集 中) 2003年4月25日 コンピューテーション研究会 新旧アルゴリズムの比較2 10000 8000 既存 r=10 提案 r=10 既存 r=30 提案 r=30 次数巨大あり 6000 4000 2000 0 10 00 33 50 66 7 01 98 5 52 13 1 10 16 27 35 19 33 60 22 41 85 47 1万個あたりの計算時間(秒) 既存と提案手法の比較 頂点数 列挙がしたい ・ ある種の部分グラフを見つけ出す データマイニング、ウェブマイニング、計算言語学など ・ 大量にほしい → 出てきたものをもう一度加工 → 統計的に処理 → 出現数を調べる(グラフマイニング) → クラスタの種にする(計算言語学) ・ 入力データは巨大だが、解の個数は意外と少ない ・ ウェブネットワーク ・ 辞書 ・ 文書データベース 可能であれば、全部列挙したい 問題の定義 「与えられたグラフ G = (V,E ) の全ての極大クリーク(極大2部 クリーク)を、ちょうど一度ずつ出力せよ(列挙せよ)」 ・ G の補グラフを G' とすると、上記の問題は G' の極大安定集 合を列挙する問題と等価 築山らのアルゴリズムで、ひとつあたり O(|V||E| ) 時間で 列挙できる 極大安定集合列挙 ・ 極大安定集合列挙アルゴリズムは、斬新なアイディアで作られ ている ※ それまでのアルゴリズムは、分割法とバックトラッキング 極大安定集合は列挙できない (出力多項式時間では) ・ 95年にAvis・福田が提案した逆探索と同じ探索をしている ・ 00-01年中野により、いくつかのグラフオブジェクトに対し、この アルゴリズムと同じ方法の、効率良い列挙アルゴリズムが提 案されている しかし、 問題が基礎的な割には、計算量が大きい しかし、改良は難しい グラフマイニング ・ 与えられた大きなグラフ、あるいはたくさんのグラフの中か ら、頻出する部分グラフを出力する ・ 部分グラフ = 木、サイクル、クリークなど ・ 候補を作り、列挙して勘定する アルゴリズムが一般的 ・ クリーク、2部クリークは、 極大なものを列挙すれば、後が簡単 今回の研究テーマ ・ データマイニングなどでは、疎なグラフを扱うこと が多い (しかも極端に疎、 頂点数=1万、 平均次数=10、 など ) 入力グラフが疎である場合に(実用的に)高速 なアルゴリズムを開発したい 極大クリークの逆探索 ・ 築山らの列挙法を、極大クリークに適用 V = { v1,…,vn }, Vi = { v1,…,vi } とする グラフ Gi =(Vi, E ) の極大クリークを i 極大クリーク と呼ぶ 全ての i 極大クリークを列挙する、という問題を考える (そして、普通の極大クリークだけ出力する) 逆探索による列挙 ・ (ある1つの以外の)任意の解に, 親(他の解)を定義 ( i 極大クリークの親を( i-1 )極大クリークで定める ) ・ ただし, 各解が自分自身の真の先祖にならないこと この親子関係は 列挙木 を導出する … V1 ={v1} V2 ={v1,v2} ,…, Vn-1 ={v1,…,vn-1} V ={v1,…,vn} 列挙木を深さ優先探索してすべての解を出力する 極大クリークの親 i 極大クリーク S に対してその親を (i-1) 極大クリーク S' で定める。ただし、 1. vi が S に含まれなければ S' = S 2. そうでなければ S' = S \ { vi } に極大クリークになるま で、添え字の昇順で頂点を加えたもの vi vi i 極大クリーク Sの子供を求める 1. vi+1 が S の全頂点に隣接する : S' = S∪{vi+1} 、 隣接しない頂点がある : S' = S i+1 極大クリーク S' は S の子供になる ( type1 ) 2. S' = (S ∪{ vi+1 } から vi+1 に隣接しない頂点を取り除いたもの) S' が極大クリーク&親が S ならば i+1 極大クリーク S' は S の子供 vi vi vi ( type2 ) 1反復の計算時間 type 1 S' = S か S' = S ∪{ vi+1 } type 2 S' = ( S ∪{vi+1 } から vi+1 に隣接しない頂点を取り除く) O(Δ) 時間で得られる type 2 の子供であるかどうかのチェック O(Δ2) ( ※ Δはグラフの最大次数) 計算量を算定 任意の i極大クリークは ( i<|V| なら ) 子供を1人は持つ 高々|V| 回反復すれば、ひとつ極大クリークが出力される 1つあたりの計算時間は O(Δ2|V|) もう少し詳しく解析すると、 O(|V| |E| ) ・ type 1 の子供をたどり、一番下まで行くには O(Δ2) 時間 ・ type 2の子供に関する作業を高速化したい 反復数を少なくする ・ type 2 S' = (S ∪{ vi+1 } から vi+1 に 隣接しない頂点を取り除く) ・ vi+1 が S のどの頂点とも隣接してない S' = { vi+1 } type 2 子供になっている1頂点の i極大クリークは別口で列挙 vi+1が S に隣接してないなら、 type 2 子供のチェック不要 type 2 は、 S に隣接する頂点のみについて行えばよい Type 2 の子供の計算時間 ・ type 1 子供をたどる反復の中で、 vi+1 が S に隣接する 高々Δ2 個 ・ type 2 子供候補を求める時間 O(Δ2 ) 極大クリーク1つあたり、 O(Δ4 ) 時間 ( 実際は O(Δ2 ) 程度であろう ) 2部クリーク ・ 2部グラフに定義 ・ 頂点集合1の頂点同士、頂点集合2の頂点同士には枝 がなくてよい ・ 任意の頂点集合1の頂点同士、 頂点集合2の頂点同士に枝をはると 一般のクリークの問題に帰着される グラフが疎でなくなるので、ダメ 特別扱いする 自明なクリーク ・ 頂点集合1・2の部分集合はクリークになる(自明なクリーク) 頂点数が多いので、反復にかかる時間が増大 (これらが type 2 子供の候補になりうる) 添え字を頂点集合1->頂点集合2という順番でつけると ・親が自明なクリーク 自分も自明なクリーク or v ∈ 頂点集合2 と、 v に隣接する頂点集合1の頂点のみ これらだけ別口で列挙し、自明なクリークは探索しない vi+1 がi 極大2部クリーク S に隣接しないときは、 type 2 子供のチェックが必要ない 計算時間の算定 type 2 の子供候補が極大2部クリーク 親は必ず自分自身 (親のチェック不要) ・ vi+1 に関する type 2 の子供チェックの時間 vi+1 と S に接する枝数 × Δ ・ S に接する枝数 高々Δ2 極大2部クリーク1つあたり、 O(Δ3 ) 時間 1部頂点の次数が大きい ・ 一部の頂点 X の次数がとても大きい ( |X| は小さいとする) ・ X のみからなるクリークは別口で 現在の解S ⊆ X ならやめる S には X 以外の頂点あり S の全てに隣接する頂点 ≦ Δ X に隣接行列用意すれば、計算量は変わらず 計算実験 ・言語: ・ マシン: ・ OS&コンパイラ: C パソコン PentiumIII 500MHz Linux、gcc ・ 一般グラフ、2部グラフの問題を解いた ・ 通常のランダムグラフでは面白い実験ができないので、 添え字が近い頂点にしか枝を張らないランダムグラフを作っ た。 新旧アルゴリズムの比較 30000 25000 既存 r=10 提案 r=10 既存 r=30 提案 r=30 次数巨大あり 20000 15000 10000 5000 0 10 00 30 00 50 00 70 00 90 00 16 00 64 0 00 25 0 60 00 1万個あたりの計算時間(秒) 既存と提案手法の比較 頂点数 新旧アルゴリズムの比較2 10000 8000 既存 r=10 提案 r=10 既存 r=30 提案 r=30 次数巨大あり 6000 4000 2000 0 10 00 33 50 66 7 01 98 5 52 13 1 10 16 27 35 19 33 60 22 41 85 47 1万個あたりの計算時間(秒) 既存と提案手法の比較 頂点数 3500 3000 2500 既存 提案 既存 提案 2000 1500 1000 500 0 10 00 30 00 50 00 70 00 90 00 16 00 0 64 00 25 0 60 00 1万個あたりの計算時間(秒) 2部グラフの場合 頂点数 r=10 r=10 r=30 r=30 次数の変化に対する挙動 1000 100 10 1 10 20 40 80 0.1 ※ だいたい、次数の2乗に比例 160 320 現実のデータに適用 ・ とある計算言語学のデータに適用 頂点数およそ2万:2万、枝数24万(平均次数6)の2部グラフ (次数に偏りあり) 極大クリーク数270万 計算時間=1500秒(10万秒:ソート無) (1万個あたり6秒) (既存=4000時間、1万個50000秒くらい? ) ・ とあるデータマイニングのデータに適用 頂点数およそ6万:500、枝数15万の2部グラフ (次数に偏りあり) 極大クリーク数14万 計算時間=266秒(24500秒:ソート無) (1万個あたり19 秒) (既存=30時間、1万個7000秒くらい?) 次数順で頂点をソート、大きい次数に対する工夫 が効果を出している まとめと今後の展開 ・ 疎グラフの極大クリーク、極大2部クリークを列挙するアル ゴリズムを提案した ・ 1つあたりの計算量が O(|V| |E|) から O(Δ4 ) とO(Δ3)に改 良(?)された ・ 実際問題への適用 ・ グラフマイニング ・ web community の発見 ・ 類似語群の発見 ・ 論文のカテゴリー化 などなど
© Copyright 2024 ExpyDoc