見出し画像

scikit-learn機械学習㉝スペクトラル・クラスタリング(グラフ理論の視点から)

前回は、DBSCANでクラスタリングの実験を行いました。

複雑なデータセットをクラスタリングすることができましたが、クラスタ数をあらかじめ指定することはできませんでした。

しかし、複雑なデータセットでもクラスタ数を指定したいこともあるでしょう。ただし、k-means ではうまくいかないことはわかっています。さて、どうしたものでしょう。

そこで、複雑な形状に対応しクラスタ数も指定できるスペクトラル・クラスタリング(Spectral Clustering)を紹介します。今回は、グラフ理論の視点から始めてラプラシアン行列を準備するところまでを解説します。


スペクトラル・クラスタリングとは

ざっくり言うと

スペクトラル・クラスタリングは、データ間の関係性をグラフで表し、そのパターンを解析してクラスタに分ける手法です。

しかし、それではざっくりすぎるのでもう少し正確に定義するためにグラフについて解説します。

グラフとノード

グラフにはノード(Node)の集まりがあります。例えば、こんな感じです。

ノードの集まり

上図の◯がノードで、$${n_1, n_2, n_3, n_4}$$の4つがあります。

ノードのことを「頂点」とも呼びます。これは英語の Vertex(複数形はVertices)から来ています。数学ではこちらの方がよく使われます。

グラフの用途にはいろいろありますが、一般的にノード全体の連結状況を把握するのに有用です。そこで、関係があるノード間を線で接続して関係性を表現します。

例えば、こんな感じに関連するノードを線で結びます。

この線のことをエッジ(Edge)と呼びます。矢印があるのは、関係に方向性があることを意味します。仮に、ノードが観光名所だとして、エッジが観光ルートを表現しているとすると、このグラフは観光地を巡る順番を表現しています。

エッジに方向性があるグラフを有向グラフ(Directed Graph)と呼びます。

データの関連性を表現

一方で、スペクトラル・クラスタリングはデータ間の類似度をグラフで表すので、エッジに方向性は必要ありません。

例えば、$${\boldsymbol{x}_1, \boldsymbol{x}_2, \boldsymbol{x}_3, \boldsymbol{x}_4}$$は4つのデータポイント(ベクトル値)を表現しているとします。

内容に関連性がある(類似している、近い)データポイントを線で結んでいます。

よって、$${\boldsymbol{x}_1}$$は$${\boldsymbol{x}_4}$$とは直接的な関係性はありません。しかし、$${\boldsymbol{x}_2}$$を通して間接的につながっています。

すると、全てのノードが直接的・間接的に連結しいることになり、全体が一つの連結グラフ(Connected Graph)を形成しています。

エッジに方向性がないグラフを無向グラフ(Undirected Graph)と呼びます。

なお、グラフが部分的に連結している場合は、その部分を連結成分(Connected Component)と呼びます。

上図では、2つの連結成分($${\boldsymbol{x}_1, \boldsymbol{x}_2}$$と $${\boldsymbol{x}_3, \boldsymbol{x}_4}$$)があります。これを2つのクラスタと捉えることができます。

なお、全てのノード間がエッジでつながっているグラフではノードが全結合していると言います。

全結合していても、関連性の強さをエッジの太さで表現することで、どのノードがより強く連結しているのかを判断することができます。

もう一度ざっくり

しかし、このままだと数学的に扱うには不便です。よって、関連性の強さを重みの数値で表現します。

関連性の重みが小さいものは、関連性がないとみなしてクラスタに分けることができます。データ間の類似度を重みとしているので、これを類似度グラフと呼ぶことにします。

つまり、スペクトラル・クラスタリングは「データ間の関係性を類似度グラフで表し、そのパターンを解析してクラスタに分ける手法」です。

類似度グラフを生成する

もう少し具体例を使って類似度グラフの生成を見ていきます。

3つのデータポイント

例えば、3つのデータポイント(A、B、C)があるとします。これをグラフのノードとして表現し、ノード間の結合(エッジ)に重みがあると考えます。

AとBのエッジの重みは3、BとCの重みは2です。AとCの間にはエッジがなく、重みは0です。このようなグラフを類似度グラフと呼ぶことにします。

例えば、以下のように2つのクラスタに分けるとことができます。ここでは単純にエッジの重みが3以上かどうかによって判断しています。

繰り返しになりますが、クラスタリングは類似度グラフを分割することと同じであることがわかります。

では、類似度グラフはどのように生成されるのかを見ていきましょう。

どのデータを連結するのか

類似度グラフを作るには、どのデータが結合するのかを決める必要があります。すべてのノードを結合する全結合は手法としては単純ですが、データポイントの数$${n}$$が増えるに従って、重みの計算量が$${{n}^2}$$と多くなります。よって、ある程度の類似度がある場合にだけ結合を行いその他すべての重みを0とするといった工夫が行われます。

  • $${\varepsilon}$$-近傍グラフ:距離が$${\varepsilon}$$以内のデータポイントのみを結合。

  • $${k}$$-近傍グラフ:最も近い$${k}$$個のデータポイントだけを結合。

  • 全結合グラフ:全てのデータポイントを結合。

ここまでは、データの連結を決める作業でした。つまり、ノード間に線を引く(エッジがあるかどうかを決める)段階です。

次に、エッジの重みの計算方法を見ていきます。

カーネルによる重みの計算

結合されたエッジの重みの計算には、関数(カーネルと呼ばれる)を指定します。SVMでも登場したカーネル関数ですが、データポイント間の類似度を計算する関数を意味します。

例えば、RBFカーネル(Radial Basis Function)では重み$${W_{ij}}$$をガウス関数を使って以下のように計算します。

$$
W_{ij} = \exp\left(-\gamma \, \|\boldsymbol{x}_i - \boldsymbol{x}_j\|^2\right)
$$

$${\|\boldsymbol{x}_i-\boldsymbol{x}_j\|}$$は$${i}$$番目のデータ$${\boldsymbol{x}_i}$$と$${j}$$番目のデータ$${\boldsymbol{x}_j}$$のユークリッド距離です。

また、$${\gamma > 0}$$は、距離による重みの低減を調節するためのハイパーパラメータとして使われます。

  • $${\gamma}$$ が大きいほど、カーネルの値(類似度)が急激に減少します。つまり、近いデータポイント間だけが高い類似度を持つようになります。

  • $${\gamma}$$ が小さいほど、類似度の減少が緩やかになり、遠く離れたデータポイント間にもそれなりに高い類似度が生じやすくなります。

他にもカーネルの種類がありますが、それは実装編で紹介します。

ここまで、グラフの生成と重みの計算について解説しました。これによって、隣接グラフを構成する要素を決めることができました。しかし、このままだと数学的に扱いにくいです。

そこでグラフ構造を行列に置き換えます。

グラフから隣接行列へ

もう一度、前述のグラフを見てください。

このグラフを基に行列$${W}$$を作ります。

重みとエッジの関係がわかるようにノード名A、B、Cを添えました。

対角線上は、ノード自身に対する接続なのでエッジはなく、重みは0となります。それ以外は、異なるノード間の結合の重みです。例えば、ノードAとBの重みは3になっています。

この行列を隣接行列(Adjacency matrix)と呼びます。

なお、この行列で計算を行う際に、ノード名A、B、Cと添えることはなく、行列の成分は、行と列のインデックスで表現します。

よって、$${i}$$行$${j}$$列の重み成分を$${W_{ij}}$$と表現します。また、隣接行列の成分は常に0以上($${W_{ij} \geq 0}$$)とし、そのようになるカーネルを使います。

なお、隣接行列は対称行列($${W_{ij} = W_{ji}}$$)になっています。これは、「A→B」と「B→A」を区別せずに、結合の重みは同じということです。

このことはグラフが無向グラフであることを表現してもいます。エッジの重みは類似度を表しており方向に依存しないからです。

つまり、隣接行列は類似度グラフそのものです。

次に、この隣接行列をラプラシアン行列(グラフラプラシアン)に変換します。これは、その後に続く分析のための準備になります。

ラプラシアン行列を準備する

ラプラシアン行列の準備自体は簡単なのですが、後になるまでラプラシアン行列がなぜ役に立つのがよくわからない状態が続きます。

なので、まずはスペクトラル・クラスタリングのアプローチについてDBSCANと比較して解説し、ラプラシアン行列を準備する動機づけを行います。

DBSCANと比べると

スペクトラル・クラスタリングとDBSCANは、データポイントのつながりを重視する点で似ています。そのため両者ともに複雑なデータ分布を扱うことが(k-means などと比べて)得意です。

しかし、DBSCANが局所的な密度分布に基づいてクラスタを直接生成するのに対し、スペクトラル・クラスタリングは全体構造からクラスタへと分割するという異なるアプローチを取ります。

  • DBSCANはボトムアップ方式:データポイントの局所的な密度に従ってクラスタを構成します。

  • スペクトラル・クラスタリングはトップダウン方式:グラフでデータセット全体の関係性を表現してから、クラスタへと分割します。

そこで、すでに見たように、スペクトラル・クラスタリングではグラフを隣接行列を使って表現します。データ間の関係性の強さ(エッジの重み、データの類似度、距離の近さ)が、この行列の成分として数値になっており、グラフにある全ての情報が詰まっています。

しかし、このままではクラスタへと分解するのが容易ではありません。

そこで隣接行列をラプラシアン行列へ変換します。

次数行列を作る

ラプラシアン行列を準備するために、次数行列(Degree Matrix)を作ります。

次数行列$${D}$$は、各データポイント(ノード)に接続するエッジの重みの総和を対角成分に持つ対角行列です。それ以外の成分はすべて0になります。

具体例として上述の隣接行列$${W}$$から計算すると、次数行列$${D}$$は以下になります。

$$
\begin{aligned}
\text{隣接行列 } W &= \begin{bmatrix}
0 & 3 & 0 \\
3 & 0 & 2 \\
0 & 2 & 0
\end{bmatrix} \\[5ex]
\text{次数行列 } D &= \begin{bmatrix}
3 & 0 & 0 \\
0 & 5 & 0 \\
0 & 0 & 2
\end{bmatrix}
\end{aligned}
$$

つまり、次数行列$${D}$$の各対角成分は対応する各ノードに対する他のノードからの「つながりの強さ」を表現しています。

一般に、次数行列$${D}$$の各対角成分はノード$${i}$$に接続するエッジの重みの総和として隣接行列$${W}$$の成分を使って次のように計算します。

$$
D_{ii} = \sum\limits_{j=1}^n W_{ij}
$$

全体として、次数行列$${D}$$は次のように定義されます。

$$
D = \begin{bmatrix}
 \\[-6pt]
\sum\limits_{j = 1}^n W_{1j} & 0 & \ldots & 0 \\[2ex]
0 & \sum\limits_{j = 1}^n W_{2j}  & \ldots & 0 \\[2ex]
\vdots & \vdots & \ddots & \vdots \\[2ex]
0 & 0 & \ldots & \sum\limits_{j = 1}^n W_{nj} \\[2ex]
\end{bmatrix}
$$

なお、隣接行列は対称行列なので、次数行列の成分は次のようにも計算できます。

$$
D_{ii} = \sum\limits_{j=1}^n W_{ji}
$$

ラプラシアン行列を作る

次に、次数行列$${D}$$と隣接行列$${W}$$を用いて、ラプラシアン行列$${L}$$を次のように計算します。

$$
L = D − W
$$

上例の次数行列$${D}$$と隣接行列$${W}$$を使うと、以下になります。

$$
L = D - W = \begin{bmatrix}
3 & 0 & 0 \\
0 & 5 & 0 \\
0 & 0 & 2
\end{bmatrix} - \begin{bmatrix}
0 & 3 & 0 \\
3 & 0 & 2 \\
0 & 2 & 0
\end{bmatrix} = \begin{bmatrix}
3 & -3 & 0 \\
-3 & 5 & -2 \\
0 & -2 & 2
\end{bmatrix}
$$

ラプラシアン行列の特性は、以下になります。

  • 対角成分:各ノードの「つながりの強さ」(次数)が記載されています。

  • 非対角成分:ノード間の接続の強さが負の値として記載されています。

  • ラプラシアン行列の列ごと(または行ごと)の総和は必ず0になります

これらの特性が後での分析で役に立ちます。

今のところは、ラプラシアン行列の各列が、ノードがグラフ内でどのように接続されているのかを反映しているとだけ理解してください。

例えば、ノード$${i}$$は$${i}$$番目の列ベクトルとして、他のすべてのノードとの接続の強さや連結の関係を数値的に表現しています。

対称行列なので、$${i}$$番目の行ベクトルで考えても同じです。

クラスタ数が指定できる理由

ラプラシアン行列は「グラフ全体のグローバルなデータ構造」を表現していますが、全ては隣接行列から得られる情報で構成されています。

では、なぜラプラシアン行列を作るのでしょうか。

実は、ラプラシアン行列を固有値分解することで、グラフの構造が理解できます。例えば、全体が連結する連結グラフになっているのか、部分的に連結しているのかがわかります。また、連結成分の数も判定できます。

また、クラスタリングの目的では、ラプラシアン行列を固有値分解して得た情報を特徴量として、k-meansなどのアルゴリズムを適用しクラスタリングを行うことができます。

このためスペクトラル・クラスタリングでは、複雑なデータの分布に対してもクラスタ数の指定が可能になっています。

次回予告

次回は、ラプラシアン行列を固有値分解して、クラスタリングに必要な特徴量を抽出する過程を解説します。

お楽しみに!

いいなと思ったら応援しよう!