← 返回目录

Chapter 08: k最近邻分类

小范围投票,少数服从多数

k-nearest neighbors algorithm

📖 本章概要

本章介绍k最近邻(k-NN)分类算法,这是最简单直观的监督学习方法之一。 核心思想:"近朱者赤,近墨者黑",小范围投票,少数服从多数。

优点:简单易懂、无需训练、非线性分类效果好
缺点:需存储全部训练数据、预测慢、高维易受维数灾难影响

8.1

k近邻分类原理

近朱者赤,近墨者黑

k-NN算法流程:① 计算距离 →② 找k个最近邻 →③ 投票决定分类

💡 8.1节小结

• 核心思想:查询点的类别由其k个最近邻的多数类别决定
• 距离度量:默认使用欧氏距离
• 投票机制:等权重投票(每个邻居一票)或加权投票
• 非参数模型:不学习解析函数,存储全部训练数据
✦
8.2

二分类:非红,即蓝

Binary Classification

二分类问题(K=2):查询点的分类只有两种可能——C₁(红色●)或C₂(蓝色●)。 通过指示函数I统计k个邻居中各类别的票数,多数票胜出。

💡 8.2节小结

• 二分类公式:ŷ(q) = max{Σ I(y⁽ⁱ⁾=C₁), Σ I(y⁽ⁱ⁾=C₂)}
• 指示函数:I(y⁽ⁱ⁾=Cₖ)表示"一人一票",属于Cₖ则为1,否则为0
• 投票规则:统计k个邻居中各类别票数,多数票胜出
• 近邻范围:k值决定投票"社区"的大小
✦
8.3

三分类:非红,要么蓝,要么灰

鸢尾花分类问题(K=3)

鸢尾花数据集是经典的三分类问题(K=3):Setosa(C₁)、Versicolor(C₂)、Virginica(C₃)。 使用花萼长度(x₁)和花萼宽度(x₂)两个特征,k-NN算法给出非线性决策边界。

💡 8.3节小结

• 决策边界:k-NN的决策边界不规则,非线性可分
• 鸢尾花分类:使用花萼长度和宽度两个特征(D=2)
• 非参数模型:决策边界无法用简单函数描述
• 泛化能力:依赖训练数据质量,需注意过拟合问题
• sklearn函数:KNeighborsClassifier(k_neighbors, weights='uniform')
✦
8.4

近邻数量k影响投票结果

k值选择对分类的影响

近邻数量k为用户输入值,k值直接影响查询点分类结果。 当k=4时,查询点可能被分类为C₁;但k增大到8、12、16时,分类结果可能发生变化。

k值对决策边界的影响

💡 8.4节小结

• k值影响:k小时精确捕捉局部模式,但易受噪声影响
• k值增大:决策边界趋于平滑,抑制噪声,但可能欠拟合
• k极端值:k=n时,查询点无论在哪,预测结果都相同(过度简化)
• 选择建议:通过交叉验证选择合适的k值
✦
8.5

投票权重:越近,影响力越高

加权投票机制

前文采用"等权重"投票方式,每个邻居一人一票。 但很多情况下,加权投票更有效:距离查询点越近的邻居,投票权重越高。

💡 8.5节小结

• 加权公式:ŷ(q) = arg max Σ wᵢ · I(y⁽ⁱ⁾=Cₖ)
• 归一化权重:wᵢ = (max(d_NN) - dᵢ) / (max(d_NN) - min(d_NN))
• 距离倒数:也可用 wᵢ = 1/dᵢ²(衰减更快)
• sklearn参数:weights='distance'(距离成反比)
• 优势:符合直觉,距离近的邻居影响更大
✦
8.6

最近质心分类:分类边界为中垂线

Nearest Centroid Classifier (NCC)

最近质心分类器(NCC)思路类似k-NN,但不需要设定k值。 先计算各类别样本数据的质心位置μₘ,查询点距离哪个质心越近,就被划定为该类别。

图解原理:Voronoi图(沃罗诺伊图)
鸢尾花分类决策边界

💡 8.6节小结

• 质心计算:μₖ = (1/count(Cₖ)) Σ x⁽ⁱ⁾,i ∈ Cₖ
• 决策规则:查询点属于距离最近的质心类别
• 决策边界:任意两个质心的中垂线(Voronoi diagram)
• 中垂线性质:线上任意点到两质心距离相等
• 收缩阈值:质心向总体质心μₓ靠拢,边界形状改变
• sklearn函数:NearestCentroid(shrink_threshold=None)
✦
8.7

k-NN回归:非参数回归

从分类到回归的自然扩展

前文的k-NN分类算法针对离散标签,比如C₁(红色●)和C₂(蓝色●),当输出值为连续数值时, 就变成了k-NN回归问题。此时,查询点q的预测值ŷ可以通过对k个最近邻输出值求平均得到。

公式推导:从分类到回归
一维回归可视化
鸢尾花数据集回归:花萼长度→宽度

💡 8.7节小结

• 等权回归公式:ŷ(q) = (1/k) Σ y⁽ⁱ⁾,i ∈ kNN(q)
• 加权回归公式:ŷ(q) = (Σ wᵢ·y⁽ⁱ⁾) / (Σ wᵢ),i ∈ kNN(q)
• 等权平均:每个邻居输出值权重相等
• 距离加权:近邻贡献大,远邻贡献小
• sklearn函数:KNeighborsRegressor(n_neighbors=k, weights='uniform'/'distance')
• 应用场景:房价预测、温度预测等连续值预测任务

📋k-NN核心要点

🎯 核心优势
简单直观:易理解易实现
无需训练:直接使用数据
非线性:处理复杂边界
灵活:分类+回归
⚠️ 关键缺点
存储开销:需保存全部训练数据
预测慢:需计算到所有样本距离
维数灾难:高维空间距离失效
k值敏感:需调参