K近邻算法的原理与Sklearn实践

164 阅读4分钟

K近邻算法(K-Nearest Neighbor,简称K-NN)是一种广泛应用于分类与回归的基础算法。作为一种基于实例的学习方法,K-NN既没有显式的训练过程,也不依赖模型参数来概括数据的特征,而是直接依赖于训练数据进行预测。本文将详细阐述K-NN算法的基本原理,并通过Sklearn库实现该算法的实践。

一、K近邻算法的基本原理

K-NN算法的输入为实例的特征向量,每个向量可以看作特征空间中的一个点。对于分类问题,算法的输出是该实例所属的类别。K-NN的工作原理可以总结为以下几个步骤:

  1. 距离度量:在分类过程中,K-NN根据某种距离度量(如欧氏距离)计算待分类样本与训练集中所有样本之间的距离。
  2. 选择K个最近邻样本:根据计算出的距离,从训练集找到距离最近的K个邻居。
  3. 分类决策:通过对K个邻居的类别进行多数表决,选择出现次数最多的类别作为新样本的预测类别。

值得注意的是,K-NN算法在预测阶段才使用数据,并且直接利用训练数据,因此不具有显式的学习过程。换句话说,K-NN算法在训练阶段并不生成任何模型,它依赖于整个训练集的保存和查找。

二、K-NN的关键要素

K-NN的性能受以下三个关键要素的影响:

  1. K值的选择:K值即最近邻居的数量,直接影响分类结果。如果K值太小,算法对噪声数据点敏感;如果K值过大,算法容易引入过多无关的邻居点,影响分类精度。K值一般通过交叉验证等方法进行调优。
  2. 距离度量:常用的距离度量包括欧氏距离(Euclidean Distance)、曼哈顿距离(Manhattan Distance)等。不同的度量方式对分类结果有显著影响,通常应根据具体应用场景选择合适的度量方式。
  3. 分类决策规则:在K-NN中,最常用的分类规则是多数表决法,即选择K个近邻中出现频率最高的类别。对于加权K-NN算法,还可以考虑根据邻居距离的远近分配不同的权重,距离越近的邻居对决策的影响越大。

更详细实现原理如:特征空间划分和构建kd树构建可以在《统计学习方法第二版》中查看

image.png

三、K-NN的优缺点

优点:

  • 简单直观:K-NN是一种易于理解和实现的非参数算法,无需复杂的训练过程。
  • 无需假设数据分布:K-NN不需要对数据进行分布假设,适用于各种不同的数据分布情况。

缺点:

  • 计算代价高:由于每次分类都需要计算待分类样本与所有训练样本的距离,因此当训练集较大时,K-NN的计算代价会显著增加。
  • 对数据规模敏感:K-NN的性能对训练数据的大小和特征空间的维度敏感,尤其在高维数据下,距离度量可能变得不再有效,这种现象称为“维度灾难”。

四、Sklearn中的K-NN算法实践

Python中的Sklearn库为K-NN算法提供了便捷的实现工具。接下来,展示如何使用Sklearn实现K-NN分类。

python
# 引入必要的库
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

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 初始化KNN分类器,选择K=5
knn = KNeighborsClassifier(n_neighbors=5)

# 训练模型
knn.fit(X_train, y_train)

# 预测测试集
y_pred = knn.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型的分类准确率为: {accuracy:.2f}")

在上面的代码中,我们使用了鸢尾花数据集(Iris Dataset),并将其划分为训练集和测试集。我们选择了K=5,表示在分类时考虑5个最近邻居的类别。最后,通过accuracy_score计算模型的分类准确率。

五、总结

K近邻算法是机器学习领域中一种简单但强大的分类与回归方法。它依赖于训练数据,并在分类时通过距离度量和多数表决规则进行预测。尽管K-NN的实现和原理相对简单,但它在处理高维数据或大规模数据时的计算代价较高。通过Sklearn库,K-NN算法可以方便地应用于各种分类任务,并且通过选择合适的K值和距离度量,算法的性能可以进一步提升。