k最近邻(kNN)算法入门
引言
k最近邻(kNN)算法是机器学习中最简单、最易于理解的分类算法之一。它基于实例之间的距离度量来进行分类,并且没有显式的训练过程。本文将介绍k最近邻算法的基本原理和使用方法,并通过一个示例来说明其应用过程。
算法原理
k最近邻算法的原理非常简单:给定一个未知样本,将其与训练集中的实例进行距离度量,取距离最近的k个实例,根据这k个实例的类别进行投票,将未知样本归为票数最多的类别。
算法步骤
- 准备数据集:将要分类的样本数据集表示为一个特征矩阵和一个类别向量。
- 计算距离:对于未知样本,计算其与训练集中每个实例的距离,并根据距离进行排序。
- 选择k个最近邻:选取距离最近的k个实例作为最近邻。
- 进行投票:根据k个最近邻的类别进行投票,并取票数最多的类别作为未知样本的分类结果。
示例代码
下面通过一个简单的示例来演示k最近邻算法的应用过程。假设我们有一个手写数字的训练集,每个样本表示一个数字图像,并标有对应的数字标签。我们要对一个未知的手写数字图像进行分类,判断它表示的是哪个数字。
ini
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库进行鸢尾花分类的示例代码:
ini
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类似的算法。
缺点
- 计算复杂度高:kNN算法需要计算样本之间的距离,当数据集很大时,计算复杂度会变得非常高。因为需要对每个测试样本与所有训练样本进行距离计算,需要耗费大量时间和计算资源。
- 存储开销大:kNN算法需要存储整个训练集,特别是在特征维度较高的情况下,存储开销会很大。
- 预测耗时:k最近邻算法的预测速度相对较慢,因为需要计算测试样本与训练样本之间的距离,并找到最近的k个邻居。
- 敏感度高:kNN算法对于噪声和不相关的特征较为敏感,可能会将噪声和无关特征误认为是有意义的特征,从而影响分类结果。
- 非参数化:kNN算法是一种非参数化学习算法,不对数据的分布做出任何假设。因此,对于某些数据集,kNN可能会表现不佳。
类似算法
- 径向基函数核(kernel)方法:径向基函数核方法是一种基于核函数的分类算法,也可以用于近邻分类。与kNN不同的是,径向基函数核方法在计算距离时不仅考虑最近的k个样本,也考虑距离样本较远的样本的影响。常用的径向基函数核方法包括支持向量机(SVM)和径向基函数神经网络(RBFNN)。
- 决策树算法:决策树算法是一种常见的分类算法,可以用于近邻分类。决策树通过构建一棵树形结构,根据特征的取值来进行分类。与kNN不同的是,决策树算法不依赖于距离的计算,而是通过特征的组合来进行分类。
- 随机森林算法:随机森林是一种基于决策树的集成学习方法,也可以用于近邻分类。随机森林由多棵决策树构成,通过投票或平均预测结果来确定最终的分类结果。与kNN不同的是,随机森林通过随机选择特征和样本集来构建决策树,具有较强的抗噪声能力和泛化能力。
- 线性判别分析(LDA)算法:线性判别分析是一种经典的降维和分类算法,也可以用于近邻分类。LDA通过寻找最佳投影方向,使得类别间的距离最大化,类别内的距离最小化。与kNN不同的是,LDA通过对数据进行降维和投影来实现分类。 总结:k最近邻算法虽然有一些缺点,但在很多场景下仍然表现出了良好的性能。与kNN类似的算法有很多种,根据具体问题的特点和要求,可以选择合适的算法进行分类任务。