K 近邻算法(KNN)完整解析:原理 + 数学公式 + 实战
1️⃣ 什么是 KNN?
KNN(K-Nearest Neighbors,K 近邻算法)是一种经典的监督学习算法,可用于分类和回归。
核心思想:
对一个未知样本,找到训练集中距离它最近的 K 个邻居,通过“多数投票”或“加权平均”来预测类别或数值。
KNN 属于基于实例的学习(Instance-based Learning),也称为“懒惰学习”(Lazy Learning):
没有显式训练过程
预测时直接用整个训练集计算最近邻
2️⃣ 核心思想与流程
KNN 算法步骤:
给定参数
和距离度量方式
对未知样本
,计算它与训练集中所有样本的距离
找出距离最近的
个样本
分类任务:按多数类别投票
回归任务:按平均值或加权平均预测
3️⃣ 数学公式
3.1 距离度量
常用的欧式距离:
其他距离度量:
3.2 分类任务:投票规则
曼哈顿距离
闵可夫斯基距离
余弦相似度(适合文本向量)
:样本
是否属于类别
:权重,可设为
3.3 回归任务:加权平均
4️⃣ 超参数 K 的选择
K 太小:模型复杂度高,容易过拟合
K 太大:模型过于平滑,容易欠拟合
常用交叉验证选择最优 K 值。
一般经验:K = sqrt(n)(n 为样本数)是一个参考值。
5️⃣ 优缺点总结
✅ 优点
理论简单,易于理解
适用于多分类问题
无需显式训练,天然支持增量数据
❌ 缺点
计算量大,预测速度慢(需计算所有距离)
对特征尺度敏感,需要标准化/归一化
对噪声和离群点敏感
高维数据效果差(维度灾难)
6️⃣ Python 实现(sklearn)
分类任务
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score# 加载数据
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 构建 KNN 模型
knn = KNeighborsClassifier(n_neighbors=5, metric='minkowski')
knn.fit(X_train, y_train)# 预测与评估
y_pred = knn.predict(X_test)
print("测试集精度:", accuracy_score(y_test, y_pred))
回归任务
from sklearn.neighbors import KNeighborsRegressorknn_reg = KNeighborsRegressor(n_neighbors=5, weights='distance')
knn_reg.fit(X_train, y_train)
y_pred = knn_reg.predict(X_test)
7️⃣ 应用场景
基础分类任务(如 Iris 数据集)
图像识别(小规模数据)
推荐系统(基于相似度)
文本相似度搜索
📚 总结
KNN 是懒惰学习,核心是距离度量 + 投票/加权平均
适合小数据集,计算量可控时效果好
大规模数据需结合 KD 树、Ball 树或近似近邻算法(如 FAISS)优化
