Menu
CoddyTech

デンドログラム

CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 18/51。

章の冒頭にある木はデンドログラムです。それぞれの括弧は、2つのグループが結合した高さでそれらをつないでいます。脚が高いほど、グループ同士の距離は離れていました。

線で切ると、その線が横切る枝がそれぞれグループになります。ここでは、4つです:

高さ1.2の位置に破線が引かれたスポーツボールの木。下には4つのグループ:ソフトボール、クリケット、野球;テニス、卓球、ゴルフ;バスケットボールのみ;バレーボール、ハンドボール、サッカー

scipyはツリーを構築して描画し、fclusterで切り分けます:

from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
Z = linkage(scaled, "ward")
dendrogram(Z, labels=names, leaf_rotation=90, color_threshold=1.2, ax=ax)
ax.axhline(1.2, color="gray", linestyle="--")
groups = fcluster(Z, t=1.2, criterion="distance")
print(groups)

これはボールごとのグループ番号を出力します。バスケットボールは単独のグループです:

[2 2 2 1 1 1 3 3 3 4]

最も長い辺を横切るように切ります。以下のグループは大きく離れています。

challenge icon

チャレンジ

中級

海洋ガイドは、16頭のクジラとイルカを体長、体重、潜水深度でグループ分けします。スターターコードはそれらをスケーリングし、カットする高さ cut を読み込みます。

  1. ウォード法の樹形図 Z を作成し、ax に描画します。動物名は90度回転させ、色分けはカット位置で止めます。
  2. カット位置を灰色の破線で描画してから、表示します。
  3. グループ数を出力します。

11種類の果物をカット位置3.5で分ける場合:

Cut at 3.5: 3 groups

Fruitsというタイトルの樹形図。葉の名前は上向きに並び、高さ3.5の灰色の破線が3つの色付き枝を横切っている:レモン、ライム、イチゴ;オレンジ、グレープフルーツ、マンゴー;ブドウ、サクランボ、バナナ、リンゴ、ナシ

Coddyがあなたの樹形図を説明します。

自分で試してみよう

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from scipy.cluster.hierarchy import linkage, dendrogram, fcluster

# 16頭のクジラとイルカ:体長 (m)、体重 (tonnes)、最大潜水深度 (m)
whales = pd.read_csv("whales.csv")
names = list(whales["animal"])
scaled = StandardScaler().fit_transform(whales[["length_m", "weight_t", "dive_m"]])
cut = float(input())

fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.3)  # 樹形図の下に名前を表示するためのスペース
ax.set_title("Whales and Dolphins")
ax.set_ylabel("Merge height")

# 以下にコードを書いてください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師なし学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ