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

文章目录

  • 1、读取数据
    • 1.1、导入相关库
    • 1.2、读取一张图片测试
    • 1.3、读取所有图片
  • 2、数据预处理
    • 2.1、list转numpy
    • 2.2、添加对应数字
  • 3、随机抽取训练集与测试集
  • 4、训练模型并预测
    • 4.1、训练模型
    • 4.2、预测
    • 4.3、计算准确率
    • 4.4、精确度调整
  • 5、识别某张图片
    • 5.1、读取图片
    • 5.2、识别数字

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


1、读取数据

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

● data文件夹下:
机器学习之KNN-手写数字识别_第1张图片


● 0文件夹下:
机器学习之KNN-手写数字识别_第2张图片


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) #这些图片都是黑白的,

机器学习之KNN-手写数字识别_第3张图片


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)查看数据形状

机器学习之KNN-手写数字识别_第4张图片
结果分析: 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个结果:
机器学习之KNN-手写数字识别_第5张图片

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()

机器学习之KNN-手写数字识别_第6张图片

5.2、识别数字

knn.predict(img.reshape(1,-1))[0]
9

你可能感兴趣的:(机器学习学习)