← 機械学習テキスト 一覧

🎓 レベル:標準 | 重要度:B(標準)

📎 前提:k-meansクラスタリング | 数理:クラスター分析(統計)

要点(BLUF)

1. 階層的クラスタリングとは

k-meansクラスタリング は「クラスタ数 kk を先に決めて、点を kk 個のグループに分割する(フラットなクラスタリング)」手法でした。階層的クラスタリングはこれと発想が違い、1個の階層構造を作って、分割の仕方を全部いっぺんに表現します

イメージは生物の分類です。「個体 → 種 → 属 → 科 → …」と、小さいまとまりが入れ子で大きいまとまりになっていく。階層的クラスタリングはまさにこの入れ子(hierarchy)をデータから作ります。出力は1つの木で、

を同時に表します。kk を決め打ちせず、後から木を眺めて決められるのが最大の特徴です。

要するに:「kk を当てに行く」のではなく「クラスタの入れ子構造そのものを作る」のが階層的クラスタリングです。

2. 凝集型と分割型

階層を作る方向に2通りあります。

方式方向手順
凝集型(agglomerative)ボトムアップ各点を1クラスタとして開始 → 最も近い2クラスタを併合 → 1個になるまで繰り返す
分割型(divisive)トップダウン全点を1クラスタとして開始 → 最も不均質なクラスタを2分割 → 各点が1個になるまで繰り返す
flowchart TB
    subgraph AGG["凝集型 (bottom-up)"]
        direction TB
        A1["n個の点 = n個のクラスタ"] -->|"最も近い対を併合"| A2["n-1 個"]
        A2 -->|"併合"| A3["n-2 個"]
        A3 -->|"…"| A4["最後は1個 (全体)"]
    end
    subgraph DIV["分割型 (top-down)"]
        direction TB
        D1["全点 = 1個のクラスタ"] -->|"最も不均質な所で2分割"| D2["2個"]
        D2 -->|"分割"| D3["…"]
        D3 -->|"分割"| D4["n個 (各点が単独)"]
    end

実務でほぼ常に使うのは 凝集型 です。分割型は「あるクラスタをどこで2つに割るか」の候補が指数的(2m112^{m-1}-1 通り)にあり、素朴にやると組合せ爆発します(近似手法に DIANA があります)。以降は凝集型を中心に説明します。

要するに:下から積むのが凝集型、上から割るのが分割型。実用上は凝集型が標準です。

3. 距離行列と連結法(linkage)

凝集型の各ステップでやることは1つ、「最も近い2クラスタを選んで併合する」だけです。問題は「クラスタとクラスタの近さ」をどう定義するか。点と点の距離 d(x,y)d(x, y)(ふつうユークリッド距離)は決まっていても、複数点を含むクラスタ AABB の距離は一意ではありません。この定義が 連結法(linkage criterion) です。

代表的な4つを挙げます。クラスタ A,BA,\,B、点 aA, bBa\in A,\ b\in B とします。

単連結(single linkage / 最短距離法)

dsingle(A,B)=minaA, bBd(a,b)d_{\text{single}}(A, B) = \min_{a\in A,\ b\in B} d(a, b)

2クラスタのいちばん近い点どうしの距離で測ります。「橋が1本架かれば近い」と判定するため、点が数珠つなぎに連なる細長いクラスタを作りやすい。これを 鎖効果(chaining effect) と呼びます。非球状のクラスタを拾える長所でもあり、ノイズで関係ないクラスタが繋がる短所でもあります。

完全連結(complete linkage / 最長距離法)

dcomplete(A,B)=maxaA, bBd(a,b)d_{\text{complete}}(A, B) = \max_{a\in A,\ b\in B} d(a, b)

いちばん遠い点どうしの距離で測ります。全ペアが近くないと併合されないので、コンパクトで径の揃った(球状寄りの)クラスタを作りやすい。外れ値の影響を受けやすい点に注意。

群平均(average linkage / UPGMA)

daverage(A,B)=1ABaAbBd(a,b)d_{\text{average}}(A, B) = \frac{1}{|A|\,|B|}\sum_{a\in A}\sum_{b\in B} d(a, b)

全ペア距離の平均で測ります。単連結(min)と完全連結(max)の中間で、両者の極端さを和らげた穏当な選択です。

ウォード法(Ward’s method)

ここだけ「距離の min/max/平均」ではなく分散基準で測ります。ウォード法は「併合によってクラスタ内平方和(within-cluster sum of squares, ESS)がどれだけ増えるか」が最小になる対を選びます。

クラスタ CC の内部平方和を、重心 c=1CxCx\mathbf{c}=\frac{1}{|C|}\sum_{x\in C}x として

ESS(C)=xCxc2\mathrm{ESS}(C) = \sum_{x\in C}\lVert x-\mathbf{c}\rVert^2

と定義します(k-meansクラスタリング の目的関数と同じ「重心からの二乗距離の和」です)。クラスタ AABB を併合したときの ESS の増分は、重心 cA,cB\mathbf{c}_A,\mathbf{c}_B、サイズ nA,nBn_A,n_B を使ってきれいに書けます。

ΔESS(A,B)=ESS(AB)ESS(A)ESS(B)=nAnBnA+nBcAcB2\Delta\mathrm{ESS}(A,B) = \mathrm{ESS}(A\cup B) - \mathrm{ESS}(A) - \mathrm{ESS}(B) = \frac{n_A\,n_B}{n_A+n_B}\,\lVert \mathbf{c}_A-\mathbf{c}_B\rVert^2

ウォード法はこの ΔESS\Delta\mathrm{ESS} が最小の対を毎ステップ併合します。

要するに:ウォード法は「併合してもクラスタがあまり広がらない(ばらつきの増加が小さい)対」から順にくっつけます。重心間距離をサイズで重みづけした量を最小化する、kk-means と親戚の基準です。サイズの揃った球状クラスタを作りやすく、実務でまず試す既定の連結法としてよく使われます。

連結法ごとの樹形の癖(まとめ)

graph LR
    L["連結法の選択"] --> S["単連結 (min)"]
    L --> C["完全連結 (max)"]
    L --> A["群平均 (mean)"]
    L --> W["ウォード法 (ESS増分)"]
    S --> Sc["細長い・鎖効果 / 非球状も拾うがノイズに弱い"]
    C --> Cc["コンパクト・球状寄り / 外れ値に敏感"]
    A --> Ac["min と max の中間でバランス型"]
    W --> Wc["サイズの揃った球状 / k-means と親戚・既定で多用"]
連結法クラスタ間距離作りやすい形弱点
単連結最近点間 min\min細長い・非球状鎖効果でノイズに弱い
完全連結最遠点間 max\maxコンパクト・球状寄り外れ値に敏感
群平均全ペア平均中庸強い癖はないが万能でもない
ウォード法ΔESS\Delta\mathrm{ESS}サイズの揃った球状非球状・サイズ不均衡に弱い

4. Lance–Williams の更新式(連結法を一本化する)

連結法ごとに「クラスタ間距離をどう測るか」を別々に定義しましたが、実はほとんどの連結法は1本の漸化式に統一できます。これが Lance–Williams の更新式(Lance & Williams, 1967)です。

いま AABB を併合して新クラスタ ABA\cup B を作ったとします。残りのクラスタ CC に対する新しい距離 d(AB,C)d(A\cup B,\,C) を、併合前にわかっている3つの距離 d(A,C),d(B,C),d(A,B)d(A,C),\,d(B,C),\,d(A,B) だけから計算できる、というのが要点です。

d(AB,C)=αAd(A,C)+αBd(B,C)+βd(A,B)+γd(A,C)d(B,C)d(A\cup B,\, C) = \alpha_A\, d(A,C) + \alpha_B\, d(B,C) + \beta\, d(A,B) + \gamma\,\bigl|\,d(A,C) - d(B,C)\,\bigr|

係数 (αA,αB,β,γ)(\alpha_A,\alpha_B,\beta,\gamma) を選ぶだけで、連結法を切り替えられます(nA,nB,nCn_A,n_B,n_C は各クラスタのサイズ)。

連結法αA\alpha_AαB\alpha_Bβ\betaγ\gamma
単連結1/21/21/21/2001/2-1/2
完全連結1/21/21/21/200+1/2+1/2
群平均(UPGMA)nAnA+nB\dfrac{n_A}{n_A+n_B}nBnA+nB\dfrac{n_B}{n_A+n_B}0000
重心法(UPGMC)nAnA+nB\dfrac{n_A}{n_A+n_B}nBnA+nB\dfrac{n_B}{n_A+n_B}nAnB(nA+nB)2-\dfrac{n_A n_B}{(n_A+n_B)^2}00
ウォード法nA+nCnA+nB+nC\dfrac{n_A+n_C}{n_A+n_B+n_C}nB+nCnA+nB+nC\dfrac{n_B+n_C}{n_A+n_B+n_C}nCnA+nB+nC-\dfrac{n_C}{n_A+n_B+n_C}00

γ=12\gamma=-\tfrac12 なら αAd(A,C)+αBd(B,C)12d(A,C)d(B,C)=min\alpha_A d(A,C)+\alpha_B d(B,C)-\tfrac12|d(A,C)-d(B,C)| = \min になり、確かに単連結=最小、γ=+12\gamma=+\tfrac12 なら max\max=完全連結になります。ウォード法・重心法では距離は二乗ユークリッド距離を入れて使います。)

要するに:連結法は「距離をどう測るか」をバラバラに実装する必要はなく、4つの係数を差し替えるだけで統一的に計算できます。距離を毎回ゼロから測り直さず、併合のたびに行を1本の式で更新できるので実装も速くなります。⚠️ ただし重心法・メディアン法は dd が単調に増えない(あとで併合した方が距離が小さくなる=デンドログラムの逆転 / inversion が起きうる)ので、樹形図が読みにくくなることがあります。単・完全・群平均・ウォードは逆転しません。

5. デンドログラム(樹形図)の読み方

凝集型の併合の履歴をそのまま描いた図が デンドログラム です。

つまり「低い位置で合流する点どうしは近い、高い位置でしか合流しない点どうしは遠い」と読みます。

graph TD
    R["高さ大: 全体が1つに (遠い者どうしの最後の合流)"]
    R --- G1["中くらいの高さで合流"]
    R --- G2["中くらいの高さで合流"]
    G1 --- p1["点1"]
    G1 --- p2["点2"]
    G2 --- p3["点3"]
    G2 --- p4["点4"]

高さで「切る」とクラスタ数が決まる

デンドログラムをある高さで水平に切断すると、切った線が横切る縦線の本数だけクラスタができます。低く切れば細かく多数のクラスタ、高く切れば粗く少数のクラスタ。ここで kk を後から選べるのが階層的クラスタリングの強みです。

切る高さの目安として、「併合のたびに高さがどれだけ飛ぶか」を見て、大きくジャンプする直前で切る方法がよく使われます(高さの差が大きい=そこで離れたものを無理にくっつけ始めた、という合図。kk-means のエルボー法に似た発想です)。

要するに:デンドログラムは「いつ・どのくらいの距離で併合したか」の全履歴で、横に切る高さを変えるだけで任意の kk のクラスタリングが取り出せます。

6. 計算量と大規模データでの限界

凝集型の素朴な実装のコストは、

優先度付きキューや最近傍チェーン(nearest-neighbor chain)を使うと一般に O(n2logn)O(n^2\log n) まで、単連結に限れば最小全域木との対応から SLINK(Sibson 1973)で時間 O(n2)O(n^2)・メモリ O(n)O(n) の最適アルゴリズムが知られています。

それでも本質は最低でも O(n2)O(n^2)(全点対を一度は見る)です。nn が数十万を超えると距離行列 O(n2)O(n^2) のメモリだけで破綻するため、階層的クラスタリングは中小規模(おおむね数千〜数万点)向きと理解してください。大規模なら kk-means や 混合ガウスモデルとEM、あるいはミニバッチ・近似手法が現実的です。

7. k-means との比較

観点階層的クラスタリングk-meansクラスタリング
kk の事前指定不要(後から木を切って選ぶ)必要(先に決める)
出力階層(デンドログラム)丸ごとフラットな kk 分割のみ
再現性決定的(同じ入力=同じ結果)初期値依存でランダム(毎回変わりうる)
クラスタ形状連結法しだい(単連結なら非球状も可)基本は球状・等方を仮定
計算量重い(O(n2)O(n^2)O(n3)O(n^3)、メモリ O(n2)O(n^2)軽い(反復あたり O(nkd)O(nkd)、大規模向き)
解釈性高い(木で関係が一望できる)中(重心と割り当てのみ)
graph TB
    Q["どちらを使う?"] --> Q1{"k を事前に決められる?"}
    Q1 -->|"決めにくい / 階層構造を見たい"| H["階層的クラスタリング"]
    Q1 -->|"k は見当がつく"| Q2{"データは大規模?"}
    Q2 -->|"大規模 (数十万〜)"| K["k-means (軽い)"]
    Q2 -->|"中小規模で形が非球状 / 樹形を見たい"| H
    Q2 -->|"中小規模で球状でよい"| K

要するに:「kk を決めずに構造を見たい・解釈したい・再現性が欲しい・データが中小規模」なら階層的。「kk の見当がついて大規模で速さが欲しい」なら kk-means。両者は対立ではなく、まず階層的で構造と kk の当たりをつけ、本番の分割は kk-means で回すといった併用も定番です。

⚠️ よくある誤解・落とし穴

対応するシミュレーション

simulations/hierarchical_dendrogram.py:3つの塊データにウォード法の凝集型クラスタリングをかけ、併合の履歴を**デンドログラム(樹形図)**として描きます。低い高さで結ばれる点ほど似ていること、k-means と違い事前にクラスタ数を決めず、デンドログラムを好きな高さで横に切るだけで任意の数のクラスタが得られることを可視化します。連結法しだいで結果が変わる点にも触れます(k-meansクラスタリング と使い分け)。

連結法とデンドログラム

関連ノート