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. css position float (写的相当好)

    对CSS中的Position.Float属性的一些深入探讨 对于Position.Float我们在平时使用上可以说是使用频率非常高的两个CSS属性,对于这两个属性的使用上面可能大多数人存在一些模糊与不 ...

  2. Java安全API

    java提供了完整的密码学API,我们可以结合密码学相关的概念来系统的学习这些API. 1.密码学简介(crypto) 密码学通俗来说就是研究如何对信息进行加密和破密,如果不是专门研究信息安全,通常我 ...

  3. spotlight on windows 监控

    1. spotlight on windows 安装 下载 https://pan.baidu.com/s/1qYi3lec Spotlight大家可以从其官方网站(http://www.quest. ...

  4. Duilib教程-自动布局3-分隔条

    先看一个常用的图,如下: 左边是导航栏,右边是信息区. 中间可以自由拉伸. XML如下: <?xml version="1.0" encoding="utf-8&q ...

  5. hdu1814(2-SAT)

    2-SAT 求出可能的解,但是这个解要是字典序最小的,所以只能采用2-SAT基本思想来解. 从小到大开始,对一个可能的点染色,染为1,然后dfs其所有能到达的点,如果其中出现一个已经标号为-1的话,那 ...

  6. 【APIO2014】Palindromes

    #103. [APIO2014]Palindromes 统计 描述 提交 自定义测试 给你一个由小写拉丁字母组成的字符串 ss.我们定义 ss 的一个子串的存在值为这个子串在 ss 中出现的次数乘以这 ...

  7. python之MySQL学习——数据查询

    import pymysql as ps # 打开数据库连接 db = ps.connect(host='localhost', user='root', password='123456', dat ...

  8. Fiddler 抓包工具使用详解

    博客园 首页 新随笔 联系 订阅 管理 随笔 - 20  文章 - 0  评论 - 64 Fiddler 抓包工具总结 阅读目录 1. Fiddler 抓包简介 1). 字段说明 2). Statis ...

  9. 006-基于hyperledger fabric1.4( 官方文档)编写第一个应用【外部nodejs调用】

    一.概述 官方原文地址 Writing Your First Application如果对fabric网络的基本运行机制不熟悉的话,请看这里. 注意:本教程是对fabric应用以及如何使用智能合约的简 ...

  10. spawn 和 exec 的区别(转载)

    众所周知,Node.js在child_process模块中提供了spawn和exec这两个方法,用来开启子进程执行指定程序.这两个方法虽然目的一样,但是既然Node.js为我们提供了两个方法,那它们之 ...