一、KNN 算法核心思想
K - 近邻算法(K Nearest Neighbor,简称 KNN)是一种简单且经典的监督学习算法,核心思想可以概括为:'近朱者赤,近墨者黑'。
KNN(K Nearest Neighbors)是一种惰性学习(lazy learning)算法,因为它不会对训练数据进行显式的学习或建模,只是把训练数据存储起来,直到测试阶段才进行计算,通过计算未知样本与训练集中所有样本的"距离",找出最相似的 K 个邻居,根据这些邻居的类别来决定未知样本的类别。
KNN 不仅适用于分类问题,也可用于回归问题,两者的处理流程相似但目标不同:
| 任务类型 | 核心目标 | 决策规则 | 适用场景举例 |
|---|---|---|---|
| 分类 | 预测离散的类别标签 | 统计 K 个近邻中占比最高的类别 | 鸢尾花分类、手写数字识别 |
| 回归 | 预测连续的数值结果 | 计算 K 个近邻目标值的算术平均值 | 房价预测、销量预测 |
核心问题:如何衡量'相似性'?
样本的相似性通过距离来衡量,距离越近则相似度越高,KNN 中最常用的是欧氏距离,后续会详细介绍多种距离度量方式。
二、K 值的选择:影响模型性能的关键
K 值是 KNN 算法中最重要的超参数,其选择直接影响模型效果:
- K 值过小:模型容易过拟合,对噪声数据敏感,泛化能力差;
- K 值过大:模型趋于'平均化',距离较远的样本也会影响预测结果,导致欠拟合;
- 经验选择:通常从 K=5 开始尝试,结合交叉验证选择最优值。
三、KNN 的两种应用场景 & SKlearn API
3.1 分类问题(核心:多数表决)
处理流程:
- 计算未知样本到每一个训练样本的距离;
- 将训练样本按距离升序排列;
- 选取距离最近的 K 个训练样本;
- 统计 K 个样本中各类别数量,进行多数表决;
- 未知样本归属到数量最多的类别。
SKlearn API:
from sklearn.neighbors import KNeighborsClassifier # 完整参数示例(含核心参数说明)
knn_clf = KNeighborsClassifier(
n_neighbors=5, # 核心:选取的邻居数量,默认 5
weights='uniform', # 权重方式:'uniform'(等权重)/'distance'(距离越近权重越高)
algorithm='auto', # 近邻搜索算法:'auto'/'ball_tree'/'kd_tree'/'brute'
p=2, # 闵可夫斯基距离的 p 值:p=1(曼哈顿)/p=2(欧式)/p→∞(切比雪夫)
metric='minkowski' # 距离度量方式:默认'minkowski',可指定'euclidean'/'manhattan'等
)










