当前位置:   article > 正文

K-近邻算法 手写数字识别_用k-近邻算法识别手写数字 原理

用k-近邻算法识别手写数字 原理

一、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算法

优点:

  1. 简单易用,相比其他算法,KNN算是比较简洁明了的算法。即使没有很高的数学基础也能搞清楚它的原理。
  2. 模型训练时间快,上面说到KNN算法是惰性的,这里也就不再过多讲述。
  3. 预测效果好。
  4. 对异常值不敏感

缺点:

  • 要保存全部数据集,需要大量的存储空间;
  • 需要计算每个未知点到全部已知点的距离,非常耗时;
  • 对于不平衡数据效果不好,需要进行改进;
  • 不适用于特征空间维度高的情况。

 1-4.算法流程
               

1、准备数据集:


      收集数据集,包括特征与对应的类别标签

      对数据进行预处理,例如数据清洗、归一化等。

 2、选择k值:


      选择一个合适的k值,即确定最近邻居的个数。

 3、选择距离度量方法


      确定用于比较样本之间相似性的度量方法,常见的如欧几里得距离、曼哈顿距离等。

 4、确定最近邻居


      选择与待分类样本距离最近的k个训练样本

 5、预测


     对于分类任务:查看K个最近邻居中最常见的类别,作为预测结果。

     对于回归任务:预测结果可以是K个最近邻居的平均值或加权平均值。

 6、评估


     使用适当的评价的评级骄傲指标评估模型的性能。

  7、优化


     基于性能评估结果,可能需要返回并调整某些参数,如K值、距离度量方法等,以获得更好的性能。

1-5. k值的选择

K值过小

​ 容易受到异常点的影响

k值过大:

​ 受到样本均衡的问题

二、代码实现

2-1.手写数字识别

  1. import numpy as np
  2. from sklearn.datasets import load_digits
  3. from sklearn.model_selection import train_test_split
  4. from sklearn.preprocessing import StandardScaler
  5. from sklearn.neighbors import KNeighborsClassifier
  6. from sklearn.metrics import accuracy_score
  7. # 加载手写数字数据集
  8. digits = load_digits()
  9. # 数据预处理
  10. X = digits.data
  11. y = digits.target
  12. # 归一化
  13. scaler = StandardScaler()
  14. X_scaled = scaler.fit_transform(X)
  15. # 拆分数据集
  16. X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
  17. # 训练模型
  18. knn = KNeighborsClassifier(n_neighbors=5)
  19. knn.fit(X_train, y_train)
  20. # 模型评估
  21. y_pred = knn.predict(X_test)
  22. accuracy = accuracy_score(y_test, y_pred)
  23. print("Accuracy:", accuracy)
  24. # 预测
  25. # 这里可以替换成你自己的手写数字图像数据
  26. # 注意需要先进行与训练数据相同的预处理操作
  27. # new_image = preprocess(new_image)
  28. # prediction = knn.predict(new_image)

2-2.在实验过程中遇到的编码及运行问题

  • 数据预处理:在数据预处理过程中,可能会出现数据类型不匹配、缺失值处理、归一化等问题。解决思路是检查数据类型,并根据需要进行数据类型转换;对于缺失值,可以选择删除或填充;归一化则可以使用 scikit-learn 提供的 StandardScaler 进行处理。
  • 模型选择:在选择 KNN 模型时,需要考虑选择合适的 k 值,以及是否需要进行距离加权等操作。解决思路是通过交叉验证等方法选择最优的 k 值,并根据实际情况决定是否进行距离加权。
  • 性能评估:在模型评估过程中,需要选择合适的评估指标,并考虑是否需要进行交叉验证等操作。解决思路是选择合适的评估指标,如准确率、精确度、召回率等,并根据需要使用交叉验证等方法对模型进行评估。

2-3.解决这些问题的思路和过程

仔细检查代码逻辑,确保每一步操作都符合预期;查阅相关文档和资料,了解每个步骤的具体实现方法;在遇到问题时,可以尝试调试代码,输出中间结果,以便更好地定位问题所在。

2-4.对实验结果进行分析和总结

在这个实验中,使用了 KNN 算法对手写数字进行识别,通过 scikit-learn 提供的工具包来实现。以下是实验的主要步骤和结果总结:

  1. 数据准备: 使用了 scikit-learn 提供的 load_digits 函数加载了手写数字数据集,并将数据集划分为特征集 X 和标签集 y

  2. 数据预处理: 对特征数据进行了归一化处理,使用了 StandardScaler 对数据进行了标准化处理,以加快模型收敛速度,并提高模型性能。

  3. 数据拆分: 将数据集拆分成了训练集和测试集,其中80%的数据用于训练,20%用于测试。

  4. 模型训练和评估: 使用了 KNeighborsClassifier 构建了 KNN 模型,设置了 n_neighbors=5,并在训集上训练了模型。然后,我们使用测试集对模型进行了评估,并计算了模型在测试集上的准确率。最终,得到了模型在测试集上的准确率为约0.9833。

  5. 实验结果分析: 实验结果表明,构建的 KNN 模型在手写数字识别任务上表现良好,具有较高的准确率。这表明 KNN 算法适用于简单的图像分类任务,并且在数据量较小的情况下也能取得较好的效果。在实验中,还可以尝试调整 KNN 模型的超参数,如 k 值、距离度量方式等,以进一步提高模型性能。

总的来说,通过这个实验,能够加深了对 KNN 算法在图像分类任务中的应用理解,同时也可以学习如何使用 scikit-learn 来构建和评估机器学习模型。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/1008068
推荐阅读
相关标签
  

闽ICP备14008679号