跳到主要内容

距离与邻居投票

K近邻(KNN)分类

不估计一棵树或一个超平面,只在标准化后的面积–单价空间里找到最近的 K 套房子,按邻居标签多数表决。

更新日期 2026-08-29 机器学习

这篇能回答什么

K 近邻分类回答的是:「这套房子在标准化后的定量空间里,最像已经标好档的哪几套,那几套的多数标签是什么」。它是惰性的:拟合阶段几乎只做标准化与存表,真正的计算发生在预测时——对每一个查询点算到其余点的欧氏距离,取出最近的 K 个,投票。没有基尼切点,没有间隔,没有有序目标均值。

适合:特征能当成坐标,例如面积(平米)、楼层、总楼层、建筑年份、单价(元/平米);标签是互斥档(教学结果记为 A/B/C 占用)。K 过小会跟着噪声邻居走,K 过大则把远处另一档的点也拉进投票,边界被抹平。城市、区域不是欧氏坐标,不要塞进来。

什么时候不该用

特征以城市、区域为主时,距离没有定义,应改CatBoost分类。需要一条最大间隔边界、并且能接受核映射时,用支持向量机(SVM)分类。要可打印的面积门槛,用树。没有标签、只想把点收成团,用K-Means 聚类分析——聚类的「K」是簇数,这里的 K 是邻居个数,不要混用。

如何选择方法

先问坐标是否成立。五列住房定量经 Z-score 后,远近有单位一的含义,KNN 说得通。若你真正想要的是「隔得最开的一条缝」,那是 SVM 的间隔;若想要「乱切很多棵树再投票」,那是 ExtraTrees。KNN 没有任何参数向量可写入方法节,只能写 K、距离和是否标准化。

  • K近邻(KNN)分类:≥2 个定量特征,K 为奇数邻居数;输出预测占用。

  • 支持向量机(SVM)分类:同样要标准化,但决策来自支持向量与核,不是数邻居。

  • 线性判别:假设各类协方差相近,估计判别轴,不是存下全部点。

  • K-Means:无标签;K 表示簇数,与邻居数无关。

输入、输出与限制

输入

特征必须是定量。目标为 1 个定类。K 是超参数,不是数据列。有效行数必须严格大于 K,否则每个点的邻居袋装不满。

  • 特征变量:最少 2 个,最多 30 个定量列。

  • 目标变量:正好 1 个定类,2–15 个水平。

  • 邻居数 K:奇数,范围 1–31,默认 5。

输出

占用表统计预测标签落入 A/B/C 的套数与占比。本例 C 86 套(41.15%)说明有更多查询点的五近邻里 C 占上风。产品不把五名邻居的房源ID列出来,也不输出逐点距离矩阵。图为占用柱。

产品限制

  • 拟合前对每一列做 Z-score;距离为标准化空间的欧氏距离。

  • 有效行至少 20 且 >K;超过 6000 行时,预测阶段对查询点分层抽样(种子 42)。

  • 定类列(城市、区域、装修情况)不能作为距离坐标,放入会被拒绝。

  • 房源ID、小区名称拒绝。

  • 没有训练损失曲线:惰性方法不迭代权重。

  • SPSS「最近邻分析」默认可能用不同的标准化或特征加权;不要用它的交叉验证错误率来对这张占用表。

案例

研究问题。 在不建立切点或超平面的前提下,用五列定量住房属性判断一套房子更像已标注的哪一档:只看标准化后最靠近的五套邻居如何投票。

有效样本 209,K=5。占用 A 59(28.23%)、B 64(30.62%)、C 86(41.15%)。C 邻域最密,但 A、B 仍各有五十多套,没有出现「几乎只剩一档」。下载评价表,只勾选面积、楼层、总楼层、建筑年份、单价,不要勾城市。

下载教学示例表(综合评价)

在 StatsX 中操作

  1. 步骤 1 · 载入评价表

    Sheet1。把房源ID留在表里没关系,指定角色时不要勾它。

  2. 步骤 2 · 只留能当坐标的列

    画像里面积与单价量纲差两个数量级,这正是必须标准化的理由;城市没有坐标,不要进特征。

  3. 步骤 3 · 搜索「K近邻」或「KNN」

    点分类而不是回归。K 保持 5,除非你有预先写进方案的奇数。

  4. 步骤 4 · 五列定量 + 三档目标

    特征:面积(平米)、楼层、总楼层、建筑年份、单价(元/平米)。目标:三档标签。运行。

  5. 步骤 5 · 对照占用与密度

    C 若明显高于另外两档,先想「C 标签是不是在单价–面积平面上成团」,而不是改写成准确率。

载入综合评价表做 KNN
评价教学表拖入上传区。
定量列画像供距离计算
确认五列是定量,城市保持定类且不进角色。
选择 K近邻分类
选定「K近邻(KNN)分类」。
为 KNN 指定定量特征与 K
五列定量进特征,K 默认 5,目标为三档标签。

如何阅读输出

占用不是混淆矩阵。209 套里 C 86 套只说明:对这 86 个查询点,五名最近邻居里 C 票最多。A 与 B 相差 5 套,在 K=5 的离散投票下属于正常抖动,不要写成「B 显著多于 A」。

K近邻(KNN)分类结果表
项目类别统计量取值
K近邻(KNN)分类类别 A频数59
K近邻(KNN)分类类别 B频数64
K近邻(KNN)分类类别 C频数86
K近邻(KNN)分类合计有效样本 N209
K近邻(KNN)分类类别 A占比(%)28.23
K近邻(KNN)分类类别 B占比(%)30.62
K近邻(KNN)分类类别 C占比(%)41.15

左右滑动可查看完整表格

教学示例表在 StatsX 工作台中的计算结果口径。

KNN 三类占用表
工作台频数应与 A 59、B 64、C 86 一致。
KNN 预测占用柱图
C 柱最高对应 41.15% 的邻域占用。

KNN(K=5,欧氏距离,Z-score 后)在 209 套上的预测占用为 A 59、B 64、C 86。C 占 41.15%,是三档里最密的邻域,但没有像某些树集成那样吞掉六成样本;占用反映的是「周围五套邻居里谁更多」,不是间隔,也不是有序类别统计。

建议顺序:确认已标准化 → 看 N 与 K 的关系(209 远大于 5,邻居袋是满的)→ 读三档占用是否极端 → 再决定要不要改 K。K 改成 1 时占用会更碎,改成 15 时会更像边际密度的平滑版。本页数字只对 K=5 有效。

理论与公式

对每个定量列做 x'=(x-\bar x)/s 后,查询点 x 与存表点 x_i 的距离为

把距离升序排列,取前 K 个下标构成邻域 N_K(x)。预测为邻域标签的多数票;平票时产品按类编号稳定打破(A < B < C),因此边界上的点会略偏向字母靠前的档,但本例 A 并未因此超过 B。

覆盖误差随维度上升:在固定 N 下,最近邻的距离趋于集中,投票失去局部性。这就是最多 30 个定量列的产品上限所针对的现象。占用 \hat n_c=\sum_m 1(\hat y_m=c) 只描述票箱结果,与经验风险不是同一张表。

注意事项

  • 未标准化时,单价(元/平米)会吞掉楼层,邻居变成「谁单价接近」的名单。

  • K 必须预先写进分析方案;看完占用再改 K 属于数据窥探。

  • 城市、装修情况没有欧氏含义,拒绝它们不是缺陷。

  • 预测阶段对大表抽样时,占用是抽样查询点上的占用,洞察会写明。

  • 惰性方法把全部有效行存下来,不能当「已经学到一条可部署的公式」。

  • 占用接近均衡也不证明分界清晰,边界上的点可以整袋邻居来自不同档。

常见问题

参考文献

  • Cover, T., Hart, P. Nearest neighbor pattern classification[J]. IEEE Transactions on Information Theory, 1967, 13(1): 21–27.

  • Hastie, T., Tibshirani, R., Friedman, J. The Elements of Statistical Learning[M]. Springer, 2009.

  • 周志华. 机器学习[M]. 北京: 清华大学出版社, 2016.