Python实现K最近邻算法(K-Nearest Neighbors,KNN))算法

下面是一个包含 K最近邻(K-Nearest Neighbors, KNN) 算法实现的完整 Python 代码示例。该代码使用 scikit-learn 来加载数据集、训练 KNN 模型、进行预测、评估模型的表现,并进行简单的可视化。

1. 安装依赖

如果你还没有安装 scikit-learnmatplotlib,可以通过以下命令安装:

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. 代码解释

  1. 数据加载与切分:

    • 使用 load_iris() 加载鸢尾花数据集。X 为特征矩阵,y 为标签。
    • 使用 train_test_split() 将数据集切分为训练集(70%)和测试集(30%)。
  2. KNN 分类器:

    • 创建一个 KNN 分类器 KNeighborsClassifier,并设定 n_neighbors=3,即选择最近的 3 个邻居来做分类。
    • 使用 .fit() 方法在训练数据上训练模型。
    • 使用 .predict() 方法对测试集进行预测。
  3. 模型评估:

    • 使用 accuracy_score() 计算模型在测试集上的预测准确度并输出。
  4. 可视化:

    • 使用 主成分分析(PCA) 将数据降到 2D,以便进行可视化。PCA 选择前两个主成分作为新的特征。
    • 创建网格并计算每个点的分类标签,以绘制 KNN 的决策边界。
    • 使用 matplotlib 绘制决策边界,并根据类别为样本点着色。

4. 可视化效果

在图中,KNN 的决策边界会根据邻居的数量和距离来划分不同的区域,每个区域代表一个类别。样本点根据其真实的类别用不同颜色标识,帮助我们更直观地理解 KNN 如何进行分类。

5. 总结

这段代码实现了 KNN 算法的基本功能,包括数据加载、模型训练、预测、评估和可视化。KNN 是一个基于实例的学习方法,对于简单的分类任务非常有效,并且非常容易理解和实现。

你可以通过调整 n_neighbors 参数来尝试不同数量的邻居,以优化模型的表现。

下面是一个包含 K最近邻(K-Nearest Neighbors, KNN) 算法实现的完整 Python 代码示例。该代码使用 scikit-learn 来加载数据集、训练 KNN 模型、进行预测、评估模型的表现,并进行简单的可视化。

1. 安装依赖

如果你还没有安装 scikit-learnmatplotlib,可以通过以下命令安装:

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. 代码解释

  1. 数据加载与切分:

    • 使用 load_iris() 加载鸢尾花数据集。X 为特征矩阵,y 为标签。
    • 使用 train_test_split() 将数据集切分为训练集(70%)和测试集(30%)。
  2. KNN 分类器:

    • 创建一个 KNN 分类器 KNeighborsClassifier,并设定 n_neighbors=3,即选择最近的 3 个邻居来做分类。
    • 使用 .fit() 方法在训练数据上训练模型。
    • 使用 .predict() 方法对测试集进行预测。
  3. 模型评估:

    • 使用 accuracy_score() 计算模型在测试集上的预测准确度并输出。
  4. 可视化:

    • 使用 主成分分析(PCA) 将数据降到 2D,以便进行可视化。PCA 选择前两个主成分作为新的特征。
    • 创建网格并计算每个点的分类标签,以绘制 KNN 的决策边界。
    • 使用 matplotlib 绘制决策边界,并根据类别为样本点着色。

4. 可视化效果

在图中,KNN 的决策边界会根据邻居的数量和距离来划分不同的区域,每个区域代表一个类别。样本点根据其真实的类别用不同颜色标识,帮助我们更直观地理解 KNN 如何进行分类。

5. 总结

这段代码实现了 KNN 算法的基本功能,包括数据加载、模型训练、预测、评估和可视化。KNN 是一个基于实例的学习方法,对于简单的分类任务非常有效,并且非常容易理解和实现。

你可以通过调整 n_neighbors 参数来尝试不同数量的邻居,以优化模型的表现。

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在