Menu
CoddyTech

树状图

本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 18 课,共 51 课。

本章开头的树状图是一个树状图。每个括号都在两个组群合并的高度处将它们连接起来:枝条越高,它们相距越远。

用一条线切分,线穿过的每个分支都会成为一组。这里是 4 组:

运动球树,虚线位于高度 1.2 处。下方分为四组:垒球、板球和棒球;网球、乒乓球和高尔夫球;篮球单独一组;排球、手球和足球

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. 构建 Ward 树 Z,并在 ax 上绘制:动物名称旋转 90 度,颜色在切割高度处停止。
  2. 将切割位置绘制为灰色虚线,然后显示图形。
  3. 打印分组数量。

对于 11 种水果,切割高度为 3.5 时:

Cut at 3.5: 3 groups

标题为水果的树,叶子名称朝上排列,一条高度为 3.5 的灰色虚线穿过三组彩色分支:柠檬、青柠和草莓;橙子、西柚和芒果;葡萄、樱桃、香蕉、苹果和梨

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)、体重(吨)、最大潜水深度(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 在线编译器