K 近邻 · 深度手册
分类:机器学习 | 难度:★☆☆ 入门 | 编号:
knn
一、这是什么(一句话用途)
分类 / 回归、推荐冷启动、异常检测(无需训练,惰性学习)
二、核心思想
K 近邻(K-Nearest Neighbors)是最直观的"基于实例"的学习法:它根本不训练出显式模型,而是把训练集整个记住,预测时找离新样本最近的 K 个邻居,按它们的标签投票(分类)或取均值(回归)。它的哲学是"相似的样本有相似的结果"。优点是简单、对非线性边界适应好、天然多类;代价是预测慢(要遍历全样本)且对特征量纲和距离度量极敏感,必须标准化。K 的取值是核心超参:太小易过拟合噪声,太大易欠拟合。
三、数学原理与推导
给定距离度量(常用欧氏)。取最近的 个邻居集合 。
分类(多数投票,可加权):
回归(均值,可加权):
最佳 由交叉验证在验证集上选,使误差最小。
四、建模 / 求解步骤
- 特征标准化
- 选距离度量(欧氏)
- 定 K(交叉验证)
- 找最近 K 个邻居
- 投票/平均出预测
五、关键公式速查
分类=邻居多数投票(可距离加权);回归=邻居均值
六、典型示例
二维平面上新点 → 找最近 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.
十四、相关手册(延伸阅读)
- 主成分分析(评价 / 降维) · 评价类
- K-Means 聚类 · 聚类分类
十五、本手册导航
本手册由「算法深度手册生成器」自动产出,配套提供 Python / MATLAB 双版本示例与可下载练手数据集。