K-近邻算法(K-Nearest Neighbors, KNN)原理详解
1. 引言
K-近邻算法(KNN)是一种基于实例的监督学习算法,用于分类和回归任务。其核心思想是:给定一个样本,通过计算其与训练集中所有样本的距离,找到距离最近的K个样本,根据这些邻居的标签或值来预测目标样本的标签或值。
2. 算法原理
2.1 基本概念
- 距离度量:常用的距离度量包括欧氏距离、曼哈顿距离、闵可夫斯基距离等。
- K值选择:K值决定了邻居的数量,通常通过交叉验证选择最优K值。
2.2 分类任务
对于分类任务,KNN通过多数投票法确定目标样本的类别:
y
^
=
mode
(
y
i
1
,
y
i
2
,
.
.
.
,
y
i
K
)
\hat{y} = \text{mode}(y_{i_1}, y_{i_2}, ..., y_{i_K})
y^=mode(yi1,yi2,...,yiK)
2.3 回归任务
对于回归任务,KNN通过邻居的平均值确定目标样本的值:
y
^
=
1
K
∑
j
=
1
K
y
i
j
\hat{y} = \frac{1}{K} \sum_{j=1}^K y_{i_j}
y^=K1j=1∑Kyij
3. 距离度量
3.1 欧氏距离
d ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 d(x, y) = \sqrt{\sum_{i=1}^n (x_i - y_i)^2} d(x,y)=i=1∑n(xi−yi)2
3.2 曼哈顿距离
d ( x , y ) = ∑ i = 1 n ∣ x i − y i ∣ d(x, y) = \sum_{i=1}^n |x_i - y_i| d(x,y)=i=1∑n∣xi−yi∣
3.3 闵可夫斯基距离
d ( x , y ) = ( ∑ i = 1 n ∣ x i − y i ∣ p ) 1 / p d(x, y) = \left( \sum_{i=1}^n |x_i - y_i|^p \right)^{1/p} d(x,y)=(i=1∑n∣xi−yi∣p)1/p
4. K值选择
4.1 小K值
- 优点:对局部特征敏感,能够捕捉细节。
- 缺点:容易受到噪声影响,可能导致过拟合。
4.2 大K值
- 优点:减少噪声影响,模型更稳定。
- 缺点:可能忽略局部特征,导致欠拟合。
4.3 交叉验证
通过交叉验证选择最优K值,平衡模型的偏差和方差。
5. 实现示例
5.1 Scikit-learn实现
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
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)
# 训练模型
model = KNeighborsClassifier(n_neighbors=3)
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 评估准确率
print("Accuracy:", accuracy_score(y_test, y_pred))
6. 算法评价
优点:
简单直观,易于理解和实现。
无需训练过程,适合在线学习。
对数据分布没有假设,适用于各种数据类型。
缺点:
计算复杂度高,尤其在大数据集上。
对高维数据表现不佳(维度灾难)。
需要选择合适的距离度量和K值。
8. 总结
K-近邻算法通过计算样本之间的距离,利用邻居的信息进行预测。尽管其计算复杂度较高,但在小数据集和低维数据上表现优异。通过选择合适的距离度量和K值,KNN能够有效解决分类和回归问题。