Skip to content

第7章:K-近邻(KNN)

K-近邻(K-Nearest Neighbors,KNN)算法是一种基于实例的学习方法,它根据样本的特征值来预测类别。本章将详细介绍KNN的原理、应用场景以及如何使用Scikit-Learn实现KNN模型。

7.1 KNN原理

7.1.1 距离度量

KNN算法的核心在于距离度量,它通过计算样本之间的距离来确定最近的邻居。

7.1.2 K值的选择

K值的选择对KNN算法的性能有重要影响,较小的K值可能会使模型对噪声敏感,而较大的K值可能导致模型过于平滑。

7.1.3 权重和投票

在KNN中,可以根据邻居的距离赋予不同的权重,或者简单地进行多数投票来确定最终的分类结果。

7.2 KNN应用

7.2.1 分类问题

KNN可以用于分类问题,尤其是在数据集较小或特征空间不是线性可分时。

7.2.2 回归问题

KNN也可以用于回归问题,通过取最近邻样本的平均值来预测目标变量。

7.2.3 数据可视化

KNN常用于数据可视化,尤其是在低维空间中,可以直观地展示数据的分布情况。

7.3 KNN代码实现

7.3.1 数据准备

我们将使用Scikit-Learn的鸢尾花数据集来演示KNN的实现。

python
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载数据集
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.2, random_state=42)

7.3.2 模型训练

使用Scikit-Learn的KNeighborsClassifier类来训练KNN模型。

python
from sklearn.neighbors import KNeighborsClassifier

# 创建KNN分类器实例
knn_classifier = KNeighborsClassifier(n_neighbors=5)

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

7.3.3 模型评估

评估模型在测试集上的性能。

python
from sklearn.metrics import accuracy_score

# 在测试集上进行预测
y_pred = knn_classifier.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

7.3.4 可视化决策边界

由于KNN的决策边界较为复杂,通常不易于可视化。但在二维空间中,我们可以尝试展示。

python
import matplotlib.pyplot as plt
import numpy as np

# 创建网格来评估模型
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.arange(x_min, x_max, 0.02),
                     np.arange(y_min, y_max, 0.02))

# 预测整个网格的分类结果
Z = knn_classifier.predict(np.c_[xx.ravel(), yy.ravel()])

# 将结果放入颜色图中
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.4)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolor='k', s=20)
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.title("KNN Decision Boundary")
plt.show()

7.4 本章小结

本章介绍了K-近邻算法的基本原理、应用场景,并使用Scikit-Learn实现了一个简单的KNN模型。通过数据准备、模型训练、评估和可视化,我们可以看到KNN在分类问题中的有效性。理解KNN的工作原理和代码实现对于深入学习基于实例的学习方法至关重要。