Menu
CoddyTech

惯性

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

本章介绍如何选择 k。学完后,你将为一家面包店的配送选择 k,并绘制区域图:

一张城市配送站点地图,横轴为向东的距离(单位:km),纵轴为向北的距离(单位:米),站点被分为 3 个区域,分别有 45、40 和 25 个站点,每个区域中心都有一颗黑色星星

首先,看一个分数。惯性会累加每个点到其中心的距离的平方:点越靠近中心,这个值就越小。

36 个苹果分成三组,每个苹果都通过一条细灰线连接到所在组的黑色星形中心。惯性会将每条线段的长度平方后相加

KMeans 会将它保存在 inertia_ 中。对于 180 个苹果:

for k in [1, 2, 3, 4]:
    km = KMeans(n_clusters=k, n_init=10, random_state=0)
    km.fit(X)
    print(k, round(km.inertia_))

这会输出:

1 1718
2 752
3 230
4 196

中心越多,辐条越短:随着 k 增大,惯性总会减小。每个点都有一个中心时,惯性为 0,所以最小并不代表最好。

challenge icon

挑战

简单

一家陶器作坊把花瓶装进几种尺寸的盒子里。每个花瓶都会选最接近的尺寸;惯性衡量它们的匹配程度。程序读取 budget,也就是这家作坊能接受的最大不匹配程度。

  1. 依次尝试 k = 1、2、3 等:在 vases 上拟合 KMeans,并打印每个 k 对应的惯性,四舍五入后显示。
  2. 当惯性首次不超过预算时停止,并打印这个 k。

对于另一家陶器作坊:

k = 1, inertia 15120
k = 2, inertia 4811
k = 3, inertia 1290
Box sizes needed: 3

亲手试试

import numpy as np
from sklearn.cluster import KMeans

# 不要修改下面的代码
rng = np.random.default_rng(8)
# 四种花瓶:典型高度和宽度(单位:厘米),以及各自的数量
kinds = [(15, 8, 25), (38, 13, 25), (22, 22, 20), (58, 26, 10)]
parts = []
for h, w, n in kinds:
    parts.append(np.column_stack([rng.normal(h, 2.5, n), rng.normal(w, 2, n)]))
# 80 个花瓶,每行一个:高度和宽度(单位:厘米)
vases = np.round(np.concatenate(parts), 1)

# 陶器店能接受的最大不匹配程度,用惯性衡量
budget = int(input())

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

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

无监督学习中的所有课

自己练习: Python 在线编译器