KNN算法实现数字识别

KNN算法介绍

KNN算法(K-NearestNeighor Algorithm) 是一种最简单的分类算法。

算法核心:

假设在一个二维坐标平面中已经有了\(n\)个点,每个点的颜色已知,现在给定查询点\(p\)的坐标\((x,y)\),判断\(p\)的颜色。

对于已知的\(n\)个点,计算每个点和点\(p\)的欧几里得距离:

\[dis_i=\sqrt{(x_i-x)^2+(y_i-y)^2}\]

按照\(dis\)从小到大排序,选择距离最近的前\(k\)个点,在这前k个点中统计颜色出现次数最多的点,则点\(p\)的颜色就被划分为该点的颜色。

数字识别的实现

已有的数据集(TraingData):

若干份txt文件,每份txt文件都是32*32的01矩阵,代表对应的数字,下图中的矩阵就是数字0:

若干份txt文件,是测试数据集,用于校验算法的正确率。

算法流程:

  1. 将32x32的矩阵转换成1x1024的向量
  2. 计算输入的数据向量和所有的训练集向量的欧几里得距离。
  3. 按照欧几里得距离排序,选前K近的,选择出现次数最多的作为数字。
  4. 计算正确率

代码:

import numpy as np
import os
import operator
#返回inputdata所属的种类
def KNN(inputdata,TrainingSet,lable,k):
    m=TrainingSet.shape[0] #训练集大小
    difmaze=np.tile(inputdata,(m,1))-TrainingSet #距离矩阵,第i行代表inputdata与第i个训练样例的距离
    sqdifmaze=difmaze ** 2## 距离的平方
    sqsum=sqdifmaze.sum(axis=1) ## 计算每一行的和
    distance=sqsum ** 0.5 ## 欧几里得距离
    sorteddistanceID=distance.argsort() ## 欧几里得距离从小到大排序后的下标
    classcount={} ## 计数器
    for i in range(k): ## 前k近的lable
        nowlable=lable[sorteddistanceID[i]] ##对每个label计数
        classcount[nowlable]=classcount.get(nowlable,0)+1
    sortedClasscount=sorted(classcount.items(),key=operator.itemgetter(1),reverse=True)
    return sortedClasscount[0][0] ## 返回出现次数最多的
# 对每个32*32的数字向量化为1*1024的向量
def Vectorfy(filename):
    vec=[]
    fr=open(filename)
    for i in range(32):
        lineStr=fr.readline()
        for j in range(32):
            vec.append(int(lineStr[j]))
    return vec;
def Getlable(filename):
    return filename[0]
# 获取训练集
def TrainingSet():
    Label=[]
    traininglst=os.listdir('trainingDigits')
    m=len(traininglst)
    trainingmat=np.zeros((m,1024))# 训练矩阵
    for i in range(m):
        filenamestr=traininglst[i]
        Label.append(Getlable(filenamestr))
        trainingmat[i,:]=Vectorfy('trainingDigits/%s' %filenamestr)
    return Label,trainingmat
def Test():#测试测试集
    testlst=os.listdir('testDigits')
    n=len(testlst)
    Lable=[]
    testmat=np.zeros((n,1024))
    for i in range(0,n):
        filenamestr=testlst[i]
        Lable.append(Getlable(filenamestr))
        testmat[i,:]=Vectorfy('testDigits/%s' %filenamestr)
    return Lable,testmat
testlable,testmat=Test()
trainlabel,trainingmat=TrainingSet()
n=testmat.shape[0]
for k in range(1,20):
    err=0.0
    for i in range(n):
        actlable=KNN(testmat[i],trainingmat,trainlabel,k)
        #print("The correct answer is %d and the actual answer is %d" %(int(testlable[i]),int(actlable)))
        if(testlable[i]!=actlable):
            err+=1
    print('k is {} and the correct rate is {}%'.format(k,(n-err)*100/n))

不同K下的正确率

原文地址:https://www.cnblogs.com/codancer/p/12254803.html

时间: 2024-11-08 21:40:21

KNN算法实现数字识别的相关文章

机器学习(二)-kNN手写数字识别

一.kNN算法 1.kNN算法是机器学习的入门算法,其中不涉及训练,主要思想是计算待测点和参照点的距离,选取距离较近的参照点的类别作为待测点的的类别. 2,距离可以是欧式距离,夹角余弦距离等等. 3,k值不能选择太大或太小,k值含义,是最后选取距离最近的前k个参照点的类标,统计次数最多的记为待测点类标. 4,欧式距离公式: 二.关于kNN实现手写数字识别 1,手写数字训练集测试集的数据格式,本篇文章说明的是<机器学习实战>书提供的文件,将所有数字已经转化成32*32灰度矩阵. 三.代码结构构成

[机器学习案例1]基于KNN手写数字识别

算法介绍 之前已经介绍过,简单来说,K-NN可以看成:有那么一堆你已经知道分类的数据,然后当一个新数据进入的时候,就开始跟训练数据里的每个点求距离,然后挑离这个训练数据最近的K个点看看这几个点属于什么类型,然后用少数服从多数的原则,给新数据归类. 算法步骤: 算法步骤: 1. step.1-初始化距离为最大值 2. step.2-计算未知样本和每个训练样本的距离dist 3. step.3-得到目前K个最临近样本中的最大距离maxdist 4. step.4-如果dist小于maxdist,则将

机器学习KNN实例之数字识别

原文地址:https://www.cnblogs.com/tjp40922/p/10409767.html

Python 手写数字识别-knn算法应用

在上一篇博文中,我们对KNN算法思想及流程有了初步的了解,KNN是采用测量不同特征值之间的距离方法进行分类,也就是说对于每个样本数据,需要和训练集中的所有数据进行欧氏距离计算.这里简述KNN算法的特点: 优点:精度高,对异常值不敏感,无数据输入假定 缺点:计算复杂度高,空间复杂度高 适用数据范围:数值型和标称型(具有有穷多个不同值,值之间无序)    knn算法代码: #-*- coding: utf-8 -*- from numpy import * import operatorimport

运用kNN算法识别潜在续费商家

背景与目标 Youzan 是一家SAAS公司,服务于数百万商家,帮助互联网时代的生意人私有化顾客资产.拓展互联网客群.提高经营效率.现在,该公司希望能够从商家的交易数据中,挖掘出有强烈续费倾向的商家,并提供更优质更有针对性的服务. 目标: 从商家交易数据中识别有强烈续费倾向的商家. 思路与建模 kNN是一种思路简单清晰的有点近似蛮力的机器学习算法.它将待分类数据的特征值集与已分类数据集的每个样本的特征值集进行比较,计算出距离值,然后根据距离最小原则,选择k个距离最小的已分类实例,从这k个已分类实

BP神经网络(手写数字识别)

1实验环境 实验环境:CPU [email protected],内存8G,windows10 64位操作系统 实现语言:python 实验数据:Mnist数据集 程序使用的数据库是mnist手写数字数据库,数据库有两个版本,一个是别人做好的.mat格式,训练数据有60000条,每条是一个784维的向量,是一张28*28图片按从上到下从左到右向量化后的结果,60000条数据是随机的.测试数据有10000条.另一个版本是图片版的,按0~9把训练集和测试集分为10个文件夹.这里选取.mat格式的数据

KNN分类算法实现手写数字识别

需求: 利用一个手写数字"先验数据"集,使用knn算法来实现对手写数字的自动识别: 先验数据(训练数据)集: ?数据维度比较大,样本数比较多. ? 数据集包括数字0-9的手写体. ?每个数字大约有200个样本. ?每个样本保持在一个txt文件中. ?手写体图像本身的大小是32x32的二值图,转换到txt文件保存后,内容也是32x32个数字,0或者1,如下: 数据集压缩包解压后有两个目录:(将这两个目录文件夹拷贝的项目路径下E:/KNNCase/digits/) ?目录trainingD

kNN算法python实现和简单数字识别

kNN算法 算法优缺点: 优点:精度高.对异常值不敏感.无输入数据假定 缺点:时间复杂度和空间复杂度都很高 适用数据范围:数值型和标称型 算法的思路: KNN算法(全称K最近邻算法),算法的思想很简单,简单的说就是物以类聚,也就是说我们从一堆已知的训练集中找出k个与目标最靠近的,然后看他们中最多的分类是哪个,就以这个为依据分类. 函数解析: 库函数 tile() 如tile(A,n)就是将A重复n次 a = np.array([0, 1, 2]) np.tile(a, 2) array([0,

基于python Knn 算法识别手写数字,计算准确率 ——第二弹

大家好~ 可爱的我又来了~ 今天我会分享一个简单的Knn算法实例,是小白的必备实例! 开始喽~ 首先我是用Jupyter新建的一个python文件 并且在相同文件夹中放了一个‘data’的图片文件夹里面从0-9个有5000张图片. 接下来是代码部分: 这是需要引用的部分数据包 建立X,y两个集合 digit =  cv2.imread('./data/%d/%d_%d.bmp'%(i,i,j)) #读取图片的位置 下面代码是转换数据类型 下面是输出结果 就这些啦!虽然还点粗糙但是我会努力哒~ 原