階層的クラスタリングシミュレーター 戻る
機械学習シミュレーター

階層的クラスタリングシミュレーター — 凝集型とデンドログラム

2D データに凝集型階層クラスタリングを適用し、デンドログラムをリアルタイム描画。リンケージ法と距離閾値を切り替えて、クラスタ数がどう決まるかを直感的に学べます。

パラメータ設定
リンケージ法

0=single(最短距離法)/1=complete(最長距離法)/2=average(群平均法/UPGMA)

距離閾値 t
データ点数(クラスタあたり)
データシード

既定値(average、t=3.0、10点×3、seed=42)で真の3クラスタが検出されます。

計算結果
t でのクラスタ数
最終合併距離 d_max
平均シルエットスコア
リンケージ法
散布図とデンドログラム

上=散布図(クラスタ色分け、軸 [−4,4]×[−4,4])/下=デンドログラム(X=点ID、Y=距離、橙破線=閾値 t)

理論・主要公式

凝集型階層クラスタリングは、各点を独立クラスタとして始め、最も近い2クラスタを合併する操作を繰り返します。リンケージ法はクラスタ間距離 $d(C_1,C_2)$ の定義を変えます。

single(最短距離法):

$$d(C_1,C_2)=\min_{x\in C_1,\;y\in C_2}\|x-y\|$$

complete(最長距離法):

$$d(C_1,C_2)=\max_{x\in C_1,\;y\in C_2}\|x-y\|$$

average(群平均法/UPGMA):

$$d(C_1,C_2)=\frac{1}{|C_1||C_2|}\sum_{x\in C_1}\sum_{y\in C_2}\|x-y\|$$

距離閾値 $t$ でデンドログラムを水平カットすると、その高さで残るクラスタ数が決まります。

階層的クラスタリングシミュレーターとは

🙋
機械学習の教科書でよく見る、あの逆さの木みたいなグラフ(デンドログラム)って結局何を表してるんですか?
🎓
あれは「どの点とどの点が、どれくらいの距離で仲間になったか」の合併履歴だよ。凝集型階層クラスタリングでは、まず全点を独立の30クラスタとして始めて、最も近い2つを合併していく。上のツールで既定値(average、t=3.0)で見ると、デンドログラム下の方で点同士がくっつき、上の方でグループ同士がくっついていくのがわかる。
🙋
オレンジ色の破線(t=3.0)はなんですか? あれで切ると3つのクラスタになってますね。
🎓
そう、それが「距離閾値でカットする」操作だ。デンドログラムを水平に切ると、その高さで残るクラスタ数が決まる。t=3.0で切ると3グループ、t=0.5まで下げれば30近くに細分化、t=10まで上げれば全部が1つになる。本来のデータが3つのガウス混合だから、t=3.0で3クラスタが正しく検出されているのが偶然じゃない仕組みだよ。
🙋
リンケージ法を「single(最短距離法)」に変えると、なんか1個の大きな塊に吸い込まれちゃいますね…?
🎓
いい観察だね。それが single linkage の「chaining効果」だ。クラスタ間距離を「最も近い1ペア」で測るから、間に1点でも橋渡しがあると別グループが繋がってしまう。complete だと逆に最も遠いペアで測るので、コンパクトなクラスタを作りやすい。average はその中間で、UPGMA という名前で系統学でも標準的に使われている安定した方法だよ。
🙋
実務だとk-meansとどう使い分けるんですか?
🎓
k-meansは最初にクラスタ数kを決める必要があるけど、階層的なら木構造のどの高さで切るかを後から選べる。だから「いくつに分けるべきか自体を知りたい」ときに強い。一方で計算量がO(n³)あるので、1万点を超えるような大規模データには厳しい。少量・中量のデータで、データの階層構造そのものを見たいときが階層的の出番だね。

よくある質問

Ward法はクラスタ間距離を直接定義する手法ではなく、合併コスト(分散の増加量)を最小化する点で他の3手法と性質が異なるためです。Lance–Williams更新式で同じ枠組みに収まりますが、最初の理解にはsingle/complete/averageを比較するだけで十分です。実務でWardが多用されるのは事実ですが、まずはこの3手法でリンケージの考え方を掴むことを優先しました。
本ツールでは2D点群のユークリッド距離を使っています。一般には任意の距離行列を渡せ、マンハッタン距離、コサイン距離、Jaccard距離なども使えます。系統学では配列間の編集距離、テキスト分類ではコサイン距離が定番です。距離の選択次第でクラスタの形が大きく変わるため、ドメイン知識に合った距離を選ぶことが実務では非常に重要です。
シルエットは各点について「同じクラスタ内の平均距離 a」と「最も近い別クラスタの平均距離 b」を比べ、(b−a)/max(a,b) を計算します。1に近いほど明確に分かれ、0付近はクラスタ境界が曖昧、負は別クラスタの方が近いことを示します。本ツールの既定値では0.5〜0.7程度になり、3ガウスの分離がはっきりしていることを示しています。
素朴な実装は時間O(n³)・空間O(n²)で、数千点で実用限界です。SLINK(single linkage、O(n²))やCLINK(complete linkage)などの高速化アルゴリズム、BIRCHのような大規模向け階層手法もあります。本ツールはN≤45の小規模デモなので何の最適化もしていません。1万点を超える場合はk-meansかMiniBatchKMeans、密度ベースならDBSCANが現実的な選択肢です。

実世界での応用

バイオインフォマティクス(系統樹推定):DNA配列やタンパク質配列の類似度から生物の進化系統樹を推定する古典的アルゴリズム、UPGMA(=average linkage)は階層的クラスタリングそのものです。配列アラインメントから距離行列を作り、デンドログラムを描いて分岐点で種を分類します。NCBIやMEGA、PhyMLなど主要な系統解析ソフトの基本機能として実装されています。

顧客セグメンテーション(マーケティング):購買履歴やデモグラフィックから顧客を階層的に分類し、デンドログラムを見て「何種類の顧客層に分けるべきか」をデータ側から決めます。k-meansと違って事前にkを決めなくてよいのが利点で、経営層に「3層に分けるか5層に分けるか」を提示できます。Rのhclust、scikit-learnのAgglomerativeClusteringが標準ツールです。

遺伝子発現解析(ヒートマップ):マイクロアレイやRNA-Seqで得た遺伝子×サンプル行列を、行(遺伝子)と列(サンプル)の両方向に階層的クラスタリングして並べ替え、ヒートマップとして可視化します。共発現する遺伝子グループや、似た発現パターンを持つサンプル群が一目で見えるため、生命科学論文では最頻出の可視化手法のひとつです。

異常検知・障害分析:製造業のセンサーデータやサーバーログを階層的に分類し、小さなクラスタや高い位置で合併する「孤立点」を異常候補として検出します。閾値tをスイープして「どの粒度で異常が出るか」を見るアプローチは、k-meansでは難しい階層的手法ならではの強みです。

よくある誤解と注意点

最も多い誤解は、「リンケージ法は好みで選ぶもの」と思ってしまうことです。実際にはデータの性質に応じて結果が劇的に変わります。single linkage は鎖状に伸びたクラスタを検出しやすい反面、ノイズ1点で本来別物のクラスタが繋がる「chaining効果」が起きます。complete はコンパクトな球状クラスタを好みますが、外れ値の影響を強く受けます。本ツールで既定値からリンケージだけを single に切り替えると、デンドログラムの形が大きく変わり、t=3.0で残るクラスタ数も変動するのが確認できます。データに合った手法を「比較して選ぶ」のが正解です。

次に多いのが、距離閾値tを「正解」と思い込んで決め打ちすることです。tは本質的にハイパーパラメータで、デンドログラムの「大きく開いた間隔」を目視で探したり、シルエットスコアを最大化する値を選んだり、ドメイン知識から決めたりします。本ツールではtスライダーを動かすとデンドログラム上の橙破線が上下し、それに応じてクラスタ数が階段状に変化するのが見えます。クラスタ数が安定する平坦な区間を選ぶのがコツです。

最後に、計算量O(n³)を甘く見ないこと。シミュレーター上は30点程度なので一瞬で計算が終わりますが、これが1万点になると単純計算で37万倍、10万点なら3.7億倍に跳ね上がります。本格的な大規模クラスタリングには、SLINK/CLINKのような特殊な高速アルゴリズム、k-meansやBIRCHのような近似手法、あるいはGPU並列化を検討する必要があります。「階層的だから少量データ向け」と覚えておくのが実務的です。