机器学习之KNN-手写数字识别

操作平台: windows10, python37, jupyter
数据下载: https://www.lanzous.com/iae2wyh


1、读取数据

  • 这些数据全部都是图片,从0~9,一个数字共500张,并且每个数字图片都在对应的文件夹下,以 自身值_序号.bmp 的方式进行命名,如图:

● data文件夹下:
在这里插入图片描述


● 0文件夹下:
在这里插入图片描述


1.1、导入相关库

import numpy as np
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
%matplotlib inline

1.2、读取一张图片测试

img = plt.imread('./data/0/0_1.bmp')
plt.imshow(img,cmap = plt.cm.gray) #这些图片都是黑白的,

在这里插入图片描述


1.3、读取所有图片

data = []
for i in range(10):
    for j in range(1,501):
        data.append(plt.imread('./data/%d/%d_%d.bmp'%(i,i,j)))

查看data大小:

len(data)
5000


2、数据预处理

2.1、list转numpy

  • 上面得到的data是list类型,但是图片是用维度的,需要把它的数据还原。
# 数据
X = np.array(data)
X.shape
(5000, 28, 28)

2.2、添加对应数字

  • 上面得到的信息只是图片本身的数据,但是却不明确是哪个数字,所以必须给它指定,并赋值给 y。

(1)构造数组

y = [0,1,2,3,4,5,6,7,8,9]*500
y

结果:从0-9,0-9,0-9,一共500次。总共有5000个数值。


(2)数组转numpy

y = np.array(y)
y
array([0, 1, 2, ..., 7, 8, 9])

(3)排序

  • 因为上面的data是每一个文件夹分别读取的,一样的数值就在一起了,前500个全是0, 第二个500全是1… …,我们只需要y排序就可以对应它的值了。
y.sort()
y
array([0, 0, 0, ..., 9, 9, 9])


3、随机抽取训练集与测试集

  • 随机抽样,不影响算法,算法根据距离来进行
  • 训练集和测试集可能会被重复抽取到
index = np.random.randint(0,5000,size = 4000)#随机抽取80%来训练

X_train = X[index]
y_train = y[index]

index = np.random.randint(0,5000,size = 1000) #随机抽取20%来测试

X_test = X[index]
y_test = y[index]

(1)查看数据形状

在这里插入图片描述
结果分析: x的训练集和y的训练集数据维度不能对应,x是3维的,y属于1维的,必须要把它统一维度才能进行运算,接下了对x进行降维处理。


(2)降维处理

  • 每张图片的分辨率都是28*28,相乘等于784
X_train.reshape(4000,784)
array([[255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       ...,
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255]], dtype=uint8)



4、训练模型并预测

4.1、训练模型

%%time
knn = KNeighborsClassifier(n_neighbors=5)#邻近值个数为5

knn.fit(X_train.reshape(4000,-1),y_train) #如果不想计算出28*28=784,可以直接用-1代替784
Wall time: 1.97 s
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
                     metric_params=None, n_jobs=None, n_neighbors=5, p=2,
                     weights='uniform')

4.2、预测

%%time  #耗时Wall time: 12.1 s
# 预测
y_ = knn.predict(X_test.reshape(1000,784))

查看前20个结果:
在这里插入图片描述

4.3、计算准确率

(1)方法一

(y_test == y_).mean()
0.931

(2)方法二

knn.score(X_test.reshape(1000,-1),y_test)
0.931



4.4、精确度调整

%%time
# n_neighbors=邻近值,weights=权重, p = 距离,n_jobs=线程
knn = KNeighborsClassifier(n_neighbors=5,weights='distance', p = 1,n_jobs=-1)

knn.fit(X_train.reshape(4000,-1),y_train) #训练模型

# predict ,计算准确率
knn.score(X_test.reshape(1000,-1),y_test)
Wall time: 3.88 s

0.953



5、识别某张图片

5.1、读取图片

img = plt.imread('./data/9/9_1.bmp') #随便读取一张图片
plt.imshow(img,cmap = plt.cm.gray) #展示
plt.show()

在这里插入图片描述

5.2、识别数字

knn.predict(img.reshape(1,-1))[0]
9
  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值