Menu
CoddyTech

k-NN 如何做出判断

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

本章将带你深入了解 k-NN。学完后,你就能为任意数据绘制它的区域图,就像这张展示温和与辣味辣椒的图一样:

80 个辣椒按长度和果壁厚度分布在一张着色区域图上:左侧的橙色区域表示模型判断为辣味,右侧的蓝色区域表示模型判断为温和

要给一个新的辣椒分类,k 近邻会找出与它距离最近的 k 个训练辣椒,并由它们投票:

辣椒的特写,其中一个新辣椒用黑色星号标出。灰线将它与距离最近的 5 个辣椒连接起来:其中 3 个辣,2 个不辣,因此辣的类别获胜

最近意味着距离最小,也就是你在单元 2 中遇到的那个概念。你来选择 k:

model = KNeighborsClassifier(n_neighbors=5)

n_neighbors 是 k,默认值为 5,除非你另有说明。只有两个类别时,奇数 k 永远不会出现平票。

challenge icon

挑战

简单

一个天文学俱乐部根据温度和星等,将 stars.csv 中的恒星分为矮星和巨星。初始代码会读取一颗新恒星和 k。

  1. 手动找出距离最近的 k 颗恒星:添加 distance 列,然后排序。
  2. 输出其中有多少颗是巨星,然后输出投票结果。
  3. 使用 k 值相同、基于所有恒星训练的 k-NN 模型进行检查。

对于另一个俱乐部的一颗恒星,且 k = 5:

Giants among the nearest 5: 4
By hand: giant
Model: giant

亲手试试

import numpy as np
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier

# 每颗恒星占一行:温度以千开尔文为单位,星等(数值越小越亮),以及属于矮星还是巨星
stars = pd.read_csv("stars.csv")
X = stars[["temp_kK", "magnitude"]]
y = stars["type"]

# 新恒星和 k
temp = float(input())
mag = float(input())
k = int(input())
new_star = pd.DataFrame({"temp_kK": [temp], "magnitude": [mag]})

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

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

监督学习中的所有课

自己练习: Python 在线编译器