别看KNN(K-Nearest Neighbors,K近邻)在机器学习里算是最“老资格”的算法之一,但它到现在依然活跃在各种实际场景中。就算你连“有监督学习”和“无监督学习”都分不清,也能在一小时内把KNN的原理弄明白,再用sklearn跑通一个完整案例。我最早接触机器学习时,就是靠KNN迈过了“只会看公式、不会落地”这道坎。这篇就把KNN从原理到手写实现,再到工程实战里的坑,一次性说清楚。适合刚入门机器学习的同学,也适合期末复习的学生党,或者准备面试时需要快速梳理算法的职场人。
1. 算法本质与核心问题拆解
1.1 一句话说清KNN在做什么
KNN解决的是“给定一个样本,判断它属于哪一类”的问题。它的思路朴素得有点不像机器学习:选择与待预测样本最相似的K个已知样本,让这K个邻居“投票表决”,票数最多的类别就是预测结果。
举例来说,你想知道小区门口那家新开的餐厅值不值得去,最简单粗暴的办法不是分析菜品的营养成分,而是问住得最近的10个邻居——如果有7个人说好吃,那大概率错不了。KNN就是干这件事的算法:它不学规律、不建模型,而是“用身边人的意见代替自己的判断”。
这也是KNN最特别的地方:它属于**惰性学习(Lazy Learning)**算法。训练阶段几乎不做事,只是把样本数据“存起来”,真正的计算全部发生在预测阶段。直白地说,KNN是所有机器学习算法里“训练成本最低、预测成本最高”的一个。
1.2 决定KNN结果的三个关键因素
KNN的预测结果完全由三个要素决定,任何一个选得不对,效果都会天差地别。
第一个是K值,也就是“问几个邻居”。K取得太小,模型容易受个别离群点干扰,导致过拟合;K取得太大,远处不相关的样本也被拉进来投票,模型变得过于“随大流”,欠拟合。比如K=1时,只要训练集里有一个错误标注的样本,预测结果就可能被带偏。
第二个是距离度量方式。怎么定义“相近”是KNN的核心。最常用的是欧氏距离,就是初中几何课上学过的“两点间直线距离”;也可以使用曼哈顿距离、余弦相似度等,具体选哪一种取决于数据特征和业务场景。这部分后面详细展开。
第三个是分类决策规则。K个邻居各自投完票后,怎么汇总出最终结果?最常见的是多数表决,还可以根据距离远近给邻居加权——距离越近的样本话语权越大,这对K值的选择失误能起到一定补偿作用。
1.3 为什么深度学习这么火的年代还要学KNN
很多人问我:“深度学习模型那么强大,谁还用KNN?”这个问题得分场景看。
KNN几乎不需要训练时间,不像神经网络那样要迭代几千轮更新参数。对于小规模数据集或需要快速上线的需求,KNN是性价比极高的选型。它的原理对用户完全透明——预测结果可以从“哪几个邻居投了什么票”来解释,这在医疗诊断、信用评估等需要解释性的场景中非常重要。
此外,KNN是理解机器学习的一把钥匙。学完KNN,你再去学决策树、SVM、朴素贝叶斯,会更容易理解“模型”到底是什么、超参数怎么调、数据预处理为什么那么重要。很多高校的机器学习课程都习惯把KNN放在第一章介绍,不是因为它最简单,而是因为它最能帮助建立直觉。期末复习时,把KNN吃透,其实顺带就把监督学习的核心框架掌握了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 距离度量:KNN的数学内核
2.1 欧氏距离与曼哈顿距离的适用差异
绝大多数KNN教学案例默认使用欧氏距离,因为它直观。在二维平面上,欧氏距离就是测量两点之间的直线长度。但实际数据并非永远适合用直线距离衡量。
欧氏距离的公式是:
[
d = \sqrt{\sum_{i=1}^{n}(x_i - y_i)^2}
]
n是特征维度,x_i和y_i分别代表两个样本在第i个特征上的取值。
曼哈顿距离则换了一种思路,它计算的是沿坐标轴方向走过的总路程,就像在棋盘上从一格走到另一格,只能横着或竖着走:
[
d = \sum_{i=1}^{n}|x_i - y_i|
]
什么时候用曼哈顿距离?当特征的意义是“步数”“成本”“耗时”这类本身就带有路径累加性质的指标时,曼哈顿距离更符合直觉。举个典型的例子:推荐系统中衡量两个用户的行为相似度,用户在几个品类下的消费次数,用曼哈顿距离往往比欧氏距离更稳,因为它对单个维度的异常差异没那么敏感。
2.2 余弦相似度与闵可夫斯基距离
文本分类、推荐系统等场景里,样本特征常常是词频向量或用户行为向量,向量的“长度”本身没有太多意义,重要的是方向是否一致。这时适合用余弦相似度衡量两个向量的夹角余弦值:
[
\cos\theta = \frac{A \cdot B}{||A|| \times ||B||}
]
余弦值越接近1,说明两个向量方向越一致,样本越相似。它能自动忽略向量长度的影响,比如两篇文章用词数量差异很大,但主题分布一致,余弦相似度依然会给出很高分。
闵可夫斯基距离是欧氏距离和曼哈顿距离的统一形式:
[
d = \left( \sum_{i=1}^{n}|x_i - y_i|^p \right)^{1/p}
]
当p=1时就是曼哈顿距离,p=2时就是欧氏距离。p越大,单个维度上的较大差异对距离的影响就越突出。实际应用中不必死记公式,理解规律就够:如果你希望模型对“单个指标急变”更敏感,取较大的p;更关注整体均衡,取较小的p。
