答案页 · 12 道题

Python 最近邻分类器练习答案

本页汇总 Python 最近邻分类器 的 12 道练习。先做练习页,再回到这里核对准确答案和原因。

快速答案

本答案页包含 Python 最近邻分类器 的 4 道选择题、4 道填空题和 4 道输出预测题,每题都给出准确答案和简短解释。

答案已完整展示,建议先尝试作答,再用本页核对。第一次练习最好从互动练习页开始。

01 · 选择题

最近邻分类器如何预测?

  1. 对标签做哈希
  2. 训练神经网络很多轮
  3. 按字母排序
  4. 让最近的训练样本投票正确答案

答案: 让最近的训练样本投票

为什么: k-NN 查看最近的带标签点,并组合它们的标签。

02 · 选择题

为什么计算距离前要缩放特征?

  1. 大单位会主导距离正确答案
  2. 不再需要邻居
  3. 保证完全准确
  4. 缩放让标签按字母排列

答案: 大单位会主导距离

为什么: 以千为单位的特征会压倒个位数特征。

03 · 选择题

邻居标签平票时应该怎么办?

  1. 忽略目标点
  2. 把所有标签都当成正确
  3. 使用有文档的确定规则正确答案
  4. 每次随机选标签

答案: 使用有文档的确定规则

为什么: 例如选择距离最近的平票邻居,能让预测可复现。

04 · 选择题

运行结果是什么?

def distance(a, b):
    return sum((x - y) ** 2 for x, y in zip(a, b)) ** 0.5

points = [((1, 1), "a"), ((4, 4), "b"), ((1, 2), "a")]
target = (1, 1.5)
ranked = sorted(points, key=lambda item: distance(target, item[0]))
print([label for _, label in ranked])
  1. ['b']
  2. ['a', 'a', 'b']正确答案
  3. ['b', 'a', 'a']
  4. ['a', 'b']

答案: ['a', 'a', 'b']

为什么: 离目标最近的两个点标签为 a,较远的点为 b。

05 · 填空题

补全欧氏距离的指数。

def distance(a, b):
    return sum((x - y) ** 2 for x, y in zip(a, b)) ** ____

print(distance((1, 1), (4, 5)))

答案: 0.5

为什么: 把平方和取 0.5 次方就是开平方。

06 · 填空题

补全排序时使用的距离函数。

def distance(a, b):
    return sum((x - y) ** 2 for x, y in zip(a, b)) ** 0.5

points = [((1, 1), "a"), ((4, 4), "b")]
target = (1, 1.5)
ranked = sorted(points, key=lambda item: ____(target, item[0]))
print(ranked[0][1])

答案: distance

为什么: key 函数用目标点与每个训练点比较。

07 · 填空题

补全返回最常见标签的 Counter 方法。

from collections import Counter

labels = ["a", "a", "b"]
winner = Counter(labels).____(1)[0][0]
print(winner)

答案: most_common

为什么: most_common(1) 返回最常见标签及其计数组成的列表。

08 · 填空题

补全距离循环中的配对函数。

a = (1, 2)
b = (4, 6)
print(sum((x - y) ** 2 for x, y in ____(a, b)))

答案: zip

为什么: zip 生成两个点中对应位置的坐标。

09 · 输出预测

这段程序打印出什么?

def distance(a, b):
    return sum((x - y) ** 2 for x, y in zip(a, b)) ** 0.5

print(distance((1, 1), (4, 5)))

答案: 5.0

为什么: 坐标差为 3 和 4,所以距离是 5.0。

10 · 输出预测

代码的输出结果是什么?

def distance(a, b):
    return sum((x - y) ** 2 for x, y in zip(a, b)) ** 0.5

points = [((2, 2), "a"), ((5, 5), "b")]
target = (4.5, 4.5)
ranked = sorted(points, key=lambda item: distance(target, item[0]))
print(ranked[0][1])

答案: b

为什么: 点 (5, 5) 离目标更近,所以打印它的标签 b。

11 · 输出预测

屏幕上会显示什么?

from collections import Counter

labels = ["a", "a", "b"]
print(Counter(labels).most_common(1)[0][0])

答案: a

为什么: 标签 a 出现两次,因此赢得多数投票。

12 · 输出预测

这段代码会输出什么?

def distance(a, b):
    return sum((x - y) ** 2 for x, y in zip(a, b)) ** 0.5

print(round(distance((30, 30000), (31, 30000)), 1), round(distance((30, 30000), (30, 31000)), 1))

答案: 1.0 1000.0

为什么: 原始单位下的距离是 1.0 和 1000.0,说明为什么需要缩放。

先试一遍题目

打开 Python 最近邻分类器 练习页,用即时反馈回答同样的 12 道题。

练习本课