一、k-近邻算法概述
1-1.算法介绍
“邻近算法,或者说K最邻近(KNN,K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它最接近的K个邻近值来代表。近邻算法就是将数据集合中每一个记录进行分类的方法。简介KNN(K- Nearest Neighbor)法即K最邻近法,最初由 Cover和Hart于1968年提出,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。
1-2.KNN算法步骤
距离公式
两个样本的距离可以通过如下公式计算,又叫欧式距离
1.欧几里得距离
欧几里得距离是我们在平面几何中最常用的距离计算方法,即两点之间的直线距离。
d(p,q)^2=(q1-p1)^2+(q2-p2)^2
2. 曼哈顿距离
曼哈顿距离是计算两点在一个网格上的路径距离,与上述的直线距离不同,它只允许沿着网格的水平和垂直方向移动。
d=|q1-q2|+|p1-p2|
1-3.KNN优缺点
KNN算法
优点:
- 简单易用,相比其他算法,KNN算是比较简洁明了的算法。即使没有很高的数学基础也能搞清楚它的原理。
- 模型训练时间快,上面说到KNN算法是惰性的,这里也就不再过多讲述。
- 预测效果好。
- 对异常值不敏感
缺点:
- 要保存全部数据集,需要大量的存储空间;
- 需要计算每个未知点到全部已知点的距离,非常耗时;
- 对于不平衡数据效果不好,需要进行改进;
- 不适用于特征空间维度高的情况。
1-4.算法流程
1、准备数据集:
收集数据集,包括特征与对应的类别标签
对数据进行预处理,例如数据清洗、归一化等。
2、选择k值:
选择一个合适的k值,即确定最近邻居的个数。
3、选择距离度量方法
确定用于比较样本之间相似性的度量方法,常见的如欧几里得距离、曼哈顿距离等。
4、确定最近邻居
选择与待分类样本距离最近的k个训练样本
5、预测
对于分类任务:查看K个最近邻居中最常见的类别,作为预测结果。
对于回归任务:预测结果可以是K个最近邻居的平均值或加权平均值。
6、评估
使用适当的评价的评级骄傲指标评估模型的性能。
7、优化
基于性能评估结果,可能需要返回并调整某些参数,如K值、距离度量方法等,以获得更好的性能。
1-5. k值的选择
K值过小:
容易受到异常点的影响
k值过大:
受到样本均衡的问题
二、代码实现
2-1.手写数字识别
import numpy as np
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
# 加载手写数字数据集
digits = load_digits()
# 数据预处理
X = digits.data
y = digits.target
# 归一化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 训练模型
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
# 模型评估
y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
# 预测
# 这里可以替换成你自己的手写数字图像数据
# 注意需要先进行与训练数据相同的预处理操作
# new_image = preprocess(new_image)
# prediction = knn.predict(new_image)
2-2.在实验过程中遇到的编码及运行问题
- 数据预处理:在数据预处理过程中,可能会出现数据类型不匹配、缺失值处理、归一化等问题。解决思路是检查数据类型,并根据需要进行数据类型转换;对于缺失值,可以选择删除或填充;归一化则可以使用 scikit-learn 提供的 StandardScaler 进行处理。
- 模型选择:在选择 KNN 模型时,需要考虑选择合适的 k 值,以及是否需要进行距离加权等操作。解决思路是通过交叉验证等方法选择最优的 k 值,并根据实际情况决定是否进行距离加权。
- 性能评估:在模型评估过程中,需要选择合适的评估指标,并考虑是否需要进行交叉验证等操作。解决思路是选择合适的评估指标,如准确率、精确度、召回率等,并根据需要使用交叉验证等方法对模型进行评估。
2-3.解决这些问题的思路和过程
仔细检查代码逻辑,确保每一步操作都符合预期;查阅相关文档和资料,了解每个步骤的具体实现方法;在遇到问题时,可以尝试调试代码,输出中间结果,以便更好地定位问题所在。
2-4.对实验结果进行分析和总结
在这个实验中,使用了 KNN 算法对手写数字进行识别,通过 scikit-learn 提供的工具包来实现。以下是实验的主要步骤和结果总结:
-
数据准备: 使用了 scikit-learn 提供的
load_digits
函数加载了手写数字数据集,并将数据集划分为特征集X
和标签集y
。 -
数据预处理: 对特征数据进行了归一化处理,使用了
StandardScaler
对数据进行了标准化处理,以加快模型收敛速度,并提高模型性能。 -
数据拆分: 将数据集拆分成了训练集和测试集,其中80%的数据用于训练,20%用于测试。
-
模型训练和评估: 使用了
KNeighborsClassifier
构建了 KNN 模型,设置了n_neighbors=5
,并在训集上训练了模型。然后,我们使用测试集对模型进行了评估,并计算了模型在测试集上的准确率。最终,得到了模型在测试集上的准确率为约0.9833。 -
实验结果分析: 实验结果表明,构建的 KNN 模型在手写数字识别任务上表现良好,具有较高的准确率。这表明 KNN 算法适用于简单的图像分类任务,并且在数据量较小的情况下也能取得较好的效果。在实验中,还可以尝试调整 KNN 模型的超参数,如 k 值、距离度量方式等,以进一步提高模型性能。
总的来说,通过这个实验,能够加深了对 KNN 算法在图像分类任务中的应用理解,同时也可以学习如何使用 scikit-learn 来构建和评估机器学习模型。