Menu
CoddyTech

以实际单位表示中心

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

一个簇的中心就是它的典型成员。K-means 在缩放后的数据中找到了公园的中心,因此这些中心的数值是 z 分数。同一组中心,变换前后如下:

主题公园游客的两张图表,图中用叉号标出了 3 个簇的中心。左图,缩放后的坐标轴:中心位于 0.8、1.3 这样的数值处。右图,实际单位:相同的中心分别位于 6.8 小时和 13.9 次游乐设施、6.0 和 6.2、2.4 和 3.0 处

保留缩放器:它会记住每个特征的均值和离散程度,而 inverse_transform 会撤销缩放:

scaler = StandardScaler()
km.fit(scaler.fit_transform(park))
centers = scaler.inverse_transform(km.cluster_centers_)
print(centers.round(1))

这会输出小时数、骑行次数和年龄,每个簇占一行:

[[ 6.   6.2 38.4]
 [ 2.4  3.  45.8]
 [ 6.8 13.9 20.7]]

簇 2 的中心是 0.8 和 1.3。现在它表示 6.8 小时和 13.9 次乘车:同一个点,只是换成了人们能理解的单位。

challenge icon

挑战

中等

一位手套制造商将手部数据聚类,划分为 4 种手套尺码。起始代码会对 150 只手的数据进行缩放和聚类,并将一位顾客的手部数据读入 new_hand。

  1. 找到新手部数据所属的聚类:先对它进行缩放。
  2. 将聚类中心转换回厘米。
  3. 按下方所示,输出该聚类中心,保留 1 位小数。

另一位手套制造商的数据:

Your glove size: hand 20.3 cm, palm 8.9 cm, finger 8.6 cm

亲手试试

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

# 手套制造商测量了 150 只手,单位为 cm:手长、手掌宽度和中指长度
hands = pd.read_csv("hands.csv")
scaler = StandardScaler()
scaled = scaler.fit_transform(hands)
# 每种手套尺码对应一个簇
km = KMeans(n_clusters=4, n_init=10, random_state=0)
km.fit(scaled)

# 一位新顾客的手部数据,存为一行且列名相同的表
new_hand = pd.DataFrame({
    "hand_cm": [float(input())],
    "palm_cm": [float(input())],
    "finger_cm": [float(input())],
})

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

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

无监督学习中的所有课

自己练习: Python 在线编译器