下面是一个包含 K最近邻(K-Nearest Neighbors, KNN) 算法实现的完整 Python 代码示例。该代码使用 scikit-learn
来加载数据集、训练 KNN 模型、进行预测、评估模型的表现,并进行简单的可视化。
1. 安装依赖
如果你还没有安装 scikit-learn
或 matplotlib
,可以通过以下命令安装:
pip install scikit-learn matplotlib
2. 完整代码示例
# 导入必要的库
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
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data # 特征数据
y = iris.target # 标签数据
# 切分数据集,70%训练,30%测试
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建KNN分类器(设定邻居数为3)
knn_clf = KNeighborsClassifier(n_neighbors=3)
# 训练KNN模型
knn_clf.fit(X_train, y_train)
# 在测试集上做预测
y_pred = knn_clf.predict(X_test)
# 打印预测准确度
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.4f}')
# 可视化KNN决策边界 (仅使用前两个特征进行可视化)
# 使用PCA将数据降到2D,以便于可视化
pca = PCA(n_components=2)
X_2d = pca.fit_transform(X)
# 切分降维后的数据
X_train_2d, X_test_2d, y_train, y_test = train_test_split(X_2d, y, test_size=0.3, random_state=42)
# 创建并训练KNN分类器
knn_clf_2d = KNeighborsClassifier(n_neighbors=3)
knn_clf_2d.fit(X_train_2d, y_train)
# 创建网格来绘制决策边界
import numpy as np
xx, yy = np.meshgrid(np.linspace(X_2d[:, 0].min(), X_2d[:, 0].max(), 100),
np.linspace(X_2d[:, 1].min(), X_2d[:, 1].max(), 100))
Z = knn_clf_2d.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# 绘制决策边界
plt.figure(figsize=(10, 8))
plt.contourf(xx, yy, Z, alpha=0.8)
plt.scatter(X_2d[:, 0], X_2d[:, 1], c=y, edgecolors='k', marker='o', cmap=plt.cm.Paired, s=60)
plt.title("KNN Decision Boundary (using first two PCA components)")
plt.xlabel("PCA Component 1")
plt.ylabel("PCA Component 2")
plt.colorbar()
plt.show()
3. 代码解释
数据加载与切分:
- 使用
load_iris()
加载鸢尾花数据集。X
为特征矩阵,y
为标签。 - 使用
train_test_split()
将数据集切分为训练集(70%)和测试集(30%)。
- 使用
KNN 分类器:
- 创建一个 KNN 分类器
KNeighborsClassifier
,并设定n_neighbors=3
,即选择最近的 3 个邻居来做分类。 - 使用
.fit()
方法在训练数据上训练模型。 - 使用
.predict()
方法对测试集进行预测。
- 创建一个 KNN 分类器
模型评估:
- 使用
accuracy_score()
计算模型在测试集上的预测准确度并输出。
- 使用
可视化:
- 使用 主成分分析(PCA) 将数据降到 2D,以便进行可视化。PCA 选择前两个主成分作为新的特征。
- 创建网格并计算每个点的分类标签,以绘制 KNN 的决策边界。
- 使用
matplotlib
绘制决策边界,并根据类别为样本点着色。
4. 可视化效果
在图中,KNN 的决策边界会根据邻居的数量和距离来划分不同的区域,每个区域代表一个类别。样本点根据其真实的类别用不同颜色标识,帮助我们更直观地理解 KNN 如何进行分类。
5. 总结
这段代码实现了 KNN 算法的基本功能,包括数据加载、模型训练、预测、评估和可视化。KNN 是一个基于实例的学习方法,对于简单的分类任务非常有效,并且非常容易理解和实现。
你可以通过调整 n_neighbors
参数来尝试不同数量的邻居,以优化模型的表现。