K-最近邻算法 (KNN) —— 机器学习基础
K-最近邻算法(K-Nearest Neighbors, KNN)是一种简单而强大的监督学习算法,可用于分类和回归任务。它的核心思想是:相似的数据点往往具有相似的输出值。
1. KNN 的核心原理
KNN 是一种基于实例的学习(Instance-Based Learning),也称为惰性学习(Lazy Learning),因为它不会在训练阶段构建显式模型,而是在预测时直接计算输入样本与训练数据的相似度。
KNN 的工作步骤
-
选择 K 值:确定要考虑的最近邻数量(如 K=3, 5, 10)。
-
计算距离:使用距离度量(如欧氏距离、曼哈顿距离)计算新样本与所有训练样本的距离。
-
找出 K 个最近邻:选择距离最近的 K 个训练样本。
-
预测结果:
-
分类任务:采用多数投票法(哪个类别最多就预测哪个)。
-
回归任务:采用平均值(或加权平均)作为预测值。
-
2. KNN 的关键参数
参数 | 说明 |
---|---|
K 值 | 控制邻居数量,太小容易过拟合,太大可能欠拟合。 |
距离度量 | 常见的有: - 欧氏距离(Euclidean):√(Σ(x_i - y_i)²) - 曼哈顿距离(Manhattan):Σ|x_i - y_i| - 余弦相似度(Cosine):用于文本等高维数据 |
权重 | 是否让更近的邻居有更大的权重(如 加权KNN)。 |
3. KNN 的优缺点
✅ 优点
-
简单直观,易于理解和实现。
-
无需训练阶段,适合动态数据。
-
适用于多分类问题。
-
对数据分布没有假设(非参数方法)。
❌ 缺点
-
计算复杂度高(需要存储所有训练数据,预测时计算量大)。
-
对噪声和异常值敏感。
-
需要特征缩放(如使用欧氏距离,不同量纲会影响结果)。
-
高维数据表现差(“维度灾难”问题)。
4. KNN 的代码示例(Python)
使用 scikit-learn
实现 KNN:
分类任务
from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split# 加载数据 iris = load_iris() X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2)# 训练 KNN knn = KNeighborsClassifier(n_neighbors=3) knn.fit(X_train, y_train)# 预测 y_pred = knn.predict(X_test) print("Accuracy:", knn.score(X_test, y_test))
回归任务
from sklearn.neighbors import KNeighborsRegressor from sklearn.datasets import load_diabetes# 加载数据 diabetes = load_diabetes() X_train, X_test, y_train, y_test = train_test_split(diabetes.data, diabetes.target, test_size=0.2)# 训练 KNN 回归 knn_reg = KNeighborsRegressor(n_neighbors=5) knn_reg.fit(X_train, y_train)# 预测 y_pred = knn_reg.predict(X_test) print("R2 Score:", knn_reg.score(X_test, y_test))
5. KNN 的优化方法
-
调整 K 值(使用交叉验证选择最佳 K)。
-
数据标准化(如
StandardScaler
或MinMaxScaler
)。 -
降维处理(如 PCA 减少特征维度)。
-
使用近似算法(如 KD-Tree、Ball-Tree 加速搜索)。
6. 总结
-
KNN 是一种简单但强大的算法,适用于小规模数据集。
-
它的性能依赖于 K 值的选择、距离度量和数据预处理。
-
适用于分类和回归,但在大数据集和高维数据上效率较低。