机器学习(sklearn-KNN数字识别分类)

 

需求:基于KNN手写数字识别

  实验分析:

  1.样本数据模型训练,0-9的10数字,每个数字图片共计500张,用于训练数据

  2.图片识别:加载一张图片,通过读出图片数据,降维生成同样本数据相同像素进行比较

  实验包数据下载:提取码

  第一步:样本数据的提炼,存放在样本数据中

import numpy as np
# bmp 图片后缀
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.neighbors import KNeighborsClassifier


# 创建数据列表,存放图片数据
# 存放特征数据
feature = []
# 存放目标数据
target = []

# 图片存放位置 例如:/data/3/3_33.bmp
# data文件夹中存放0-9的图片,每个数字500中写法
for i in range(0,10):
    for j in range(1,501):
        img_path = './data/'+str(i)+'/'+str(i)+'_'+str(j)+'.bmp'
        img_arr = plt.imread(img_path)
        feature.append(img_arr)
        target.append(i)

  第二步:将存放的列表内的样本数据转换成np.array类型数据,再降维变成2维数据

feature = np.array(feature)
target = np.array(target)

feature.shape  #特征是三维
#需要变形成二维
feature = feature.reshape(5000,784)
feature.shape
# target.shape

# 结果>>>(5000, 784)

  第三步:样本数据的打乱操作,便于样本数据的模型训练及样本数据测试

  随机数种子(因子),种子数值量确定后,则打乱的随机数方式相同,保证特征数据与目标数一一对应

# 将样本数据打乱
# 设置打乱的随机数因子3,随机数因子相同时,每次打乱结果则会相同
# 设置随机数因子
np.random.seed(3)
# 打乱特征数据
np.random.shuffle(feature)
np.random.seed(3)
# 打乱目标数据
np.random.shuffle(target)

# 获取训练数据和测试数据
x_train = feature[:4950]
y_train = target[:4950]

x_test = feature[4950:]
y_test = target[4950:]

  第四步:实例化模型对象,进行机器模型的训练

knn = KNeighborsClassifier(n_neighbors=15)
knn.fit(x_train,y_train)
knn.score(x_test,y_test)

# k的score结果>>>0.96

  第五步:训练模型的保存

  数据模型的训练需要花大量的时间,我们把训练好的模型存入本地,每次使用则重本地加载即可

#保存训练好的模型
from sklearn.externals import joblib
# 保存训练模型后缀名必须为.m类型文件
joblib.dump(knn,'./digist_knn.m')
#结果>>>['./digist_knn.m']  #返回保存路径

#加载训练模型
knn = joblib.load('./digist_knn.m')
#结果>>>
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=None, n_neighbors=15, p=2,
           weights='uniform')

  第六步:测试真实目标数据与模型分类生成的目标数据对比

#使用测试数据测试模型的精准度
print('已知分类:',y_test)
print('模型分类结果:',knn.predict(x_test))

# 结果>>>
已知分类: [4 5 7 9 7 5 7 6 8 6 4 1 3 4 8 4 2 0 1 2 0 5 8 6 5 9 3 9 1 8 9 6 4 1 5 2 8
 7 7 2 5 3 5 5 6 1 1 3 6 3]
模型分类结果: [4 5 7 9 7 5 7 6 8 6 1 1 3 4 8 4 1 0 1 2 0 5 8 6 5 9 3 9 1 8 9 6 4 1 5 2 8
 7 7 2 5 3 5 5 6 1 1 3 6 3]

  第七步:加载外部图片,剪切处理,获取某一个需要测试的数字图片

#将外部图片带入模型进行识别
img_arr = plt.imread('./数字.jpg')
plt.imshow(img_arr)

  加载的原始图片

 

  第八步:剪切处理后的图片,这里我们测试数字3,通过数组的切片获取

  three = img_arr[3:70,200:240]
  plt.imshow(three)

  加载剪切后的数字3

  

  第九步:将剪切后图片数据进行处理,最后得到同样本数据相同的数据结构,再通过机器模型分类,得到最后结果

    1.需要转换成样本类型np.array

    2.需要同样本数据相同的维度2维

    3.需要同样本数据相同的像素28*28

# 查看图片数据类型 数据:3维数据类型(像素:67*40 颜色:3)
three.shape
#结果>>>(67, 40, 3)

# 需要对图片数据进行降维 降维有特定算法
# 这里我们采用的不精确的方式,对颜色做平局值计算,达到降维
three = three.mean(axis=2)
three.shape
#结果>>>(67, 40)

# 像素的等比例压缩,使当前图片像素与样本数据像素相同(28*28)
import scipy.ndimage as ndimage
# 等比缩放到28*28
three = ndimage.zoom(three,zoom = (28/67,28/40))
three.shape
#结果>>>(28, 28)

# 将二维图片数据转换成样本数据样式1*784
three = three.reshape(1,784)
three.shape
#结果>>>(1, 784)

# 图片结果分类
knn.predict(three)
#结果>>>array([3])  #识别图片为数字3

完!

 

posted @ 2019-08-14 20:11  Amorphous  阅读(562)  评论(0编辑  收藏  举报