机器学习基础算法 (六)-k 最近邻算法(k-Nearest Neighbors, k-NN)

目录

  1. k 最近邻算法原理
  2. Python 实现 k 最近邻算法
  3. 模型评估与调优
  4. 总结

在机器学习领域中,k 最近邻(k-Nearest Neighbors, k-NN)算法以其简单、直观且易于理解的特点,广泛应用于分类和回归任务。尽管它在处理大规模数据时可能遇到效率瓶颈,但凭借其无参数、懒惰学习(Lazy Learning)等特性,仍然是许多实际应用中不可或缺的工具。

本文将深入探讨 k-NN 的原理、Python 实现、模型评估以及调优,最终通过具体的案例展示如何在实际项目中应用该算法。

一、k 最近邻算法原理

k-NN 是一种基于实例的学习算法,这意味着模型在训练过程中并不进行显式的学习,而是直接记住训练数据中的所有实例,并在预测时通过计算新样本与训练样本之间的距离来做出判断。

1.1 算法步骤

k-NN 的工作原理可以总结为以下几个步骤:

  1. 选择距离度量:常见的距离度量方法有欧几里得距离、曼哈顿距离、余弦相似度等。最常用的是欧几里得距离。
  2. 选择 k 值:选择一个正整数 k,表示从训练数据集中选取 k 个与测试点距离最小的样本。
  3. 投票/加权投票:对于分类任务,k 个邻居会投票选出最多的类别;对于回归任务,则取 k 个邻居的均值或加权均值作为预测值。

1.2 距离度量公式

在这里插入图片描述

此外,还可以使用其他类型的距离度量方法,如曼哈顿距离、切比雪夫距离等。

1.3 优缺点分析

优点

  • 简单直观:k-NN 算法没有训练过程,非常直观,易于理解。
  • 无需假设数据分布:与线性回归或逻辑回归等方法不同,k-NN 不需要对数据分布作任何假设,适用于多种数据类型。
  • 适应性强:在高维空间中,k-NN 仍能较好地处理复杂的分类问题。

缺点

  • 计算复杂度高:由于在预测时需要计算与所有训练样本的距离,因此在处理大数据集时效率较低。
  • 维度灾难:在高维数据中,欧几里得距离的效果可能会退化,导致 k-NN 的性能下降。
  • 需要选择合适的 k 值:k 值的选择对模型的效果有很大影响。如果 k 值过小,模型可能对噪声过于敏感;如果 k 值过大,模型可能会变得过于简单。

二、Python 实现 k 最近邻算法

在 Python 中,常用的机器学习库 scikit-learn 提供了非常方便的 k-NN 实现,下面我们将通过一个简单的示例展示如何使用 k-NN 进行分类任务。

2.1 安装必要的库

在开始实现之前,确保安装了 scikit-learnmatplotlib 等必要的库:

pip install scikit-learn matplotlib

2.2 导入数据与库

我们使用 scikit-learn 提供的鸢尾花数据集(Iris Dataset)进行分类任务,该数据集包含了 150 条样本,每个样本有 4 个特征(如花瓣长度、花萼宽度等),目标是根据这些特征预测鸢尾花的种类。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score

2.3 加载并探索数据

我们使用 load_iris() 加载数据集,查看其基本信息。

# 加载数据
iris = load_iris()
X = iris.data
y = iris.target

# 查看数据集的基本信息
print("数据特征名称:", iris.feature_names)
print("数据集大小:", X.shape)
print("目标类别名称:", iris.target_names)

2.4 数据划分与模型训练

接下来,将数据集划分为训练集和测试集,并使用 k-NN 进行训练。

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

# 创建 k-NN 分类器
k = 3  # 选择 k = 3
knn = KNeighborsClassifier(n_neighbors=k)

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

2.5 预测与评估

使用测试集对模型进行预测,并评估其准确度。

# 进行预测
y_pred = knn.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print("预测准确度:", accuracy)

2.6 可视化结果

我们可以通过散点图对数据进行可视化,以便更直观地理解模型的预测效果。

# 选择前两个特征进行可视化
X_train_2d = X_train[:, :2]
X_test_2d = X_test[:, :2]

# 创建 k-NN 分类器并进行训练
knn.fit(X_train_2d, y_train)

# 预测测试集
y_pred_2d = knn.predict(X_test_2d)

# 绘制散点图
plt.scatter(X_test_2d[:, 0], X_test_2d[:, 1], c=y_pred_2d, cmap='viridis', marker='o')
plt.xlabel('花萼长度')
plt.ylabel('花萼宽度')
plt.title(f'k-NN (k={k}) 分类结果')
plt.show()

2.7 完整代码示例

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
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.2, random_state=42)

# 创建 k-NN 分类器
k = 3
knn = KNeighborsClassifier(n_neighbors=k)

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

# 预测并评估模型
y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"预测准确度: {accuracy:.2f}")

# 可视化结果(前两个特征)
X_train_2d = X_train[:, :2]
X_test_2d = X_test[:, :2]

knn.fit(X_train_2d, y_train)
y_pred_2d = knn.predict(X_test_2d)

plt.scatter(X_test_2d[:, 0], X_test_2d[:, 1], c=y_pred_2d, cmap='viridis', marker='o')
plt.xlabel('花萼长度')
plt.ylabel('花萼宽度')
plt.title(f'k-NN (k={k}) 分类结果')
plt.show()

三、模型评估与调优

3.1 评估指标

k-NN 的评估指标主要有:

  • 准确率(Accuracy):预测正确的样本占总样本的比例。
  • 混淆矩阵(Confusion Matrix):用于查看分类模型的预测结果如何映射到真实标签。
  • 精确率、召回率与 F1 分数:适用于不平衡类别问题。

3.2 调优 k 值

选择合适的 k 值是 k-NN 性能的关键。一般来说,较小的 k 值可能导致模型过拟合,而较大的 k 值则可能导致欠拟合。常用的方法是通过交叉验证来选择最优的 k 值。

from sklearn.model_selection import cross_val_score

k_range = range(1, 21)
k_scores = []

for k in k_range:
    knn = KNeighborsClassifier(n_neighbors=k)
    scores = cross_val_score(knn, X, y, cv=5, scoring='accuracy')
    k_scores.append(scores.mean())

# 绘制

 k 值与准确率的关系图
plt.plot(k_range, k_scores)
plt.xlabel('k值')
plt.ylabel('准确率')
plt.title('k值与模型准确率的关系')
plt.show()

3.3 其他调优方法

  • 特征选择与降维:通过特征选择(如主成分分析 PCA)减少冗余特征,改善模型效率。
  • 加权投票:可以采用加权投票策略,使得距离较近的邻居对分类结果的贡献更大。

四、总结

k-最近邻算法因其简单易懂、无需假设数据分布等优点,成为分类与回归任务中的经典算法之一。尽管其计算复杂度较高,但通过选择合适的 k 值和优化模型参数,可以在许多实际问题中获得良好的性能。

希望本文的介绍能够帮助你更好地理解 k-NN 算法,并且能够在实际项目中应用它。如果你对机器学习和人工智能有兴趣,接下来的学习之旅中,你将会遇到更多值得探索的技术与方法。

点击进入:AI基础

点击进入:机器学习基础算法 (一)-线性回归
点击进入:机器学习基础算法 (二)-逻辑回归
点击进入:机器学习基础算法 (三)-支持向量机(SVM)
点击进入:机器学习基础算法 (四)-决策树(Decision Tree)
点击进入:机器学习基础算法 (五)-随机森林:集成学习的强大力量
点击进入:机器学习基础算法 (六)-k 最近邻算法(k-Nearest Neighbors, k-NN)
点击进入:机器学习基础算法 (七)-朴素贝叶斯(Naive Bayes)
点击进入:机器学习基础算法 (八)-K均值聚类(K-Means Clustering)
点击进入:机器学习基础算法 (九) - AdaBoost
点击进入:机器学习基础算法 (九-二) - 梯度提升机(Gradient Boosting Machines, GBM)
点击进入:机器学习基础算法 (十) - XGBoost
点击进入:机器学习基础算法 (十一) - LightGBM-微软
点击进入:机器学习基础算法 (十二) - 层次聚类(Hierarchical Clustering)
点击进入:机器学习基础算法 (十三) - 主成分分析(PCA, Principal Component Analysis)
点击进入:机器学习基础算法 (十四) - 独立成分分析(ICA, Independent Component Analysis)
点击进入:机器学习基础算法 (十五) - t-SNE(t-Distributed Stochastic Neighbor Embedding)

本文为原创内容,未经许可不得转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海棠AI实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值