K 近邻(KNN,K-Nearest Neighbors)是简单直观的监督学习算法,既可以用于分类,也可以用于回归。它没有训练过程,属于惰性学习(Lazy Learning)。

1. 基本原理
核心思想:物以类聚。
对于一个新样本,在训练集中找到距离它最近的 K 个样本,根据这 K 个邻居的结果来预测:
- KNN 分类:投票,少数服从多数,出现最多的类别作为预测结果
- KNN 回归:取 K 个邻居标签的平均值作为预测值
距离计算常用欧氏距离:
还有曼哈顿距离、闵可夫斯基距离等。
2. 参数 K 的影响
- K 太小:容易受噪声、异常点影响,容易过拟合
- K 太大:远距离样本也参与投票,容易欠拟合,边界模糊
一般使用交叉验证选择合适的 K 值。
3. 重要注意点
KNN 对特征量纲很敏感,数值范围大的特征会主导距离计算。
✅ 必须做特征标准化 / 归一化。
4. 优缺点
✅ 优点
- 原理简单、容易理解,实现门槛低
- 无训练阶段,新增样本直接加入数据集,增量友好
- 适合多分类任务
❌ 缺点
- 预测速度慢:每一次预测都要和全部训练样本计算距离
- 高维数据效果差(维度灾难)
- 对不平衡数据、噪声、异常值敏感
- 内存开销大,需要保存全部训练数据
5. Python 代码示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler
# 字体配置,解决 DejaVu Sans 中文缺失警告
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
# 生成数据集
np.random.seed(42)
X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, random_state=42)
# 划分训练集、测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# KNN 必须标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 构建KNN模型,K=5
model = KNeighborsClassifier(n_neighbors=5)
model.fit(X_train, y_train)
# 预测评估
y_pred = model.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f"测试集准确率:{acc:.2f}")
# 绘制决策边界
def plot_decision_boundary(clf, X, y):
x_min, x_max = X[:,0].min()-1, X[:,0].max()+1
y_min, y_max = X[:,1].min()-1, X[:,1].max()+1
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.3, cmap='coolwarm')
plt.scatter(X[:,0], X[:,1], c=y, cmap='coolwarm')
plt.xlabel("x1")
plt.ylabel("x2")
plot_decision_boundary(model, X_train, y_train)
plt.title("KNN 决策边界")
plt.show()
运行结果:

6. 适用场景
- 小数据集、低维特征
- 简单图像识别、推荐系统简单相似度匹配
- 作为基准模型,用来对比其他复杂算法效果
7. 常见误区
- KNN 不需要预处理:不做标准化,距离计算会失效
- K 越大效果越好:K 过大容易抹平局部特征,发生欠拟合
- 训练耗时很长:KNN 训练只是保存数据,耗时在预测阶段
思考题
- 为什么 KNN 属于惰性学习算法?
- 如果样本类别不平衡,直接投票会有什么问题,可以怎么改进?
0 条笔记