mmds10.6-7
TRANSCRIPT
MMDs 10.6-7
前回までの復習• 10.1: Social Networks as Graphs
• 10.2: Clustering of Social-Network Graphs Betweenness / Girvan-Newman Algorithm
• 10.3: Direct Discovery of Communities完全2部グラフの発見
• 10.4: Partitioning of Graphsラプラシアン行列
• 10.5: SIMRANK
10.6 Counting Triangles• n個のノード, m本の辺があるランダムグラフを考える
• 3つのノードの組の数 : nC3 ≒ n^3/62つのノード間に辺のある確率: m/nC2 ≒ 2m/n^2 3つのノード間全てに辺のある確率: (2m/n^2)^3 = 8m^3/n^6 グラフ内の三角形の数の期待値は,(8m^3/n^6) * (n^3/6) = 4/3 (m/n)^3
三角形を数える(探す)理由• グラフがソーシャルグラフなら,n人のグループ内にm個の友人関係が存在していることになる
• AとBが友人, BとCが友人なら CとAの友人の可能性は高いと考えられる=> グラフの三角形の数を数えることで,そのグラフがどれくらいソーシャルネットワークに近いか分かる
A B
C ?
三角形を見つけるアルゴリズム• n個のノード, m ≧ n の辺を持つグラフを考える
• 各ノードは1,2,…,nの番号が振られている
• √m より次数が多いノードを heavy hitter と呼ぶ
• heavy hitter 三角形: 全てのノードがheavy hitter
• heavy hitter 三角形とそれ以外の三角形で違う数え方を使う
前準備
• 各ノードの次数を求める : O(m)
• ノードペアをキーとする辺のインデックスを作成する. ハッシュテーブルが使える. : O(m)
• ノードをキーとする辺のインデックスを作成する
前準備 (cond)
• 次数順にノードをソート
• vとuが同じ次数ならvとuの番号に従って並べる
• vの次数がuより小さい or vとuの次数でかつ v < u => v u と表す
Heavy-Hitter 三角形の数• heavy-hitter ノードの数は O(√m)
• heavy-hitter ノードの3つ組の数は O(m^(3/2))
• 辺に関するインデックスを使うことでO(1)で辺が存在するか分かる => 全体では O(m^(3/2)) で heavy-hitter 三角形の数が分かる
それ以外の三角形の数• (v1,v2) の辺を考える
• v1,v2共にheavy hitterなら辺を無視する
• v1がheay hitterではなく v1 v2のときu1,u2,…,ukをv1に隣接するノードとする (k < √m であり, O(k) = O(√m) で探せる)
• ui に対し (ui, v2)があるかをO(1)で判定またuiの次数もO(1)で求められる
それ以外の三角形の数• (ui,v2)が存在し,v1 uiのときに三角形{v1,v2,ui}をカウント
• 全部でm個のへんがあるので,合計時間は O(m^(3/2))
• まとめ: 前処理 O(m), heavy-hitter O(m^(3/2)) それ以外: O(m^3/2))
アルゴリズムの最適性
• 完全グラフの場合m = nC2, 三角形の数は nC3この三角形を数えるためには Ω(n^3) しかし m = O(n^2) より このアルゴリズムはO(m^(3/2))
MapReduce を使う方法
• 便宜的にノードに1,2,…,nと番号を振る
• E(A,B) でノードA,B間の辺を表す(ただしA<B)
MapReduce を使う方法• 三角形はE(X,Y), E(X,Z), E(Y,Z)の自然結合つまり E(X,Y) E(X,Z) E(Y,Z)
• SQLで表すと,SELECT e1.A, e1.B, e2.BFROM E e1, E e2, E e3WHERE e1.A = e2.A AND e1.B = e3.A AND e2.B = e3.B
e1.A = e2.A
e1.B = e3.A
e2.B = e3.B
X Y
Z
./ ./
復習 : 関係代数 (2.3)
Attributes
タプルで表現
関係Rを R(A1,A2,…) と表す (AはAttributes)上の例だとR(From,To), 関係のタプルは(url1,url2), (url1,url3), (url2,url3), …
復習 : 関係代数 (2.3)• 関係代数で定義される基本演算
• 選択, 写像,直積,和,差,自然結合
• 2.3.4 以下で各演算のMapReduceでの実装方法
• 参考: http://importantfish.com/relational-algebra-operations-with-mapreduce/
復習 : 関係代数 (2.3)• 自然結合2つの関係のタプルのペアにおいて共通するattributeが全て一致した場合,そのタプルを結合する.R(A,B) S(B,C)と書く この場合関係RとSを満たすものでBが共通するものが(A,B,C)の形で得られる
./
復習 : 関係代数 (2.3)• MapReduceによる自然結合 R(A,B) S(B,C) Map: Rのタプル (a,b) → (b, (R,a)) Sのタプル (b,c) → (b, (S,c))Reduce: (b, [(a1,b,c1), (a1,b,c2), …, (a1,b,cn), (a2,b,c1), (a2,b,c2), …, (a2,b,cn), …, (am,b,c1), (am,b,c2), …, (am,b,cn)])
./
3つの自然結合• 今回求めたいのは,E(X,Y) E(X,Z) E(Y,Z)
• 方法
1. E(X,Y),E(X,Z) を先に結合,その後E(Y,Z)を結合
2. E(X,Z),(Y,Z) を先に結合,その後E(X,Y)を結合
3. 一度のMapReduceジョブで全部処理する
./ ./
3つの自然結合
• 2.5.3 に 3つの自然結合を1回のMapReduceジョブでおこなう方法が載っている
3つの自然結合R(A,B) S(B,C) T(C,D)./ ./
ex 2.9h(v)=2, g(w)=1
S(u,w) に対し,ハッシュ関数h,gを用意 (u,w) を (h(u),g(w))に対応するreducerに送る
R(u,v)に対し,(u,v)をh(u)に対応する行に送るT(w,x)に対し,(w,x)をg(w)に対応する列に送る
MapReduceによる3角形のカウント
• b^3 のreducerを使う
• (u,v) をE(X,Y) の関係だとする→ (h(u),h(v),z)
• (u,v) をE(X,Z) の関係だとする→ (h(u),y,h(v))
• (u,v) をE(Y,Z) の関係だとする→ (z,h(u),h(v))
今回: E(X,Y) E(X,Z) E(Y,Z)./ ./
MapReduceによる3角形のカウント
• b^3のreducerを使う場合E(u,v) の数がm個だとすると,Mapはm*3b 回reducerと通信. つまり O(mb)
• ハッシュ関数によって一様にreducerにタプルが割り振られたとする.各タスクは O(m/b^2)の辺を受け取る.10.6.2 と同じアルゴリズムを使えば O(m^3/2)
より少ないreducerを使う
• 10.6.5
10.7 Neighborhood Properties of Graphs
• 大規模なグラフにおいて2ノード間の最適パスを求めるには?
• 場合によっては近似アルゴリズムで妥協する
有向グラフ• ex) u → v は ページuからページvへのリンク or u から v へ電話を掛けた事実
• 有向グラフにおける経路 (path) v0,v1,…,vk => v1 → vi+1 へ到達可能 (i=0,1,…,k-1)
• vの半径がd : vからあるノードuまでの距離が最大でもd. N(v,d) でそのようなuの集合を表す ex) N(v,0) = {v}, N(v,1) = {vとvに隣接するノード}
Neighborhood Profile
• あるノードvについて |N(v,1)|, |N(v,2)|, … の数列をneighborhood profileという
具体例
• N(A,0) = {A}, N(A,1) = {A,B,C} N(A,2) = {A,B,C,D}, N(A,3) = {A,B,C,D,E,F,G} Profile: 3,4,7,7,7,7…
• N(B,0) = {B}, N(B,1) = {A,B,C,D} N(B,2) = {A,B,C,D,E,F,G} Profile: 4,7,7,7,… ← Bの方がAより中心 (実はDが一番中心)
グラフの直径• グラフの直径がd=> グラフ内の任意のノードuとvの距離が最大d
• 有向グラフの場合,グラフが強連結の時のみ直径が存在する(Webは強連結ではない)
• 無向グラフの場合,グラフが連結していれば直径が存在
グラフの直径を求める• 全てのノードvについて |N(v,d)| = |N(v,d+1)| となるようなdが存在 そのようなdをd(v)で表す
• グラフが強連結なら max d(v)) が直径
• [証] N(v,d+1)はN(v,d)とN(v,d)内のノードuに隣接するノードwの和集合. N(v,d)にN(v,d)内の任意のノードが隣接するノードが含まれるのなら, |N(v,d)| = |N(v,d+1)| = |N(v,d+2)| = … . N(v,d) ⊆ N(v,d+1)より,|N(v,d)| = |N(v,d+1)| となるのは N(v,d)とN(v,d+1)が同じ集合のとき
推移閉包 / 到達可能性
• グラフの推移閉包 (Transitive Closure) :長さ0以上の経路が存在するノードペア(u,v)の集合
• 到達可能性 (Reachability)uからvへの経路が存在することこれをpath(u,v) と書く
推移閉包 / 到達可能性• グラフの推移閉包は,path(u,v)であるようなuとvのペアを全て見つける問題
• 到達可能問題はあるノードuに対して path(u,v)であるvを全て求める問題
• 到達可能問題は,N(u,∞) ≡ ∪i≧0 N(u,i)を求めるのと同じ
推移閉包 / 到達可能性の例
• Webページのグラフ: 数十億のノード
• ある一つのページから到達可能なページを調べることは一つのコンピュータでできる
• しかしWebページのグラフの推移閉包を求めるのは困難 (10^18 のペアを考えなければならないため)
MapReduceによる推移閉包の計算
• 関係Arc(X,Y) のペア(x,y) : x → y の辺が存在
• ノードvから到達可能なノード集合 Reach(X)を計算したい.i回目の繰り返しにおいてReach(X) = N(v,i)
MapReduceによる推移閉包の計算
• Reach(X) は最初 v のみを含むMapReduceの計算を何回したらReach(X)がN(v,i)を含んだとする
• N(v,i+1) を求めるためには, ReachとArcを結合する必要がある. SQLなら,SELECT DISTINCT Arc.YFROM Reach, ArcWHERE Arc.X = Reach.X
MapReduceによる推移閉包の計算
• この計算は 2.3.7 の手法が使える
• 重複を排除するためには 2.3.8 の手法が使える
• しかし,グラフによっては収束回数が全然異なるex) Webページ多くのページはあるページから10-15回で到達可. しかし到達まで長くかかる場合もある(前後にしかリンクがないチュートリアルのページなど)
MapReduceによる推移閉包の計算
• recursive-doubling query SELECT DISTINCT p1.X, p2.YFROM Path p1, Path p2WHERE p1.Y = P2.X
• Path(x,y)は最初はArc(X,Y)と同じ
• 直径dならlog2dの反復で計算可能
• この計算で推移閉包は早く計算できても,到達可能性に比べ遥かに多くのメモリが必要なことは変わらない
グラフのノード数削減• 推移閉包を求める際には強連結のノードは1つのノードにまとめられる
• ノード数を削減したいグラフをGとする
1. Gからノードvを適当に選ぶ
2. NG(v, ∞)
3. G内のノードからvに到達できるノードの集合NG’(v,∞)を求める
4. NG(v,∞) ∩ NG’(v,∞) によって強連結なノードを求める
5. 4. で求めたノードを削除し,1つのノードに置き換え,適当に辺を張る
6. 以上を適当に繰り返す