Python从0到100(五十四):机器学习-K近邻算法及⼿写数字识别数据集分类

举报
是Dream呀 发表于 2024/08/28 22:25:19 2024/08/28
【摘要】 前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学习学习和学业的先行者!欢迎大家订阅专栏:零基础学Python:Python从0...

在这里插入图片描述

前言: 零基础学Python:Python从0到100最新最全教程 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学习学习和学业的先行者!
欢迎大家订阅专栏:零基础学Python:Python从0到100最新最全教程!

K最近邻(K-Nearest Neighbors,简称KNN) 是⼀种常⽤的监督学习算法,主要⽤于分类和回归问题。KNN的基本原理是基于特征空间中样本点的距离来进⾏预测或分类。对于分类问题,KNN找到与待分类样本在特征空间中最近的K个训练样本,并基于它们的类别标签进⾏投票决策。对于回归问题,KNN找到最近的K个训练样本,并计算它们的平均值或加权平均值来预测待预测样本的数值输出。

1.基本原理

1、距离度量: KNN基于样本点之间的距离来度量它们的相似性。通常使⽤欧几里得距离、曼哈顿距离、闵可夫斯基距离等来计算距离。
2、K值选择: KNN中的K表示选择最近邻的数量。通过选择不同的K值,可以调整模型的复杂性。较小的K值可能会导致模型对噪声敏感,⽽较⼤的K值可能会导致模型过于平滑。
3、投票或平均: 对于分类问题,KNN对最近的K个训练样本的类别标签进⾏投票,然后将得票最多的类别标签分配给待分类样本。对于回归问题,KNN计算最近的K个训练样本的数值输出的平均值或加权平均值,并将结果⽤作待预测样本的输出。

2.公式模型

KNN的核⼼公式涉及到距离度量和K个最近邻的选择。
1.距离度量: KNN使⽤距离度量来计算样本之间的距离。对于两个样本点xi和xj,欧几里得距离的计算公式为:
在这里插入图片描述
其中,n是特征的数量。
2.K个最近邻的选择: 对于分类问题,KNN选择与待分类样本距离最近的K个训练样本,然后根据它们的类别标签进⾏投票决策。对于回归问题,KNN选择与待预测样本距离最近的K个训练样本,然后计算它们的数值输出的平均值或加权平均值来预测。

3.优缺点

优点:

  1. 简单直观:K近邻算法易于理解和实现,⽆需对模型进⾏训练。
  2. 适⽤于多类别问题:K近邻算法可以处理多类别问题,并且对类别不平衡的数据集也⽐较有效。
  3. 适⽤于⾮线性数据:K近邻算法适⽤于⾮线性关系的数据。

缺点:

  1. 需要⼤量内存:K近邻算法需要保存整个训练集,因此对内存消耗较⼤。
  2. 预测速度较慢:对于⼤型数据集,预测速度较慢,因为需要计算待预测样本与所有训练样本的距离。
  3. 对异常值敏感:K近邻算法对异常值较为敏感,可能会影响预测结果。

4.适用场景

K近邻算法适⽤于以下场景:

  1. 数据集较小:当数据集规模较小且特征维度不⾼时,K近邻算法表现较好。
  2. 非线性数据集:对于非线性关系的数据集,K近邻算法通常表现良好。
  3. 需要解释性强的模型:K近邻算法能够提供直观的解释,因此适用于需要可解释性强的场景。

K近邻算法是⼀种简单而强⼤的监督学习算法,尤其适用于小型数据集和非线性数据集。然而,在处理⼤型数据集和⾼维数据时,K近邻算法的性能可能不如⼀些更复杂的算法。

5.手写数字识别数据集分类

使⽤手写数字识别数据集(MNIST dataset)。这个数据集包含了⼤量的⼿写数字图片及其对应的标签,我们将使⽤K近邻算法来对这些手写数字进行分类。
在这里插入图片描述
⾸先加载了⼿写数字数据集,并划分了训练集和测试集。然后我们构建了⼀个K近邻分类器,并在测试集上进行了预测。接着,我们计算了模型的准确率,并绘制了混淆矩阵来评估模型的性能。
在这里插入图片描述
最后,我们随机选择了⼀些样本并展示了它们的预测结果。

Accuracy: 0.9861111111111112

完整代码:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, confusion_matrix
# 加载⼿写数字数据集
digits = load_digits()
X = digits.data
y = digits.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 构建K近邻模型
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)
# 绘制混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
plt.imshow(conf_matrix, cmap='Blues')
plt.colorbar()
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.title('Confusion Matrix')
plt.show()
# 随机选择⼀些样本并展示预测结果
plt.figure(figsize=(10, 8))
for i in range(10):
    idx = np.random.randint(0, len(X_test))
    image = X_test[idx].reshape(8, 8)
    plt.subplot(2, 5, i+1)
    plt.imshow(image, cmap='binary')
    plt.title(f'Predicted: {y_pred[idx]}, Actual: {y_test[idx]}')
    plt.axis('off')
plt.show()

KNN是⼀种简单⽽直观的算法,它不需要训练过程,但在处理⼤规模数据集时可能会变得计算密集。选择合适的距离度量和K值是KNN的关键,通常需要根据具体问题进⾏调整和优化。此外,KNN在处理不平衡数据和⾼维数据时可能会表现不佳,因此需要谨慎选择适⽤场景。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。