← 返回题目列表

K-means 和 KNN 有什么区别?(经典易混)

高频 中等 第 7 / 25 题 更新于 2026/07/28
无监督学习K-meansKNN对比

简化版

两者只是名字里都有「K」和「近邻/距离」,本质完全不同。KNN(K 近邻)有监督分类/回归算法:预测时找待测样本最近的 K 个邻居,按邻居的标签投票/平均得出结果;它通常不拟合紧凑的参数模型(惰性学习,主要保留数据;fit 阶段仍可能建索引),K 是邻居数量K-means无监督聚类算法:把无标签数据分成 K 个簇,通过迭代求簇中心;它有训练过程(迭代优化簇中心),K 是簇的数量。抓主线:KNN 有监督、用邻居投票分类、K 是邻居数、预测成本后移;K-means 无监督、迭代聚类、K 是簇数、有训练。

详细版

核心区别对比:

维度KNNK-means
学习类型有监督(需标签)无监督(无标签)
任务分类 / 回归聚类
K 的含义邻居的个数簇的个数
是否训练无训练(惰性/懒惰学习)有训练(迭代求中心)
预测过程找 K 个最近邻,投票/平均分到最近的簇中心
输出类别/数值(有含义的标签)簇编号(无预设含义)
复杂度瓶颈预测时慢(要算到所有点距离)训练时迭代,预测快

唯一共同点: 都用距离度量、都对特征缩放敏感、名字都带 K。除此之外思路完全不同,别混淆。

完整版教学

一、为什么这两个总被搞混

K-means 和 KNN 经常被初学者混淆,原因很表面:名字都带「K」、都用「距离/近邻」的概念。但它们分属监督学习无监督学习两个世界,解决的问题、K 的含义、有没有训练全都不同。面试问这题,就是看你有没有真正理解,而不是被名字带偏。抓住三条区别就不会错:有无监督、K 指什么、有无训练。

二、KNN:有监督的「近朱者赤」

KNN(K-Nearest Neighbors,K 近邻)有监督算法,用于分类或回归,需要带标签的训练数据。它的思想是「物以类聚」——一个样本的类别,由它周围最近的邻居决定:

预测样本 x 的过程:
1. 计算 x 到训练集中所有样本的距离
2. 取距离最近的 K 个样本(K 个邻居)
3. 分类:K 个邻居里哪个类别最多,就判为哪类(多数投票)
   回归:取 K 个邻居标签的平均值

关键特征:

  • K 是「邻居的数量」:K=5 表示看最近的 5 个邻居。K 小易受噪声影响(过拟合),K 大边界过平滑(欠拟合)。
  • 没有训练过程——KNN 是惰性学习(lazy learning):训练阶段只是把数据存起来,不构建模型;所有计算都推迟到预测时(现算距离、找邻居)。
  • 预测慢:每预测一个样本都要算它到所有训练样本的距离,数据大时很慢(可用 KD 树、球树加速)。
  • 输出是有明确含义的标签(类别/数值)。

三、K-means:无监督的「分堆」

K-means无监督算法,用于聚类,处理没有标签的数据。它的目标是把数据自动分成 K 个簇:

训练过程(迭代):
1. 随机初始化 K 个簇中心
2. 重复:① 每个点分到最近的簇中心;② 中心更新为簇内均值
3. 收敛后得到 K 个簇中心
预测新样本:分到离它最近的簇中心所在的簇

关键特征:

  • K 是「簇的数量」:K=3 表示把数据分成 3 堆。
  • 有训练过程——通过迭代优化簇中心,学出一个模型(K 个中心)。
  • 预测快:训练好后,新样本只需算到 K 个中心的距离即可。
  • 输出是簇编号(0,1,2…),编号本身没有预设含义(哪个簇是「高价值用户」要事后人工解读)。

四、逐条对照,彻底分清

  • 有监督 vs 无监督:KNN 要标签(学「输入→标签」的映射);K-means 不要标签(学数据的内在分组)。这是最本质的区别。
  • K 的含义:KNN 的 K 是看几个邻居;K-means 的 K 是分成几个簇。同一个字母,含义完全不同。
  • 有无训练:KNN 无训练(存数据,预测时才算);K-means 有训练(迭代求中心)。
  • 预测机制:KNN 靠邻居投票;K-means 靠归到最近的簇中心
  • 输出:KNN 给有意义的标签;K-means 给无预设含义的簇号
  • 速度瓶颈:KNN 慢在预测(要和所有点比距离);K-means 慢在训练(迭代),预测很快。

五、它们唯一的共同点

  • 都用距离度量(默认欧氏距离)来衡量样本间相似性。
  • 都对特征缩放敏感——距离会被大尺度特征主导,用前都要标准化
  • 都有超参数 K 要调(但含义不同)。

除此之外,两者思路南辕北辙,别因为「都带 K、都讲距离」就混为一谈。

六、常见追问

  • 如何快速区分? KNN 有监督分类/回归、K 是邻居数、预测成本后移;K-means 无监督聚类、K 是簇数、有训练。
  • 哪个是惰性学习? KNN——训练时不建模型,预测时才计算。
  • 两个都要标准化吗? 都要,都基于距离。
  • KNN 的 K 和 K-means 的 K 怎么选? KNN 的 K 用交叉验证选(看分类效果);K-means 的 K 用肘部法/轮廓系数选(看聚类质量)。
  • K-means 能用来分类吗? 它本身是聚类;聚类后可给簇打标签间接辅助,但不是分类器。KNN 才是直接分类。

七、用同一组点分别跑一次 KNN 与 K-means

训练样本位置为 0,1,9,10,标签依次是 A,A,B,B。对新点 x=2KNN(K=3),最近三个标签为 A、A、B,多数投票得到 A;这里的 K=3 是邻居数,标签参与了预测。若对四个无标签位置做 K-means(K=2),合理中心会收敛到 0.59.5,这里的 K=2 是簇数。

阶段KNNK-means
fit保存数据,可选建近邻索引反复分配并更新中心
单次预测查 K 个近邻比较 K 个中心
学到的对象没有固定参数化边界K 个质心及簇编号
标签训练时必需聚类训练不使用
KNN:     有标签样本库 + 查询点 → 找邻居 → 投票/平均
K-means: 无标签点集 + 簇数 K  → 学中心 → 最近中心分簇

说 KNN“没有训练”是指它不拟合一组紧凑模型参数,不代表 fit 阶段一定零成本:标准化、KD-tree/ball-tree 或近似近邻索引仍需构建。高维时这些精确索引也可能退化为近似全扫描。

记忆钩子:KNN 的 K 服务于一次查询,K-means 的 K 定义整个数据集要形成几堆。

八、常见误区与追问

  • 误区:KNN 的 fit 永远是 O(1)。 保存数据、预处理和构建近邻索引都可能有明显成本。
  • 误区:两个算法都必须无条件做标准化。 只要距离受量纲支配就通常要缩放,但二值、领域加权等特征需按语义处理。
  • 追问:KNN 回归如何输出? 通常对邻居目标取平均或距离加权平均,而不是投票类别。
  • 追问:K-means 能直接输出业务类别吗? 簇编号无语义,需要画像和验证后才能映射业务标签。
  • 追问:高维下两者共同遇到什么问题? 距离集中导致近邻和最近中心区分度下降,常需选特征或降维。

九、加强记忆

K-means 和 KNN 只是名字都带 K、都用距离,本质完全不同。KNN有监督分类/回归,预测时找最近 K 个邻居投票/平均K = 邻居数无训练(惰性学习,存数据、预测时才算,故预测慢),输出有意义的标签K-means无监督聚类迭代求 K 个簇中心K = 簇数有训练,预测快,输出无预设含义的簇号。三条区别记牢:有无监督、K 指什么(邻居数 vs 簇数)、有无训练。唯一共同点:都用距离、都对特征缩放敏感、都要标准化。