使用 scikit-learn 实现 K-Means
本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 4 课,共 51 课。
scikit-learn 会为你运行整个 k-means 循环,这里使用的是按甜度和脆度评分的 180 个苹果:
仅使用 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 可以是任意一组。
挑战
简单一位生物学家记录了一头座头鲸的 150 次潜水:潜水时长,以及潜水后在水面休息的时长。潜水有不同类型吗?初始代码已设置好图表。
- 在
X上拟合 KMeans:3 个簇,n_init=10,random_state=0。 - 将每个簇分别绘制为一组,标签从
cluster 0到cluster 2。 - 用黑色星形标记各簇的中心,标签为
centers。添加图例并显示图表。
例如,另一头鲸的图表是这样的:
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)")
# 在下面编写你的代码
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
无监督学习中的所有课
自己练习: Python 在线编译器