树状图
本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 18 课,共 51 课。
本章开头的树状图是一个树状图。每个括号都在两个组群合并的高度处将它们连接起来:枝条越高,它们相距越远。
用一条线切分,线穿过的每个分支都会成为一组。这里是 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。
- 构建 Ward 树
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)、体重(吨)、最大潜水深度(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 在线编译器