精华内容
下载资源
问答
  • KNN实现手写数字识别

    2018-03-28 16:38:13
    基于opencv-KNN最邻近算法实现手写数字识别,使用Qt做UI实现手写板,可以实时测试,资源包含源代码和可执行程序(release文件夹下的exe文件可以直接运行)
  • 使用kNN算法对0-9的手写数据集进行识别,包括python代码和数据,数据为txt格式。
  • 伯克利人工智能先导课cs188作业,朴素贝叶斯模型和KNN算法实现手写数字识别,准确率都达到很高水平,有说明文件,有训练结果绘图,适合新手入门
  • KNN算法使用MNIST数据集、0-1二值图集、自写的数字图片集,做手写数字识别的代码,文件夹分类明确。
  • # 利用sklearn KNN实现手写数字识别 import numpy as np import pandas as pd from PIL import Image import matplotlib.pyplot as plt from sklearn.preprocessing import MinMaxScaler from sklearn....
    # 利用sklearn KNN实现手写数字识别
    
    
    import numpy as np
    
    import pandas as pd
    
    from PIL import Image
    
    import matplotlib.pyplot as plt
    
    from sklearn.preprocessing import MinMaxScaler
    
    from sklearn.neighbors import KNeighborsClassifier
    
    from sklearn.model_selection import train_test_split,GridSearchCV
    
    
    
    def imgTovector(filename):
    
        img=plt.imread(filename)
    
        img_data=np.array(img)
    
    #    Minmax=MinMaxScaler()
    
    #    img_union=Minmax.fit_transform(img_data)
    
        img_vector=img_data.reshape(1,-1)
    
        return img_vector
    
    
    
    from os import listdir
    
    def collectFiledataset():
    
        img_labels = list()
    
        # 样本数据文件列表
    
        FileList = listdir('knn_num_data')
    
        f = len(FileList)
    
        # 设置初始矩阵
    
        c = 28 * 28
    
        dataSet = np.zeros((5000, c))
    
        for i in range(f):
    
            path = 'knn_num_data/' + FileList[i]
    
            trainingFilelist = listdir(path)
    
            t = len(trainingFilelist)
    
            for j in range(t):
    
                fileNameStr = trainingFilelist[j]
    
                fileStr = fileNameStr.split('.')[0]
    
                classNum = int(fileStr.split('_')[0])
    
                img_labels.append(classNum)
    
                filename = './knn_num_data/' + FileList[i] + '/' + fileNameStr
    
                img_vector = imgTovector(filename)
    
                # 将样本数据存入矩阵
    
                ins = i * (t - 1) + j
    
                dataSet[ins, :] = img_vector[0]
    
        dataSet = pd.DataFrame(dataSet)
    
        dataSet['img_labels'] = img_labels
    
        return dataSet
    
    
    
    dataSet=collectFiledataset()
    
    df=pd.DataFrame(dataSet)
    
    df_r=df.iloc[:,:-1].std(axis=1) !=0
    
    df_c=df.iloc[:,:-1].std(axis=0) !=0
    
    l=df.img_labels
    
    labels=l.loc[df_r.values]
    
    img_df=df.loc[df_r.values,df_c.values]
    
    img_ = img_df.loc[:,img_df.std()!=0]
    
    #归一化
    
    MM=MinMaxScaler()
    
    img_union=MM.fit_transform(img_)
    
    img_union.shape
    
    X_train,X_test,y_train,y_test=train_test_split(feature,labels,test_size=.3)
    
    kd_tree=KNeighborsClassifier(algorithm='kd_tree',n_neighbors=12,p=2,n_jobs=2)
    
    # param_grid = dict(n_neighbors=np.arange(5,100))
    
    # gc = GridSearchCV(kd_tree,param_grid,cv=4,n_jobs=2).fit(feature,labels)
    
    
    
    kd_tree.fit(X_train,y_train)
    
    kd_tree.score(X_train,y_train),kd_tree.score(X_test,y_test)
    

    展开全文
  • 机器学习入门KNN算法实现手写数字识别 基本上照搬了http://lib.csdn.net/article/opencv/30167的代码,只是改了一点bug和增加了一点功能 输入就是直接在一个512*512大小的白色画布上画黑线,然后转化为01矩阵,用...
  • 通过最近邻域法(KNN实现手写数字识别,并且计算识别的准确率
  • 图像识别:利用KNN实现手写数字识别(mnist数据集) 步骤: 1、数据的加载(trainSize和testSize不要设置的太大) 2、k值的设定(不宜过大) 3、KNN的核心:距离的计算 4、k个最近的图片-->根据下标寻找...

    图像识别:利用KNN实现手写数字识别(mnist数据集)

    步骤:

    1、数据的加载(trainSize和testSize不要设置的太大)

    2、k值的设定(不宜过大)

    3、KNN的核心:距离的计算

    4、k个最近的图片-->根据下标寻找对应的标签

    5、根据标签转化成相应的数字

    6、检测概率统计

     

     在我看来,KNN算法最大的优点是简单,准确率较高;

    最大的缺点是:当数据量较大时,计算量成倍增长,测试集与训练集之间的任意两个元素之间都要计算距离。

    注意1:trainSize和testSize不要设置的太大,如果过大,数据处理中产生更加庞大的数据,内存溢出,导致程序崩溃。

    注意2:k值的设定太大会提高计算机的计算量,而且会一定程度上降低准确率。

    import tensorflow as tf
    import numpy as np
    from tensorflow.examples.tutorials.mnist import input_data
    
    mnist = input_data.read_data_sets('D:/MNIST_data', one_hot=True)
    trainNum = 55000
    testNum = 10000
    trainSize = 500
    testSize = 5
    k = 4
    
    # data 分解
    trainIndex = np.random.choice(trainNum, trainSize, replace=False)
    testIndex = np.random.choice(testNum, testSize, replace=False)
    trainData = mnist.train.images[trainIndex]  # 训练图片
    trainLabel = mnist.train.labels[trainIndex]  # 训练标签
    testData = mnist.test.images[testIndex]  # 测试图片
    testLabel = mnist.test.labels[testIndex]  # 测试标签
    
    # 利用placeholder来完成数据的加载
    trainDataInput = tf.placeholder(shape=[None, 784], dtype=tf.float32)
    trainLabelInput = tf.placeholder(shape=[None, 10], dtype=tf.float32)
    testDataInput = tf.placeholder(shape=[None, 784], dtype=tf.float32)
    testLabelInput = tf.placeholder(shape=[None, 10], dtype=tf.float32)
    
    # KNN的距离
    f1 = tf.expand_dims(testDataInput, 1)  # 维度扩展
    f2 = tf.subtract(trainDataInput, f1)  # 二者之差
    f3 = tf.reduce_sum(tf.abs(f2), reduction_indices=2)
    f4 = tf.negative(f3)  # 取反
    f5, f6 = tf.nn.top_k(f4, k=k)  # 最大的四个值 f5表示的是数据 f6表示的该数据所处的下标
    f7 = tf.gather(trainLabelInput, f6)  # 根据f6下标去寻找trainLabelInput中对应的标签
    f8 = tf.reduce_sum(f7, reduction_indices=1)
    f9 = tf.argmax(f8, dimension=1)
    
    with tf.Session() as sess:
        p9 = sess.run(f9, feed_dict={trainDataInput: trainData, testDataInput: testData, trainLabelInput: trainLabel})
        p10 = np.argmax(testLabel, axis=1)
        print('预测值:', p9)
        print('真实值:', p10)
    
    j = 0
    for i in range(0, testSize):
        if p10[i] == p9[i]:
            j += 1
    print('accuracy:', j*100/testSize)

     

    作死设置了一回,电脑是游戏本,屏幕出现卡顿,加速球爆满,还好运行出来了 

     

     设置的过高,直接报错,资源耗尽。

     训练集数量和K值该如何确定

    从上图可以看出,trainSize不是设置的越高越好,在满足较高准确率的同时,又不能使计算量过于庞大,需要把握训练数据集的大小。 

    从上图可以看出,K值的设置过大反而会在一定程度上降低预测的准确率 ,所以设置k值时,需要对数据集有一定的了解,并且在一定的范围内取值。

    展开全文
  • KNN实现手写数字识别,包含图片数据,已经实现图片数据与文本数据的转换
  • KNN实现手写数字识别Python

    千次阅读 2017-01-06 09:44:43
    本文章总结了KNN算法字手写数字识别的应用,比较系统的对传统KNN和各种改进的KNN算法进行实现,由于完整的代码量较大(部分代码参考了机器学习实战),不适合全部贴出,但是博主乐于分享,有需要的话可以直接联系我...

    本文章总结了KNN算法字手写数字识别的应用,比较系统的对传统KNN和各种改进的KNN算法进行实现,由于完整的代码量较大(部分代码参考了机器学习实战),不适合全部贴出,但是博主乐于分享,有需要的话可以直接联系我,我会很乐意共享的,一希望大家能帮我校准文章的错误啦~~~


    首先用1500张手写数据进行训练,然后利用500张数字做测试,数据集大家可以搜手写数字识别数据集,网上很多,我过几天也会贴到我的资源库里面,欢迎打家下载,可以用notepad++查看每个数字。

    KNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。算法步骤如下:

    输入:训练数据集T={(x1,y1),(x2,y2),…,(xn,yn)}

    输出:实例x所属的类y

    (1)根据给定距离度量,在训练集T中找出与x最近邻的k个点,涵盖这k个点的x的领域记作Nk(x)

    (2)在Nk(x)中根据分类决策规则(多数表决)决定x的类别y


    4.12 核心代码

    首先构造一个分类起,该分类器接收训练数据集合待测实例,返回待测实例的分类。


    然后从分别从数据文本中获取训练数据集和测试数据集,并调用classifyEU方法,输出结果


    结果如下:



    二、改进距离

            欧氏距离虽然很有用,但也有明显的缺点。它将样品的不同属性(即各指标或各变量)之间的差别等同看待,这一点有时不能满足实际要求。例如,在教育研究中,经常遇到对人的分析和判别,个体的不同属性对于区分个体有着不同的重要性。因此,有时需要采用不同的距离函数。这里采用马氏距离。

    结果如下:


           出乎意料,使用马氏距离后,分类器的效果奇差,错误率达到56%,这显然是不能令人满意的。可能原因是由于马氏距离是把各个特征维度的相关性考虑进去,但是手写数字系统各个维度并没有很大的相关性,并且由于各个维度的取值都只是0和1两种,因此效果非常差,这也说明各个距离都有自己的适用场合,我们需要根据数据的实际意义和特征,选取恰当的距离度量,才能去得良好地效果。


    三、SAHIBSINGH A. DUDANI 等在The Distance-Weighted k-Nearest-Neighbor Rule 中提出一种改进权重的KNN方        法,这里用Python实现看看效果是不是真有那么好,哈哈。

          论文大家可以自己下载:核心思想是距离测试点更近的点应该赋予更大的权值,二距离远的点应该赋予更小的权值。权值公式为


    核心代码:


    运行结果:


    可以看到WKNN算法的错误个数是10,错误率约1.06%,准确率约98.94%,所用时间约49.408秒,准确率相对KNN有所提高,SAHIBSINGH A. DUDANI诚不欺我也~~~


    另外P. Viswanath and T. Hitendra Sarma等在An Improvement to k-Nearest Neighbor Classifier中提出另一种改进KNN方法,经博主实验证明改算法在手写数字识别数据集的准确率可以达到99%+,几乎可以赶上神经网络的正确率了,看来经过捣鼓捣鼓得KNN果然是良心算法呀,简单实用,哈哈。但是该改进算法运算量相对比较大,因为需要对每一个类求K个近邻。


    四、kd-Tree

           实现k近邻法时,主要考虑的问题是如何对训练数据进行快速k近邻搜索,这点在特征空间的维数大以及训练数据容量大时尤其重要。为了提高k近邻搜索的效率,考虑使用特殊的结构存储训练数据,以减少计算距离的次数。通过构造kd_Tree来实现。

            Kd-Tree是一个二叉树,每个节点表示的是一个空间范围。下表表示的是Kd-树中每个节点中主要包含的数据结构。Range域表示的是节点包含的空间范围。Node-data域就是数据集中的某一个n维数据点。分割超面是通过数据点Node-Data并垂直于轴split的平面,分割超面将整个空间分割成两个子空间。令split域的值为i,如果空间Range中某个数据点的第i维数据小于Node-Data[i],那么,它就属于该节点空间的左子空间,否则就属于右子空间。Left,Right域分别表示由左子空间和右子空间空的数据点构成的Kd-Tree。

    核心代码:

    首先创建一个树节点




    运行结果:



           看到这个结果博主心里是蓝瘦香菇的,这哪里改进了运行效率嘛,运行时间分明比不用KD-Tree还长很多,不过博主还是耐心的分析了原因,果然还是有所发现,在运行效率方面,根据经验,kd-Tree只在:特征维数远小于样本数的情况下才是比较平衡的,而该训练数据集特征维数为1024和训练样本数接近,并且每一个维度都只有0和1两个值,因此构造出来的是一个极度不平衡的树,当树完全不平衡的时候其效率和逐个遍历没有什么区别,因此并没有使运行时间效率提升,反而因为需要构造kd-Tree、比较等操作使得运行效率相对较低,由此得到的教训是并不是一个好的算法思路就能拿来用呀,关键还得看场景!场景!场景!





    展开全文
  • kNN实现手写数字识别系统-数据加代码


    前言

    上一节对kNN算法进行了讲解以及代码演示,相必大家对kNN算法已经有了很深入的理解,下面通过手写识别系统实例来测试一下自己学的怎么样吧~


    一、数据

    数据链接放在百度云盘上,想学习的同学可以下载(永久有效)
    链接:https://pan.baidu.com/s/1i5627_TYrmS5KWUQt3sNBw
    提取码:w5mr

    二、步骤

    1.引入库

    from numpy import *
    import operator
    from os import listdir
    import numpy as np
    
    

    2.图片向量化

    #图片向量化,对每个32*32的数字向量化为1*1024
    def img2vector(filename):
        returnVect = zeros((1,1024))#numpy矩阵,1*1024
        fr = open(filename)#使用open函数打开一个文本文件
        for i in range(32):#循环读取文件内容
            lineStr = fr.readline()#读取一行,返回字符串
            for j in range(32):
                returnVect[0,32*i+j] = int(lineStr[j])#循环放入1*1024矩阵中
        return returnVect
    

    测试代码如下

    #>>> import KNN
    #>>> testVector = KNN.img2vector('testDigits/0_13.txt')
    #>>> testVector[0,0:31]
    #>>> testVector[0,32:63]
    

    自行测试~


    2.重中之重

    def handwritingClassTest():
        hwLabels = []#定义一个list,用于记录分类
        trainingFileList = listdir('trainingDigits')#获取训练数据集的目录
        #os.listdir可以列出dir里面的所有文件和目录,但不包括子目录中的内容
        #os.walk可以遍历下面的所有目录,包括子目录
        m = len(trainingFileList)#求出文件的长度
        trainingMat = zeros((m,1024))#训练矩阵,生成m*1024的array,每个文件分配10240
        for i in range(m):#循环,对每个file
            fileNameStr = trainingFileList[i]#当前文件
            #9_45.txt,9代表分类,45表示第45个
            fileStr = fileNameStr.split('.')[0]#首先去掉txt
            classNumStr = int(fileStr.split('_')[0])#然后去掉_,得到分类
            hwLabels.append(classNumStr)#把分类添加到标签上
            trainingMat[i,:] = img2vector('trainingDigits/%s'%fileNameStr)#进行向量化
        testFileList = listdir('testDigits')#处理测试文件
        errorCount = 0.0#计算误差个数
        mTest = len(testFileList)#取得测试文件个数
    
        for k in range(1,20):#遍历不同k对错误率的影响
            errorCount = 0.0
            for i in range(mTest):#遍历测试文件
                fileNameStr = testFileList[i]
                fileStr = fileNameStr.split('.')[0]
                classNumStr = int(fileStr.split('_')[0])
                vectorUnderTest = img2vector('trainingDigits/%s'%fileNameStr)
                #注意下面用到的classify0即是在上一节讲解kNN的时候所写的方法,学习的时候记得放进来
                classifierResult = classify0(vectorUnderTest,trainingMat,hwLabels,k)
                #print('the classifier came back with:%d,the real answer is:%d'%(classifierResult,classNumStr))
                if(classifierResult != classNumStr):errorCount+=1.0
            print('\nthe total number of errors is:%d'%errorCount)
            print('\nthe total rate is:%f'%(errorCount/float(mTest)))
            print('k is {} and the correct rate is{}%'.format(k,(mTest-errorCount)*100/mTest))
    
    

    测试代码如下

    #测试
    #>>> import KNN
    #>>> KNN.handwritingClassTest()
    

    自行测试~

    总结

    这一节通过手写数字识别系统的练习,可以看出k-近邻算法虽然是分类数据最简单最有效的算法,但是如果数据集很大时,实际非常耗时,而且模型不需要训练,也就是说我们不知道实例到底具有什么特征,无法知道数据的基础结构信息。
    欢迎交流~

    展开全文
  • 基于KNN实现手写数字识别C++代码,输出结果有混淆矩阵、召回率、训练准确率、预测数据输出等。
  • 需要下载MNIST数据集,将路径修改为本地MNIST数据集的地址。需要OpenCV与Tensorflow环境
  • ↑ 点击上方【计算机视觉联盟】关注我们本节使用KNN算法实现手写数字识别KNN算法基本原理前边文章已经详细叙述,盟友们可以参考哦!数据集介绍有两个文件:(1)trainingDigit...
  • 基于KNN数字识别 源代码及数据的github地址: https://github.com/w1449550206/KNN-Handwritten-digit-recognition-based-on-KNN 点此可直达 import numpy as np # 图片后缀为bmp import matplotlib.pyplot as plt...
  • 电脑通过串口传给单片机,单片机用KNN算法给出手写数字的预测结果,并且在液晶上显示
  • 所谓KNN就是对那个你要预测的点,找出其k个邻居,也就是距离他最近的k个点,这k个样本中出现频率最高的类别即作为测试样本的类别。 那么,这个距离一般用什么来计算呢? 一般有欧式距离、标准化欧式距离、马氏距离、...
  • KNN算法实现手写数字识别

    万次阅读 多人点赞 2019-03-24 01:58:35
    KNN 最邻近分类算法: (近邻取样) 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是机器学习分类技术中最简单的方法之一。 所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k...
  • SVM和Knn实现手写数字识别

    千次阅读 2017-01-06 23:04:10
    数据和程序下载地址:手写数字识别 调用SVM库实现数字识别# Standard scientific Python imports import matplotlib.pyplot as plt import numpy as np # Import datasets, classifiers and performance metrics ...
  • 在前面已经学习过怎么让kNN训练识别数字,并且进行了测试,如果你想不起的话,可以参考下文: 《在OpenCV里用kNN实现MNIST》 https://blog.csdn.net/caimouse/article/details/104227344 有很多人问我,怎么样...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,615
精华内容 1,446
关键字:

knn实现手写数字识别