1. #!/usr/bin/python
  2. #coding:utf-8
  3. import numpy as np
  4. import operator
  5. import matplotlib
  6. import matplotlib.pyplot as plt
  7. import os
  8. '''''
  9. KNN算法
  10. 1. 计算已知类别数据集中的每个点依次执行与当前点的距离。
  11. 2. 按照距离递增排序。
  12. 3. 选取与当前点距离最小的k个点
  13. 4. 确定前k个点所在类别的出现频率
  14. 5. 返回前k个点出现频率最高的类别作为当前点的预测分类
  15. '''
  16. '''''
  17. inX为要分类的向量
  18. dataSet为训练样本
  19. labels为标签向量
  20. k为最近邻的个数
  21. '''
  22. def classify0(inX , dataSet , labels , k):
  23. dataSetSize = dataSet.shape[0]#dataSetSize为训练样本的个数
  24. diffMat = np.tile(inX , (dataSetSize , 1)) - dataSet#将inX扩展为dataSetSize行,1列
  25. sqDiffMat = diffMat**2
  26. sqDistances = sqDiffMat.sum(axis=1)
  27. distances = sqDistances**0.5
  28. sortedDistIndicies = distances.argsort()#返回的是元素从小到大排序后,该元素原来的索引值的序列
  29. classCount = {}
  30. for i in range(k):
  31. voteIlabel = labels[sortedDistIndicies[i]]#voteIlabel为类别
  32. classCount[voteIlabel] = classCount.get(voteIlabel,0)+1#如果之前这个voteIlabel是有的,那么就返回字典里这个voteIlabel里的值,如果没有就返回0
  33. sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)#key=operator.itemgetter(1)的意思是按照字典里的第一个排序,{A:1,B:2},要按照第1个(AB是第0个),即‘1’‘2’排序。reverse=True是降序排序
  34. print sortedClassCount
  35. return sortedClassCount[0][0]
  36. '''''
  37. 将图像转换为1*1024的向量
  38. '''
  39. def img2vector(filename):
  40. returnVect = np.zeros((1,1024))
  41. fr = open(filename)
  42. for i in range(32):
  43. line = fr.readline()
  44. for j in range(32):
  45. returnVect[0,i*32+j] = int(line[j] )
  46. return returnVect
  47. '''''
  48. 手写体识别系统测试
  49. '''
  50. def handwritingClassTest(trainFilePath,testFilePath):
  51. hwLabels = []
  52. trainingFileList = os.listdir(trainFilePath)
  53. m=len(trainingFileList)
  54. trainSet = np.zeros((m,1024))
  55. for i in range(m):
  56. filename = trainingFileList[i]
  57. classNum = filename.split('.')[0]
  58. classNum = int(classNum.split('_')[0])
  59. hwLabels.append(classNum)
  60. trainSet[i] = img2vector( os.path.join(trainFilePath,filename) )
  61. testFileList = os.listdir(testFilePath)
  62. errorCount = 0
  63. mTest = len(testFileList)
  64. for i in range(mTest):
  65. filename = trainingFileList[i]
  66. classNum = filename.split('.')[0]
  67. classNum = int(classNum.split('_')[0])
  68. vectorUnderTest = img2vector(os.path.join(trainFilePath, filename))
  69. classifyNum = classify0(vectorUnderTest,trainSet,hwLabels,10)
  70. print "the classifier came back with : %d , the real answer is : %d"% (classifyNum , classNum)
  71. if(classifyNum != classNum) : errorCount+=1
  72. print ("\nthe total number of error is : %d"%errorCount)
  73. print ("\nthe error rate is : %f"%(float(errorCount)/mTest))
  74. handwritingClassTest()

使用KNN算法手写体识别的更多相关文章

  1. KNN 算法-实战篇-如何识别手写数字

    公号:码农充电站pro 主页:https://codeshellme.github.io 上篇文章介绍了KNN 算法的原理,今天来介绍如何使用KNN 算法识别手写数字? 1,手写数字数据集 手写数字数 ...

  2. 机器学习实战(笔记)------------KNN算法

    1.KNN算法 KNN算法即K-临近算法,采用测量不同特征值之间的距离的方法进行分类. 以二维情况举例:         假设一条样本含有两个特征.将这两种特征进行数值化,我们就可以假设这两种特种分别 ...

  3. KNN算法实现手写体区分

    KNN算法在python里面可以使用pip install指令安装,我在实现之前查看过安装的KNN算法,十分全面,包括了对于手写体数据集的处理.我这里只是实现了基础的识别方法,能力有限,没有数据处理方 ...

  4. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

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

    kNN算法 算法优缺点: 优点:精度高.对异常值不敏感.无输入数据假定 缺点:时间复杂度和空间复杂度都很高 适用数据范围:数值型和标称型 算法的思路: KNN算法(全称K最近邻算法),算法的思想很简单 ...

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

    在上一篇博文中,我们对KNN算法思想及流程有了初步的了解,KNN是采用测量不同特征值之间的距离方法进行分类,也就是说对于每个样本数据,需要和训练集中的所有数据进行欧氏距离计算.这里简述KNN算法的特点 ...

  7. 机器学习--kNN算法识别手写字母

    本文主要是用kNN算法对字母图片进行特征提取,分类识别.内容如下: kNN算法及相关Python模块介绍 对字母图片进行特征提取 kNN算法实现 kNN算法分析 一.kNN算法介绍 K近邻(kNN,k ...

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

    背景与目标 Youzan 是一家SAAS公司,服务于数百万商家,帮助互联网时代的生意人私有化顾客资产.拓展互联网客群.提高经营效率.现在,该公司希望能够从商家的交易数据中,挖掘出有强烈续费倾向的商家, ...

  9. KNN算法识别手写数字

    需求: 利用一个手写数字“先验数据”集,使用knn算法来实现对手写数字的自动识别: 先验数据(训练数据)集: ♦数据维度比较大,样本数比较多. ♦ 数据集包括数字0-9的手写体. ♦每个数字大约有20 ...

随机推荐

  1. 《linux 内核全然剖析》 include/asm/io.h

    include/asm/io.h #define outb(value,port) \ __asm__ ("outb %%al,%%dx"::"a" (valu ...

  2. Accept-Encoding 使用

    [总结] 想要获得正确网页内容,而非乱码的话,就有两种方式了: 1.不要设置Accept-Encoding的Header //req.Headers.Add("Accept-Encoding ...

  3. php源码,php网站源码,php源码下载

    网址:http://www.aspku.com/php/ 有时间,可以研究研究.

  4. java网络编程1-查询Internet地址

    //经过dns查询后的结果会缓存起来,成功结果永久缓存,失败结果会缓存10s,通过下面的方法设置成功和失败的缓存时间 // 0为不缓存,-1为永不过期,其它单位为s Security.setPrope ...

  5. 5、手把手教React Native实战之盒子模型BoxApp

    用HTML5和React Native分别实现盒子模型显示 写法不一样: 1.样式 ![样式不同](http://image17-c.poco.cn/mypoco/myphoto/20160323/0 ...

  6. svn管理的项目迁移到tfs

    1.将.vs  .svn文件夹删除 2.连接tfs,签入代码

  7. 53、Gif 控件GifView 的使用,播放gif图片

    GifView 是一个为了解决android中现在没有直接显示gif的view,只能通过mediaplay来显示这个问题的项目,其用法和 ImageView一样,支持gif图片.可监视GIF是否加载成 ...

  8. Visual Studio 2010 如何改用 Beyond Compare 作为 TFS 的比较工具

    Beyond Compare 是一套非常实用的文件及文件夹比较软件,不仅可以快速比较出两个文件夹的不同之处,还可以详细的比较文件之间的内容差异.最近改用 TFS 进行版本控管之后,说实在的还是习惯使用 ...

  9. 巨蟒python全栈开发-第5天 字典&集合

    今日大纲: 1.什么是字典 字典是以key:value的形式来保存数据,用{}表示. 存储的是key:value 2.字典的增删改查(重点) (1) 添加 dic[新key] = 值 setdefau ...

  10. shell输出颜色

    #!/bin/bash # #下面是字体输出颜色及终端格式控制 #字体色范围:- echo -e "\033[30m 黑色字 \033[0m" echo -e "\033 ...