Menu
CoddyTech

聚类与已知标签

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

当标签存在,但 k-means 从未见过它们时,检查它找到的结果:pd.crosstab 会统计每个簇和标签的组合。

labels = KMeans(n_clusters=3, n_init=10, random_state=0).fit_predict(X)
print(pd.crosstab(labels, kind))

对于按长度和咖啡因含量聚类的 150 颗、共 3 种咖啡豆:每行代表一个簇,每列代表一种咖啡豆:

一个 3 行 3 列的计数表,行表示簇,列表示咖啡豆种类:阿拉比卡、利比里卡、罗布斯塔。簇 0 有 49 颗罗布斯塔豆;簇 1 有 48 颗阿拉比卡豆、3 颗利比里卡豆和 1 颗罗布斯塔豆;簇 2 有 47 颗利比里卡豆和 2 颗阿拉比卡豆

每个簇中的豆子大多属于同一类,只有 6 颗豆子分错了簇。而且 k-means 从未见过标签。

不过,簇并不是类。匹配度高意味着各类在数据上有所不同。匹配度低是一项发现,不是 bug。

challenge icon

挑战

中等

k 均值聚类能找出鸢尾花的品种吗?起始代码会对花朵进行缩放,将它们的名称保存在 species 中,读取 k 并对它们进行聚类。

  1. 将聚类结果与品种进行交叉统计。
  2. 对于每个品种,输出其在一个聚类中的最大数量,以及该品种的总数。
  3. 统计只包含一个品种的聚类数量。

换一个花园,并设 k = 3:

setosa: 48 of 50 share a cluster
versicolor: 41 of 50 share a cluster
virginica: 33 of 50 share a cluster
Clusters with one species: 0 of 3

亲手试试

import pandas as pd
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans

# 150 朵鸢尾花的数据已缩放,每朵花的物种名称对 k-means 隐藏
iris = load_iris()
X = StandardScaler().fit_transform(iris.data)
species = iris.target_names[iris.target]

k = int(input())
labels = KMeans(n_clusters=k, n_init=10, random_state=0).fit_predict(X)

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

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

无监督学习中的所有课

自己练习: Python 在线编译器