MCM520 ← 资料站首页 K 近邻 · 深度手册 打开交互阅读器 →

K 近邻 · 深度手册

分类:机器学习 | 难度:★☆☆ 入门 | 编号:knn

一、这是什么(一句话用途)

分类 / 回归、推荐冷启动、异常检测(无需训练,惰性学习)

二、核心思想

K 近邻(K-Nearest Neighbors)是最直观的"基于实例"的学习法:它根本不训练出显式模型,而是把训练集整个记住,预测时找离新样本最近的 K 个邻居,按它们的标签投票(分类)或取均值(回归)。它的哲学是"相似的样本有相似的结果"。优点是简单、对非线性边界适应好、天然多类;代价是预测慢(要遍历全样本)且对特征量纲和距离度量极敏感,必须标准化。K 的取值是核心超参:太小易过拟合噪声,太大易欠拟合。

三、数学原理与推导

给定距离度量(常用欧氏)d(x,xj)=∥x−xj∥2d(\mathbf{x},\mathbf{x}_j)=\lVert\mathbf{x}-\mathbf{x}_j\rVert_2。取最近的 KK 个邻居集合 NK(x)\mathcal{N}_K(\mathbf{x})。

分类(多数投票,可加权):

y^=arg⁡max⁡c ∑j∈NK(x)1(yj=c) wj,wj=1d(x,xj)+ε \hat{y}=\arg\max_c\ \sum_{j\in\mathcal{N}_K(\mathbf{x})}\mathbf{1}(y_j=c)\,w_j,\qquad w_j=\frac{1}{d(\mathbf{x},\mathbf{x}_j)+\varepsilon}

回归(均值,可加权):

y^=∑j∈NK(x)wj yj∑j∈NK(x)wj \hat{y}=\frac{\sum_{j\in\mathcal{N}_K(\mathbf{x})} w_j\,y_j}{\sum_{j\in\mathcal{N}_K(\mathbf{x})} w_j}

最佳 KK 由交叉验证在验证集上选,使误差最小。

四、建模 / 求解步骤

  1. 特征标准化
  2. 选距离度量(欧氏)
  3. 定 K(交叉验证)
  4. 找最近 K 个邻居
  5. 投票/平均出预测

五、关键公式速查

分类=邻居多数投票(可距离加权);回归=邻居均值

六、典型示例

二维平面上新点 → 找最近 5 点 → 多数类即预测类。

完整算例(数字演示,照着算一遍)

场景:2 维点,训练 6 个(类A○/类B●),测试点 (5,5),k=3。

最近 3 邻:(4,5)B, (5,4)B, (6,6)A → 2B1A → 判 B。

结论:KNN 无训练、靠距离投票,k 小易过拟合、k 大趋平滑。

七、Python 实现示例

import os, numpy as np
import pandas as pd
HERE = os.path.dirname(os.path.abspath(__file__))
df = pd.read_csv(os.path.join(HERE,"..","datasets","knn.csv"))
X = df[["x1","x2"]].to_numpy(dtype=float); y = df["label"].to_numpy(dtype=float)
X = (X-X.mean(0))/X.std(0)
k = 3; acc = 0
for i, xi in enumerate(X):
    d = np.linalg.norm(X-xi, axis=1); d[i] = 1e9
    nn = y[np.argsort(d)[:k]]
    acc += (np.bincount(nn.astype(int)).argmax() == y[i])
print("kNN(k=3) 分类准确率=%.3f" % (acc/len(y)))

配套文件:py_knn.py(需 numpy / pandas;与下方数据集配套练习)

八、MATLAB 实现示例

%% kNN 示例(MATLAB/Octave)
df = readtable('..\datasets\knn.csv');
X = table2array(df(:,1:2)); y = table2array(df(:,3));
X = (X-mean(X,1))./std(X,1); k=3; acc=0;
for i=1:height(X)
  d = sqrt(sum((X-X(i,:)).^2,2)); d(i)=1e9;
  [~,ord]=sort(d); nn=y(ord(1:k));
  pred=mode(nn); acc=acc+(pred==y(i));
end
fprintf('kNN(k=3) 分类准确率=%.3f\n', acc/height(X));

配套文件:m_knn.m(基础 MATLAB / Octave 即可运行)

九、练手数据集(可下载)

两维特征 + 二分类标签(两类有重叠)。用于 k 近邻分类,体会 k 与距离度量。

  • 字段:x1, x2, label
  • 行数:50 行
  • 下载:knn.csv

十、常见误区与避坑清单

  • 必须标准化(量纲敏感)
  • K 太小过拟合
  • 大样本预测慢

十一、结果怎么解读

看邻居标签分布即可解释。

十二、常与谁搭配

常与主成分分析降维配合提速;与 K-Means 同属'近邻'思想。

十三、论文写作技巧(怎么把它写进论文)

把 K 近邻 写进论文,核心不是堆公式,而是讲清「为什么用它、结果怎么呈现、如何对比」三件事。

1. 动机怎么写(为什么用它而不是别的)

开篇说明是数据驱动预测,给出特征工程与样本规模。对比传统统计模型,点出 K 近邻 能自动捕捉非线性 / 交互效应,但也要诚实说明需要调参与防过拟合。

2. 结果怎么写(图表与指标)

给学习曲线(样本量 vs 性能)、交叉验证平均 ± 标准差表、特征重要性排序图。多个模型横向对比误差。

3. 可直接套用的写作话术

  • 中文模板:针对<问题>,本文采用 K 近邻 进行分类 / 回归、推荐冷启动、异常检测(无需训练,惰性学习)。该方法能够自动刻画<优势>,在处理<场景>时相较<对比方法>更具<特点>。
  • 英文模板:To address , we adopt K 近邻 to 分类 / 回归、推荐冷启动、异常检测(无需训练,惰性学习). Benefiting from its ability to , it outperforms on .

4. 同类易踩的写作坑

必须做交叉验证而非单次划分;报告方差而不仅是均值;说明超参搜索范围,避免「炼丹」嫌疑。

5. 典型论文段落范例(可直接参考 / 改写)

下面是一段可直接套用的论文表述,已按本算法定制,填空处(…)替换成你的真实数值即可。

针对信贷违约预测,本文采用 K 近邻,经 5 折交叉验证平均 AUC=0.91±0.02,特征重要性显示收入稳定性与负债比为关键因子,模型在独立测试集上保持稳健。

For credit default prediction, we adopt K 近邻 and obtain AUC=0.91±0.02 under 5-fold cross-validation; feature importance highlights income stability and debt ratio as key drivers, with stable performance on a held-out test set.

十四、相关手册(延伸阅读)

十五、本手册导航


本手册由「算法深度手册生成器」自动产出,配套提供 Python / MATLAB 双版本示例与可下载练手数据集。