k最近邻kNN算法入门

2023-10-30 11:24:21 浏览数 (2)

k最近邻(kNN)算法入门

引言

k最近邻(kNN)算法是机器学习中最简单、最易于理解的分类算法之一。它基于实例之间的距离度量来进行分类,并且没有显式的训练过程。本文将介绍k最近邻算法的基本原理和使用方法,并通过一个示例来说明其应用过程。

算法原理

k最近邻算法的原理非常简单:给定一个未知样本,将其与训练集中的实例进行距离度量,取距离最近的k个实例,根据这k个实例的类别进行投票,将未知样本归为票数最多的类别。

算法步骤

  1. 准备数据集:将要分类的样本数据集表示为一个特征矩阵和一个类别向量。
  2. 计算距离:对于未知样本,计算其与训练集中每个实例的距离,并根据距离进行排序。
  3. 选择k个最近邻:选取距离最近的k个实例作为最近邻。
  4. 进行投票:根据k个最近邻的类别进行投票,并取票数最多的类别作为未知样本的分类结果。

示例代码

下面通过一个简单的示例来演示k最近邻算法的应用过程。假设我们有一个手写数字的训练集,每个样本表示一个数字图像,并标有对应的数字标签。我们要对一个未知的手写数字图像进行分类,判断它表示的是哪个数字。

代码语言:javascript复制
pythonCopy codeimport numpy as np
from sklearn.neighbors import KNeighborsClassifier
# 准备训练集
X_train = np.array([[1, 1], [1, 2], [2, 1], [6, 6], [7, 7], [8, 6]])
y_train = np.array([0, 0, 0, 1, 1, 1])
# 创建kNN分类器
knn = KNeighborsClassifier(n_neighbors=3)
# 训练分类器
knn.fit(X_train, y_train)
# 准备测试样本
X_test = np.array([[2, 2], [7, 8]])
# 对测试样本进行分类预测
y_pred = knn.predict(X_test)
# 输出预测结果
print("预测结果:", y_pred)

在上述示例代码中,我们首先准备了一个包含两个特征的训练集​​X_train​​和对应的类别标签​​y_train​​。然后,我们使用​​KNeighborsClassifier​​类创建了一个k最近邻分类器,并指定了参数​​n_neighbors=3​​,表示我们要选择3个最近邻。 接下来,我们调用​​fit()​​方法训练分类器,并准备了一个测试样本​​X_test​​,其中包含两个未知的手写数字图像。 最后,我们调用​​predict()​​方法对测试样本进行分类预测,并将预测结果存储在变量​​y_pred​​中。最终,我们输出了预测结果。

结论

k最近邻(kNN)算法是一种简单而强大的分类算法,它不需要显式的训练过程,只需根据实例之间的距离进行分类。本文介绍了k最近邻算法的基本原理和应用步骤,并通过示例代码演示了算法的具体应用过程。希望读者通过本文对k最近邻算法有更深入的理解,能够在实际问题中灵活运用该算法进行分类任务。

下面是使用Python和scikit-learn库进行鸢尾花分类的示例代码:

代码语言:javascript复制
pythonCopy codeimport numpy as np
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.2, random_state=42)
# 创建kNN分类器
knn = KNeighborsClassifier(n_neighbors=3)
# 训练分类器
knn.fit(X_train, y_train)
# 对测试集进行分类预测
y_pred = knn.predict(X_test)
# 评估分类器性能
accuracy = accuracy_score(y_test, y_pred)
print("分类器准确率:", accuracy)

在上述示例代码中,首先导入了所需的库:​​numpy​​用于处理数据,​​load_iris​​函数用于加载鸢尾花数据集,​​train_test_split​​函数用于划分训练集和测试集,​​KNeighborsClassifier​​类用于创建kNN分类器,​​accuracy_score​​函数用于评估分类器的准确率。 接下来,通过​​load_iris​​函数加载鸢尾花数据集,并将特征矩阵和类别向量存储在变量​​X​​和​​y​​中。 然后,使用​​train_test_split​​函数将数据集划分为训练集和测试集。这里设定测试集占比为0.2,并设置随机种子为42,以保证每次运行结果一致。 接下来,创建一个k值为3的kNN分类器。 然后,使用​​fit​​方法训练分类器,并使用​​predict​​方法对测试集进行分类预测,将预测结果存储在变量​​y_pred​​中。 最后,使用​​accuracy_score​​函数计算分类器的准确率,并输出结果。

k最近邻(kNN)算法是一种简单而有效的分类算法,但它也存在一些缺点。下面将详细介绍k最近邻算法的缺点,并列出一些与kNN类似的算法。

缺点

  1. 计算复杂度高:kNN算法需要计算样本之间的距离,当数据集很大时,计算复杂度会变得非常高。因为需要对每个测试样本与所有训练样本进行距离计算,需要耗费大量时间和计算资源。
  2. 存储开销大:kNN算法需要存储整个训练集,特别是在特征维度较高的情况下,存储开销会很大。
  3. 预测耗时:k最近邻算法的预测速度相对较慢,因为需要计算测试样本与训练样本之间的距离,并找到最近的k个邻居。
  4. 敏感度高:kNN算法对于噪声和不相关的特征较为敏感,可能会将噪声和无关特征误认为是有意义的特征,从而影响分类结果。
  5. 非参数化:kNN算法是一种非参数化学习算法,不对数据的分布做出任何假设。因此,对于某些数据集,kNN可能会表现不佳。

类似算法

  1. 径向基函数核(kernel)方法:径向基函数核方法是一种基于核函数的分类算法,也可以用于近邻分类。与kNN不同的是,径向基函数核方法在计算距离时不仅考虑最近的k个样本,也考虑距离样本较远的样本的影响。常用的径向基函数核方法包括支持向量机(SVM)和径向基函数神经网络(RBFNN)。
  2. 决策树算法:决策树算法是一种常见的分类算法,可以用于近邻分类。决策树通过构建一棵树形结构,根据特征的取值来进行分类。与kNN不同的是,决策树算法不依赖于距离的计算,而是通过特征的组合来进行分类。
  3. 随机森林算法:随机森林是一种基于决策树的集成学习方法,也可以用于近邻分类。随机森林由多棵决策树构成,通过投票或平均预测结果来确定最终的分类结果。与kNN不同的是,随机森林通过随机选择特征和样本集来构建决策树,具有较强的抗噪声能力和泛化能力。
  4. 线性判别分析(LDA)算法:线性判别分析是一种经典的降维和分类算法,也可以用于近邻分类。LDA通过寻找最佳投影方向,使得类别间的距离最大化,类别内的距离最小化。与kNN不同的是,LDA通过对数据进行降维和投影来实现分类。 总结:k最近邻算法虽然有一些缺点,但在很多场景下仍然表现出了良好的性能。与kNN类似的算法有很多种,根据具体问题的特点和要求,可以选择合适的算法进行分类任务。

0 人点赞