デンドログラム
CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 18/51。
章の冒頭にある木はデンドログラムです。それぞれの括弧は、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]最も長い辺を横切るように切ります。以下のグループは大きく離れています。
チャレンジ
中級海洋ガイドは、16頭のクジラとイルカを体長、体重、潜水深度でグループ分けします。スターターコードはそれらをスケーリングし、カットする高さ cut を読み込みます。
- ウォード法の樹形図
Zを作成し、axに描画します。動物名は90度回転させ、色分けはカット位置で止めます。 - カット位置を灰色の破線で描画してから、表示します。
- グループ数を出力します。
11種類の果物をカット位置3.5で分ける場合:
Cut at 3.5: 3 groupsCoddyがあなたの樹形図を説明します。
自分で試してみよう
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")
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師なし学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ