K-近邻算法,也常写作 KNN 或 k-NN,是机器学习里非常适合入门的一类算法。它的想法很朴素:要判断一个新样本属于哪一类,就看看它周围最像它的几个样本大多属于哪一类。
如果一句话解释 KNN,可以这样说:
近朱者赤,近墨者黑。
比如你刚搬到一个小区,不知道附近哪家早餐店更适合学生。你问了离你最近的 5 个邻居,里面 4 个人都推荐同一家店,那你大概率也会先相信这家店。KNN 做分类时,也是在做类似的事情:找邻居,看多数。
1. 先从一个小例子理解
假设我们要判断一个水果是苹果还是橙子。已知一些水果的特征,比如:
- 重量
- 颜色
- 甜度
- 表皮是否粗糙
现在来了一个新水果,我们还不知道它是什么。KNN 不会先总结一套复杂规则,而是直接去已知水果里找“最像它”的几个。
如果最像它的 5 个水果中,有 4 个是苹果,1 个是橙子,那么 KNN 就会判断:这个新水果更可能是苹果。
这里的 K,就是“要看几个邻居”。如果 K=5,就是看最近的 5 个样本。
2. 一个简单示意图
下面用一个二维小图来直观理解。假设 A 表示苹果,O 表示橙子,? 是我们想判断的新水果。
|
|
如果我们设 K=3,就看离 ? 最近的 3 个点。假设最近的 3 个邻居里有 2 个 A、1 个 O,那 KNN 就会把 ? 判断为 A,也就是苹果。
这就是 KNN 最核心的过程:找最近的 K 个邻居,然后投票。
3. KNN 的基本步骤
用不带公式的方式看,KNN 的分类流程大概是这样:
- 准备一批已经标好类别的数据
- 新来一个未知类别的样本
- 计算它和所有已知样本的相似程度
- 找出最相似的 K 个样本
- 看这 K 个样本里哪个类别最多
- 把新样本归到这个类别
这也是为什么 KNN 很容易理解。它不像一些模型那样需要先训练出一堆参数,KNN 更像是把训练数据先存起来,真正需要判断时再去查邻居。
这种特点也让 KNN 常被称为一种“惰性学习”方法。这里的“惰性”不是贬义,而是说它不会在训练阶段做太多计算,主要工作被推迟到了预测阶段。
4. 什么叫“最近”
KNN 里的“最近”,不一定只是地图上的距离。它通常表示“特征上更相似”。
比如判断水果时,两个水果如果重量接近、颜色接近、甜度接近,就可以认为距离更近。判断用户兴趣时,如果两个人看过的内容、点击习惯、购买记录很像,也可以认为他们更接近。
所以 KNN 的关键不是“空间位置”,而是你怎么描述一个样本。
常见特征可以是:
- 商品价格、重量、销量
- 用户年龄、浏览次数、购买频率
- 图片的颜色、纹理、形状
- 文本中某些词出现的情况
特征选得好不好,会直接影响 KNN 的效果。
5. K 值怎么选
K 不是固定答案,而是需要根据数据来选。
如果 K 太小,比如 K=1,模型会非常相信最近的那个样本。这有时很敏感:如果最近的样本刚好是噪声数据,判断就容易错。
如果 K 太大,模型又会看太多邻居,结果可能被远处不太相关的样本影响,分类边界会变得模糊。
可以把它理解成问人意见:
- 只问 1 个人:容易被个别意见带偏
- 问太多人:可能把不熟悉情况的人也算进来了
- 问附近几位最相关的人:通常更稳
在二分类问题里,很多时候会选奇数 K,比如 3、5、7,这样可以减少投票平局的情况。
6. KNN 不只可以做分类
KNN 最常见的用途是分类,比如判断:
- 邮件是不是垃圾邮件
- 图片里是猫还是狗
- 用户是否可能流失
- 一条评论是正面还是负面
但它也可以做回归。回归可以理解为预测一个数值。
比如我们想估计一套房子的价格,可以找出和它最相似的几套房子,然后参考这些房子的价格。不是投票选类别,而是把邻居的数值做一个综合估计。
简单说:
- 分类:邻居投票,选类别
- 回归:参考邻居数值,估结果
7. 加权 KNN:近一点的邻居更重要
普通 KNN 会让每个邻居的投票权差不多。但现实中,离得更近的邻居通常更可信。
比如有 5 个邻居,其中 1 个和新样本几乎一模一样,另外 4 个只是稍微有点像。完全平均投票可能不太合理。
所以有一种改进思路叫“加权 KNN”:越近的邻居,影响越大;越远的邻居,影响越小。
这很好理解。你买手机时,和你预算、用途、品牌偏好都很接近的人,他的建议往往比泛泛而谈的建议更有参考价值。
8. KNN 的优点
KNN 的优点非常适合初学者理解:
- 思路直观,容易解释
- 不需要复杂训练过程
- 可以用于分类,也可以用于回归
- 对一些边界不规则的问题比较灵活
- 新增数据时通常比较方便
如果你刚开始学机器学习,KNN 是一个很好的起点。它能帮助你理解“样本”“特征”“距离”“分类”“训练数据”这些基本概念。
9. KNN 的局限
KNN 也有明显短板。
第一,预测时可能比较慢。因为每来一个新样本,都要和很多已有样本比较。如果数据量很大,计算成本会升高。
第二,它很依赖特征尺度。比如一个特征是“收入”,动不动几千几万;另一个特征是“年龄”,通常几十。如果不做处理,收入这个特征可能会过度影响距离判断。
所以在使用 KNN 前,经常需要做数据标准化,让不同特征在比较时更公平。
第三,它容易受无关特征影响。如果你判断水果类别,却把“购买日期”这种无关信息也放进去,模型可能会被干扰。
第四,它对局部数据分布敏感。如果某一类样本特别多,投票时可能更容易压过其他类别。
10. 容易和 K-平均算法混淆
KNN 和 K-平均算法 名字里都有 K,但它们不是一回事。
KNN 是监督学习,通常使用已经标好类别的数据来判断新样本。
K-平均算法更常用于聚类,也就是在没有明确标签时,把数据自动分成几组。
可以简单记:
- KNN:看邻居,做分类或回归
- K-平均:找中心,把数据分组
11. 什么时候适合用 KNN
KNN 适合这些场景:
- 数据量不太大
- 特征比较容易表示成数值
- 样本之间的“相似程度”比较有意义
- 需要一个容易解释的基线方法
- 想快速验证一个分类思路是否可行
如果数据量巨大、特征非常多、预测速度要求很高,KNN 可能就不是最合适的选择,或者需要配合更高效的近邻搜索方法。
12. 初学者应该记住什么
学 KNN 时,不需要一开始就钻进复杂公式。先记住这几个直觉就够了:
- KNN 用“邻居”来判断新样本
K表示看几个最近邻居- 分类时靠投票,回归时参考邻居数值
- 特征选择和数据标准化很重要
K太小容易受噪声影响,太大又可能变得迟钝
KNN 的价值不只是它本身能解决一些问题,更在于它把机器学习里几个基础观念讲得很清楚:数据如何表示、相似度如何衡量、预测如何从已有样本中产生。
只要理解了“找相似样本,再根据邻居做判断”这件事,就已经抓住了 KNN 的核心。