Introduction
こんにちは、k_oomoriです。前回は、非負値行列因子分解という手法によって実際の広告配信結果から関連性があると思われる広告キャンペーンのペアたちを抽出する方法を紹介しました。しかし、そこに現れるキャンペーンは全てが互いに関連し合っているわけではありません。おそらくはいくつかの離散的な“島”(連結成分)に分かれて存在しています(アイドル系の島、ソシャゲ系の島など)。そこで今回はキャンペーンの集合がいくつの島に分かれるのかを機械的に調べる方法について見ていきます。これにより、行列の固有値問題という純数学的・抽象的な概念も使い方によっては実際のビジネスシーンにおいて有用な情報を提供しうるということを示したいと思います。
なお、この記事をPDFで読みたい方はこちらからどうぞ。
隣接行列
前回のエントリでキャンペーン間の関連性を調べることができたので、まずはこれを隣接行列(adjacency matrix)という形にまとめます。簡単な例として、5つのキャンペーン(以下ではグラフ理論(graph theory)の用語を用いてノード(node)と呼びます)の間に図1に示したような関連性がある場合を考えると、隣接行列は以下のようになります。
つまり、1と2を結ぶ(1,2)成分と(2,1)成分、2と3を結ぶ(2,3)成分と(3,2)成分、3と4と5の間を結ぶ(3,4)成分,(4,3)成分,(3,5)成分,(5,3)成分,(4,5)成分,(5,4)成分の値を1に、その他の値を全て0にします。ここで注意として、現在はリンクに方向がない無向グラフを考えているので、隣接行列は常に対称行列()になります。また自分自身とのリンクも考えないため、対角成分は全て0になります。
図1:キャンペーン間の関連性の例:互いに関連のあるもの同士がリンク(枝線)で結ばれている
次に、番目のノードの次数 (
から出ているリンクの本数)を
成分とする対角行列
を考えます。上の例では
となります。別の書き方をすると
ラプラシアンとゼロ固有値
いよいよ表題にあるラプラシアン(Laplacian)を以下で定義します。
図1の例に当てはめると
これをよく見ると(というか実はの定義式から自明なのですが)、
の各行に注目し、要素を横に全部足していくと0になります。
これは取りも直さず、
(
は転置(transpose)の意)が
の固有値0に属する固有ベクトルになっているということを意味しています(固有値、固有ベクトルの定義についてはAppendix Aをご参照ください):
ここでは図1のケースについて具体的な計算によってが
の固有値0に属する固有ベクトルであることを示しましたが、一般に任意の隣接行列
に対して(4)式によって定義されるラプラシアン
は常に
を固有ベクトルに持ち、その固有値は0であることを示すことができます。
連結成分
図2:非連結グラフの例
図1の例では、ノード1~5が全体として一つの島を作っていました。つまり、連結グラフ(connected graph)をなしていました。では、ノード2と3の間に関連がなく、図2のように2つの島(連結成分(connected components)と言います)に分かれていた場合、それがの性質にどのように反映されるか、見ていきましょう。
を計算すると
となります。わかりやすくするよう、補助線をつけました。①②と③④⑤がの中で完全に分離していることが見て取れます。(8)式より、
と
はともに
の固有値0に属する互いに線形独立な固有ベクトルであることがわかります。
(先ほど出てきた
は
と
の線形結合(linear combination)として書けるので独立ではなく、従ってここでは考慮する必要はありません。)
つまり、(8)で与えられる
はゼロ固有値を2つ持っていることがわかります。実際、特性多項式(characteristic polynomial)を計算しても
となり、が2重根になっていることがわかります。
一般に、ラプラシアンのゼロ固有値の個数と対応するグラフの連結成分の数はぴったり一致しているということが示されます。(※この証明は少々面倒な議論が必要となるのでAppendix Bに回します。)実際、前のセクションでラプラシアンは常にを固有ベクトルに持ち、その固有値が0であることを示しました。これによりどんなグラフでも連結成分の数は常に1個以上であり、0個というおかしな結論が導かれることがないことが保証されます。
ノードの数が5個程度の場合は、図1や図2のようにグラフを書いてやればそれらが幾つの互いに無関係なグループに分かれるのかすぐにわかりますが、数が100個200個と増えてくると、いちいち全部を図示していくわけにはいきません。そのような場合でもNumPyにラプラシアンを読み込ませておいて
>>> from numpy import * >>> l,v = linalg.eig(L)
とやってやればlに固有値の配列が返されるので、その中にいくつゼロ固有値があるかを調べればそれだけで連結成分の数がわかるのです。やっぱり自動化は最高だぜ!
それでは確認のため実際のデータに適用してみましょう。145個のキャンペーンが絡む解析結果からラプラシアンを構成し、固有値を調べてみると0が17個ありました。一方、隣接行列を詳細に検証してみたところ、実際に17のブロックに分かれることがわかりました!両者が一致することは理論的に証明されていたとしても、実際に泥臭い計算で合うことが示せるとより確信が持てます。
ラプラシアンの固有値の性質
ラプラシアンの固有値の性質についてもう少し詳しく見ていきましょう。ここから先は少しadvancedな内容になりますが、結果を将来のエントリで使う可能性があるのでここで扱っておきます。
まず、前述のように無向グラフの隣接行列は対称行列なので、そこから定義されるラプラシアンも対称行列になります。また隣接行列、ラプラシアンの定義から行列の各成分は明らかに実数(もっと言うと実整数)です。線形代数において、実対称行列の固有値は全て実数であることが知られています。このことから、ラプラシアンの固有値は全て実数であることがわかります。
さらに、ラプラシアンの固有値は全て0か正の実数であり、決して負にはならないことが次のようにして示せます。
【証明】行列
と任意の
次元ベクトル
に対し、実二次形式(real quadratic form)を
で定義すると、ラプラシアンに対する実二次形式は
となり、決して負にはならないことがわかります(この性質を半正定値性(positive semi-definiteness)と言います)。一方、の
個の固有値を
、対応する固有ベクトルを
とすると
と書くことができます。ラプラシアンのような実対称行列の場合、個の固有ベクトル
は線形独立に取れるので、正規直交化(orthonormalize)することによって
行列
は直交行列となり、
の逆行列は
によって与えられます。(12)の両辺に左から
をかけると
となります。つまり、ある直交行列を用いると
が対角成分に固有値が並んだ対角行列の形に書くことができます。これを行列の対角化と言います。これを用いると、先ほどの実二次形式は
と書けます。ここでとし、
を使いました。式(11)と(14)から、
が結論されます。任意の実数に対して(15)が成り立つためには、
は全て0以上でなければなりません。以上のことから、ラプラシアンの固有値は全て0以上の実数であることが示されました。
今後の展望
図3:2つの島が弱く結合している例
今回は、グラフに含まれる連結成分の数がラプラシアンのゼロ固有値の数として表現されているということをお話ししました。しかし、実際には図3のようにほとんど2つに分かれているんだけれどもかろうじてつながっているというケースもありえます。このグラフについてラプラシアンを計算し、固有値を求めてみると
となります。比較のため、①と⑧のリンクを切って2連結成分に分離したものについても固有値を求めてやると
つまりグラフが完全に2つに分かれている場合はゼロ固有値が2つになるのに対し、それらが弱く結合されている場合は0ではないが他と比べて小さな固有値(0.3542)が出現するということがわかります。これは直観にも合ってはいるのですが、定量的な判断が必要なため今回の方法では検出するのが難しいです。今後はこのようなコミュニティ検出にチャレンジしてみたいと思っています。
Summary
I first defined adjacency matrix and Laplacian from a given graph, and showed that the Laplacian always has at least one 0-eigenvalue and the corresponding eigenvector. Then I argued that the multiplicity of 0-eigenvalues in the spectrum of the Laplacian agrees with the number of connected components of the graph concerned. In the coming blog entry I hope to tackle the community detection problem of a quantitative nature.
Appendix A: 固有値・固有ベクトルとは
正方行列に対して
を満たすベクトルとスカラー
が存在するとき、
を
の固有値(eigenvalue)、
を
に属する固有ベクトル(eigenvector)と呼びます。行列がベクトルに作用した結果として得られるベクトルは一般には元のベクトルと平行になるとは限りませんが、ある特定の向きのベクトルに対してはスカラー倍されるだけで向きは変わらないという意味になります。
またより一般に、ベクトル空間上に作用する線形変換
に対して固有値・固有ベクトルの概念を定義することができます。例として、(無限次元)ベクトル空間
として連続関数全体の集合を、その上の線形変換として1階の微分演算子
を考えたとき、
なのでは固有値
に属する
の固有ベクトル(この場合固有関数(eigenfunction)とも言う)になっています。
物理学の分野においても量子力学のシュレーディンガー(Schrödinger)方程式が固有値問題の形をとって現れます。
Appendix B: ラプラシアンのゼロ固有値の個数とグラフの連結成分の数が等しいことの証明
「連結成分」のセクションで後回しにした証明を行います。
【証明】ラプラシアンのゼロ固有値の数を、グラフの連結成分の数を
と置きます。まず、(8)式のときと同様、
個のブロックに対角化された
に対しては各ブロック上での値が全て1、その他の値が全て0というベクトル
が線形独立な固有値0の固有ベクトルとして構成できるので、であることはすぐにわかります。ここで、
が
の固有値0の固有ベクトルであるとすると、
一方、(11)の導出と同様にして
ここで、隣接行列は各連結成分ブロック(
)の上でしか0でない値を持たないということを使いました。(20)と(21)より、
が0でない全てのノードのペア
に対して
でなければなりません。ところがグラフが連結であるということの意味は、連結成分内の全てのノードが何らかの経路で繋がれているということなので、任意の2つのノード
に対して経路
が存在して
となります。従って結果的に
でなければなりません。
以上のことより、が固有値0の固有ベクトルとなるためには各連結成分上において値が全て一致していなければならないですが、他の連結成分との間には特に条件が課せられることはありません。従って、固有値0の固有ベクトル
の一般形は(19)の
を用いて
と書けます。ところがこの式は、の固有値0の固有ベクトル
は必ず(19)のベクトル
の線形結合として表せるということを示しているので、他に独立な固有ベクトルは存在せず、従って
個より多くのゼロ固有値を持つことはありません。これにより、
であることが示されました。
References
[1] Madeleine Udell, “Introduction to Spectral Graph Theory,” http://www.stanford.edu/~udell/doc/udell11_spectralnotes.pdf
[2] Santo Fortunato, “Community detection in graphs,” Physics Reports 486, pp. 75-174 (2010).