决策边界
本课属于 Coddy Machine Learning 学习旅程的“监督学习”单元。第 8 课,共 58 课。
决策边界是模型答案发生变化的位置。要观察它,可以在图表的每个位置询问模型,并将这些位置排列成网格:
np.meshgrid 会将每个 x 与每个 y 配对。将这些配对展平为行,预测所有行,再将答案还原为网格的形状:
xx, yy = np.meshgrid(np.linspace(2, 16, 100), np.linspace(0.5, 6.5, 100))
grid = np.column_stack([xx.flatten(), yy.flatten()])
zz = model.predict(grid).reshape(xx.shape)
ax.contourf(xx, yy, zz, levels=[-0.5, 0.5, 1.5], colors=["C0", "C1"], alpha=0.3)contourf 填充每个类别代码对应的区域:levels 将边界设在代码之间的中点,colors 与点的颜色匹配。之后再绘制点,让它们显示在上层。
挑战
简单一台自动售货机按硬币的大小和重量分类。起始代码会在 coins.csv 上拟合 k-NN(类别代码为 0 到 2);draw_coins(ax) 会绘制硬币。
- 创建一个 100 × 100 的网格
xx、yy:横向范围为 18 到 26 mm,纵向范围为 3 到 9 g。 - 预测每个点,并将结果存入形状与网格相同的
zz。 - 用 C0 到 C2 的颜色填充地图,然后绘制硬币并显示图像。
效果如下:
这是另一个国家的硬币,所以区域也会不同。
Coddy 会描述你的地图。
亲手试试
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
# 机器测量的每枚硬币占一行:直径(mm)、重量(g)、以美分为单位的面值
coins = pd.read_csv("coins.csv")
X = np.column_stack([coins["diameter_mm"], coins["weight_g"]])
# 类别代码:0 代表 10c,1 代表 20c,2 代表 50c
y = coins["value_c"].map({10: 0, 20: 1, 50: 2})
names = ["10c", "20c", "50c"]
model = KNeighborsClassifier(n_neighbors=5)
model.fit(X, y)
# 在 ax 上绘制硬币,每个类别使用一种颜色:C0、C1、C2
def draw_coins(ax):
for code in range(3):
ax.scatter(X[y == code, 0], X[y == code, 1], s=20, label=names[code])
ax.legend()
fig, ax = plt.subplots()
ax.set_title("Coin Sorter Map")
ax.set_xlabel("Diameter (mm)")
ax.set_ylabel("Weight (g)")
# 在下方编写你的代码
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
监督学习中的所有课
自己练习: Python 在线编译器