K-近邻算法(KNN)详解
K-近邻算法(K-Nearest Neighbors, KNN)是一种非参数化、懒惰学习的监督学习算法,广泛应用于分类和回归任务。其核心思想非常直观:对于新样本,在训练集中找到距离最近的 K 个邻居,根据这些邻居的类别或数值来预测新样本的结果。
一、算法原理与数学表达
1. 距离度量
KNN 的关键在于如何定义'距离'。常用的距离度量包括:
闵可夫斯基距离(Minkowski Distance) $$d(x, y) = \left( \sum_{i=1}^n |x_i - y_i|^p \right)^{1/p}$$
曼哈顿距离(Manhattan Distance) $$d(x, y) = \sum_{i=1}^n |x_i - y_i|$$
欧氏距离(Euclidean Distance) $$d(x, y) = \sqrt{\sum_{i=1}^n (x_i - y_i)^2}$$
此外还有汉明距离、余弦距离等,适用于特定场景。
2. 分类与回归公式
对于新样本 $x$,KNN 的预测逻辑如下:
分类任务: $$\hat{y} = \operatorname{mode}{y_{(1)}, y_{(2)}, ..., y_{(K)}}$$ 其中 $y_{(i)}$ 为距离 $x$ 最近的第 $i$ 个训练样本的类别,采用多数投票原则。
回归任务: $$\hat{y} = \frac{1}{K} \sum_{i=1}^K y_{(i)}$$ 取 K 个邻居的真实数值的均值作为预测值。
二、算法详细流程
在实际工程中,我们可以将 KNN 的执行步骤梳理为以下几个环节:
- 数据准备:收集并整理训练集,包含特征和标签。注意 KNN 对特征尺度敏感,通常需要进行归一化或标准化处理。
- 选择距离度量:默认使用欧氏距离,也可根据数据特性选择曼哈顿距离等。
- 确定 K 值:K 是超参数,需通过交叉验证或肘部法则选择。K 太小易受噪声影响导致过拟合,K 太大则可能欠拟合。
- 预测新样本:计算新样本与所有训练样本的距离,选出最近的 K 个邻居,执行投票或求均值操作。
- 评估与调优:利用测试集评估模型表现,调整 K 值和距离度量方式以优化结果。
三、案例演示与代码实现
下面我们通过二维数据点分类的案例,完整展示从数据准备到决策边界可视化的过程。
1. 数据准备与可视化
import matplotlib.pyplot as plt
import numpy as np
# 训练数据
X_train = np.array([[1, 2], [2, 3], [3, 1], [6, 5], [7, 7], [8, 6]])
y_train = np.array([0, 0, , , , ])
plt.scatter(X_train[y_train == , ], X_train[y_train == , ], color=, label=)
plt.scatter(X_train[y_train == , ], X_train[y_train == , ], color=, label=)
plt.xlabel()
plt.ylabel()
plt.title()
plt.legend()
plt.show()







