K 近邻
保存训练样本,预测时按标准化后的距离寻找 K 个邻居并投票或平均。
学习前需要掌握
背景与问题
如果附近样本倾向有相似标签,可以不拟合显式全局边界,而在预测时查询相近的训练样本。KNN 把建模假设集中到了距离与邻域定义上。
概念定义
K 近邻保存训练样本,在新样本处寻找 K 个最近邻,再按类别投票或对目标取平均。它是基于实例的非参数方法,非参数不代表没有 K 等超参数。
直观理解
想判断新房屋价格,先参考若干相近房屋;什么算相近、参考多少套,往往比投票公式更关键。
核心原理
欧氏距离会被大尺度特征主导,连续特征通常在训练内缩放。类别编号直接相减没有合理距离语义,稀疏文本也可能更适合余弦等度量。距离选择需要反映任务,而非只满足 API。
K 小时更追随局部结构和噪声,K 大时更平滑并偏向总体多数类。距离加权让更近邻居贡献更大,但遇到重复点、极小距离或标签冲突时仍需明确实现约定。
fit 主要保存数据,预测成本依赖样本数、维数和搜索结构,高维时近远距离可能难区分。KNN 不会天然外推远离训练区域的新规律,应检查分布外距离,并在交叉验证中选 K、特征与权重。
扩大邻域使少数局部类别被覆盖
- 训练位置为 0、2、3、10、11
- 标签为 0、1、1、0、0;查询点为 2.2
K=1、3、5 的预测依次为 1、1、0;全邻居距离加权则可保留局部类别 1。
这个例子中,查询点距位置 2 仅 0.2,距 10 和 11 很远。K=5 等权投票把所有邻居看成同等证据,失去了局部性。
不能因此断言距离加权永远更好;若最近点恰是噪声,它可能加重错误。真实 K 应在独立验证协议中选择,而不是挑本例最合意结果。
数学表达
核心表达
这是等权分类投票;距离加权和回归平均需要相应修改聚合规则。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1定义合理特征和距离,在训练折拟合必要缩放。
- 2对 K 和权重做交叉验证,评估各类错误。
- 3同时测量预测成本与远离训练区的行为。
代码对应位置
示例 1扩大邻域使少数局部类别被覆盖的最小验证:使用完整构造输入核对扩大邻域使少数局部类别被覆盖,输出只表示本例计算。
计算与实现步骤
- 定义合理特征和距离,在训练折拟合必要缩放。
- 对 K 和权重做交叉验证,评估各类错误。
- 同时测量预测成本与远离训练区的行为。
代码实现
示例 1
扩大邻域使少数局部类别被覆盖的最小验证
example_01.py用途:使用完整构造输入核对扩大邻域使少数局部类别被覆盖,输出只表示本例计算。
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
x = np.array([[0.], [2.], [3.], [10.], [11.]])
y = np.array([0, 1, 1, 0, 0])
for k in [1, 3, 5]:
model = KNeighborsClassifier(n_neighbors=k).fit(x, y)
print(f"K={k} uniform={model.predict([[2.2]])[0]}")
weighted = KNeighborsClassifier(n_neighbors=5, weights="distance").fit(x, y)
print("K=5 distance:", int(weighted.predict([[2.2]])[0]))代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对扩大邻域使少数局部类别被覆盖,输出只表示本例计算。
y- 目标标签或连续目标值。
model- 组合预处理和估计器的模型对象。
Step 1 · 1–9 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
x = np.array([[0.], [2.], [3.], [10.], [11.]])
y = np.array([0, 1, 1, 0, 0])
for k in [1, 3, 5]:
model = KNeighborsClassifier(n_neighbors=k).fit(x, y)
print(f"K={k} uniform={model.predict([[2.2]])[0]}")
weighted = KNeighborsClassifier(n_neighbors=5, weights="distance").fit(x, y)
print("K=5 distance:", int(weighted.predict([[2.2]])[0]))预期输出或运行结果
K=1 uniform=1 K=3 uniform=1 K=5 uniform=0 K=5 distance: 1
常见错误 · 3 条
- 未标准化
- K 用测试集选择
- 无关高维特征
实际应用
- 局部模式基线
- 检查距离表示是否具有任务意义
常见错误
- 未标准化
- K 用测试集选择
- 无关高维特征
推荐学习资料
参考库不会生成虚假资源或无效外部链接。