zoukankan      html  css  js  c++  java
  • knn 数字识别

    #knn介绍 更多参考百度介绍

    
    
    算法思想:给定一个带标检的训练数据集(就是带分类结果的样本),对于一个新的输入实例,我们在训练数据集中以某种距离度量方式找出与该输入实例距离最近邻的k个实例。
    找出这k个实例(这也是knn中k的含义)中类别出现最多的那个类别,最后我们就将该新的输入实例划分为此类别
    import numpy as np
    # bmp 图片后缀
    import matplotlib.pyplot as plt
    from sklearn.neighbors import KNeighborsClassifier
    
    img_path = './data/3/3_100.bmp'
    arr_img = plt.imread(img_path)
    arr_img.shape  #维度
    
    #特征必须是二维
    feature = [] #特征
    target = [] #目标数据
    for i in range(10):
        for j in range(1,501):
            #img_path = './data/'+str(i)+'/'+str(i)+'_'+str(j)+'.bmp' 
            #将图片数据读取到了numpy
            img_arr = plt.imread('./data/%d/%d_%d.bmp'%(i,i,j))  #格式化替换
            feature.append(img_arr)
            target.append(i)
    #将列表转numpy
    feature = np.array(feature)
    feature.shape  #发现feature是三维,必须变形成二维的才可以作为特征数据
    #获取了符合要求的特征数据(二维)
    feature = feature.reshape((5000,784))
    target = target
    #将样本集拆分成训练数据和测试数据
    np.random.seed(6)
    np.random.shuffle(feature)
    np.random.seed(6)
    np.random.shuffle(target)
    #训练数据
    x_train = feature[0:4950]
    y_train = target[0:4950]
    #测试数据
    x_test = feature[4950:]
    y_test = target[4950:]
    
    x_train.shape  #训练形状
    knn = KNeighborsClassifier(n_neighbors=15)
    knn.fit(x_train,y_train)  #试数据
    knn.score(x_test,y_test)  #评分
    print('模型分类结果:',knn.predict(x_test))
    print('真实分类:',y_test)

    #下面测试一张新的照片

    #获取外部的一张数字图片,让模型进行分类
    digist_img_arr = plt.imread('./数字.jpg')
    digist_img_arr.shape
    plt.imshow(digist_img_arr)
    five_img_arr = digist_img_arr[95:150,90:125]  #图片切割   行/列
    plt.imshow(five_img_arr)
    #检查切分出图片(即将被模型进行分类的图片)的形状
    five_img_arr.shape   #(55, 35, 3)
    
    #将图片的第三个维度删除(降维)
    five_img_arr = five_img_arr.mean(axis=2) #任意的聚合方法都能降维  0-x 1-y 2-z
    five_img_arr.shape
    #对不满足像素要求的图片进行等比例压缩
    import scipy.ndimage as ndimage
    five_img_arr = ndimage.zoom(five_img_arr,zoom=(28/55,28/35))  #图片压缩
    five_img_arr.shape #(28, 28)
    five_img_arr = five_img_arr.reshape((1,784))  #1行784列
    five_img_arr.shape  #(1,784)
    knn.predict(five_img_arr)[0]  #X  未知分类的数据

    #模型保存和运用

    #保存模型
    from sklearn.externals import joblib
    joblib.dump(knn,'./knn.m')  #写入模型 value, filename, compress=0, protocol=None, cache_size=None
    kknn = joblib.load('./knn.m')  #读取模型   kknn对象
    print(kknn) 
    #KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
               #metric_params=None, n_jobs=1, n_neighbors=15, p=2,
               #weights='uniform')
    kknn.predict(five_img_arr)[0] #测试模型 结果5
  • 相关阅读:
    数据结构:图 (总结)
    排序算法总结(此篇文章是14年写作,代码难看,请看我新发表的排序总结)
    no identifier specified for entity错误
    哈夫曼编码算法思想总结
    线索二叉树
    ORACLE 错误 ora-01830 解决方法
    (转)web会话管理方式
    (转)C3P0配置
    分页技术()
    简易 DBUtil 封装
  • 原文地址:https://www.cnblogs.com/zhangchen-sx/p/11133868.html
Copyright © 2011-2022 走看看