Menu
CoddyTech

使用 scikit-learn 实现 K-Means

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

scikit-learn 会为你运行整个 k-means 循环,这里使用的是按甜度和脆度评分的 180 个苹果:

180 个苹果,横轴表示甜度,纵轴表示脆度,分成三组,每组中心都有一个黑色星号:右上方是又甜又脆的苹果,底部是较软的苹果,左上方是酸而脆的苹果。右上方的一个新苹果加入了 cluster 0

仅使用 X 进行拟合,不使用 y:

from sklearn.cluster import KMeans
km = KMeans(n_clusters=3, n_init=10, random_state=0)
km.fit(X)
print(km.labels_[:8])
print(km.cluster_centers_.round(1))

这会打印 8 行的簇编号,然后每个中心对应一行:

[2 0 0 1 2 0 1 1]
[[7.  7.5]
 [6.  3. ]
 [2.9 8.1]]

n_init=10 会尝试 10 次初始化,并保留最紧密的结果。km.predict([[8.6, 9.2]]) 会为新苹果找到最近的中心,结果是 [0]。

labels = km.fit_predict(X) 会一次完成这两步:先拟合,然后返回 labels_。

数字只是名称:对于其他数据,cluster 0 可以是任意一组。

challenge icon

挑战

简单

一位生物学家记录了一头座头鲸的 150 次潜水:潜水时长,以及潜水后在水面休息的时长。潜水有不同类型吗?初始代码已设置好图表。

  1. 在 X 上拟合 KMeans:3 个簇,n_init=10,random_state=0。
  2. 将每个簇分别绘制为一组,标签从 cluster 0 到 cluster 2。
  3. 用黑色星形标记各簇的中心,标签为 centers。添加图例并显示图表。

例如,另一头鲸的图表是这样的:

标题为 Whale Dives 的散点图,横轴为潜水时长(分钟),纵轴为水面休息时长:有三个簇,左上方是潜水时间短、休息时间长的一簇,底部是潜水时间短、休息时间短的一簇,右侧是潜水时间长的一簇,每个簇都有一个黑色星形标记,并带有图例

Coddy 会描述你的图表。

亲手试试

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# 不要修改下面的代码行
rng = np.random.default_rng(14)
dive = np.concatenate([rng.normal(4, 1.0, 60), rng.normal(12, 2.0, 50), rng.normal(2.5, 0.7, 40)])
rest = np.concatenate([rng.normal(1.5, 0.5, 60), rng.normal(4, 1.0, 50), rng.normal(8, 1.5, 40)])
# 一头座头鲸的 150 次潜水记录:每次的潜水时间和之后在水面休息的时间,单位为分钟
X = np.round(np.clip(np.column_stack([dive, rest]), 0.5, None), 1)

fig, ax = plt.subplots()
ax.set_title("Whale Dives")
ax.set_xlabel("Dive (min)")
ax.set_ylabel("Surface rest (min)")

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

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

无监督学习中的所有课

自己练习: Python 在线编译器