利用KNN算法实现手写数字识别


一 KNN算法: K-近邻算法(K Nearest Neighbor,简称KNN),比如根据你的’邻居’你的类别.
在这里插入图片描述

KNN算法思想:如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别,则该样本也属于这一个类别.

二 交叉验证:是一种数据集的分割方式,将训练集划分为n份,拿一份做验证集,其他做训练集,交叉验证是划分数据集的一种方法,目的就是为了得到更加准确可行的模型评分.

三 网格搜索:是模型调参的有利工具

为什么需要网格搜索?

  1. 模型有很多超参数,其他能力也存在很大的差异,需要手动产生很多超参数组合,来训练模型.

  2. 每组超参数都采用交叉验证评估,最后选出最优参数组合建立模型.

利用KNN算法实现手写数字识别

已知数据:

    1.MI=NIST手写数字

    2.1999年发布,成为分类算法基准测试的标准

    3.MNIST仍然是研究人员和学习者的可靠资源

需求:

    从数万个手写图像的数据集中正确识别数字

数据介绍:

    1.数据文件是包含从0到9的手绘数字的灰度图像

    2.每个图像高28像素,宽28像素,共784个像素

    3.每个像素取值范围[0,255], 取值越大意味着颜色越深

    4.训练数据集共785行

            第一列为'标签', 为该图片对应的手写数字,其余为该图像的像素值,

    5.训练集中的特征名称均为pixel前缀,后面代表像素的符号

训练模型, 程序效果

# 4.编写KNN代码手写数字识别

# 导包
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
import joblib
from collections import Counter
from sklearn.metrics import accuracy_score

# 加载数据
data = pd.read_csv('./手写数字识别.csv')

# 读取数据
x = data.iloc[:, 1:]
y = data.iloc[:, 0]

# 显示指定的图片 #data 修改为ndarray类型
# data =x.iloc[44].values

# 展示数据
# data_ = data.reshape(28, 28)
# plt.imshow(data_, cmap='gray')
# plt.imsave('demo.png', data_)
# plt.show()

# 数据预处理 归一化
x = x / 255.

# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, stratify=y, random_state=22)

# 模型训练
model = KNeighborsClassifier(n_neighbors=5)
model.fit(x_train, y_train)

# 模型预测
y_predict = model.predict(x_test)
print(y_predict)

# 模型评估
print(model.score(x_test, y_test))
print(accuracy_score(y_predict, y_test))

# 模型保存
joblib.dump(model, './knn_model.pkl')

# 模型加载
knn = joblib.load('knn_model.pkl')

img = plt.imread('./demo.png')
plt.imshow(img, cmap='gray')
plt.show()

y_pred = knn.predict(img.reshape(1, -1))
print(y_pred)

效果如下:
在这里插入图片描述

这里写自定义目录标题

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值