Menu
CoddyTech

凝聚式模型

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

两个停车场里停满了汽车,中间的道路上也排着一列汽车。合并成 2 个簇的两种方法:

同一批 102 辆汽车的两张图表。左图,Ward 链接:北侧停车场和南侧停车场分别是两个簇,包含 53 辆和 49 辆汽车,道路上的汽车被分到这两个簇中。右图,单链接:一个簇包含 101 辆汽车,另有 1 辆汽车单独成簇

scikit-learn 会进行合并。用 n_clusters 指定何时停止:

from sklearn.cluster import AgglomerativeClustering
model = AgglomerativeClustering(n_clusters=2, linkage="ward")
labels = model.fit_predict(X)

linkage 决定两个组之间的距离如何计算:

  • "ward",默认值:让各组保持紧密
  • "complete":取它们之间最远的一对
  • "average":取所有配对距离的平均值
  • "single":取它们之间最近的一对

单链接法会形成链状结构:这里的道路会吞并两个停车场。Ward 法会形成圆形且均匀的簇。

challenge icon

挑战

中等

野草莓长在三片区域里,此外还有一些沿着小路生长。哪种链接方式能找出这些区域?plants 保存了它们的位置。

  1. 针对 linkages 中的每种链接方式,将这些植株分成 3 组。
  2. 按从大到小的顺序,将各组的数量打印为列表。
  3. 如果最大的一组包含的植株超过一半,就添加 chained。

换一片草地时:

ward: [40, 38, 31]
complete: [41, 37, 31]
average: [41, 37, 31]
single: [86, 22, 1] chained

亲手试试

import numpy as np
import pandas as pd
from sklearn.cluster import AgglomerativeClustering

# 草地上 109 株野草莓的生长位置(单位:米):三个草莓丛和一条小径
rng = np.random.default_rng(4)
plants = np.round(np.concatenate([
    rng.normal([2, 3], 0.8, size=(40, 2)),
    rng.normal([9, 4], 1.0, size=(35, 2)),
    rng.normal([6, 10], 0.9, size=(25, 2)),
    np.column_stack([np.linspace(3, 8, 9), np.linspace(3.2, 4, 9)]) + rng.normal(0, 0.15, size=(9, 2)),
]), 2)
linkages = ["ward", "complete", "average", "single"]

# 在下方编写你的代码
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

无监督学习中的所有课

自己练习: Python 在线编译器