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/6

2つのノード間に辺のある確率: 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.B

FROM E e1, E e2, E e3

WHERE 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.9

h(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.Y

FROM Reach, Arc

WHERE Arc.X = Reach.X
MapReduceによる推移閉包
の計算
• この計算は 2.3.7 の手法が使える
• 重複を排除するためには 2.3.8 の手法が使える
• しかし,グラフによっては収束回数が全然異なる

ex) Webページ

多くのページはあるページから10-15回で到達可. 

しかし到達まで長くかかる場合もある(前後にしか
リンクがないチュートリアルのページなど)
MapReduceによる推移閉包
の計算
• recursive-doubling query

SELECT DISTINCT p1.X, p2.Y

FROM Path p1, Path p2

WHERE 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. 以上を適当に繰り返す

MMDs10.6-7