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. 【BZOJ】1656:[Usaco2006 Jan]The Grove 树木(bfs+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1656 神bfs! 我们知道,我们要绕这个联通的树林一圈. 那么,我们想,怎么才能让我们的bfs绕一个 ...

  2. PDF解析。。。

    解析出PDF中的文字.用项目名称作Key取对应的值.. 正则匹配 .....:..\n

  3. Bootstrap的下拉菜单float问题

    在学习bootstrap中的下拉菜单时,遇到下面情况: <div class="dropdown"> <button class="btn btn-de ...

  4. Android无线测试之—UiAutomator UiObject API介绍七

    判断对象是否存在 1.判断对象是否存在相关API 返回值 API 描述 boolean waitForExists(long timeout) 等待对象出现 boolean waitUntilGone ...

  5. select标签设置只读的方法(下拉框不可选但可传值)

    1. <select id="s1" name="s1" onfocus="this.defaultIndex=this.selectedInd ...

  6. Python创建数组

    1  创建数组 array函数 >>> a=([1,2],[3,4]) >>> array(a) array([[1, 2], [3, 4]]) arange函数: ...

  7. c++ 类声明

    class B; struct A { B* ptr; }; class B { public: }; int main() { ; } A中定义了B的指针,所以要声明class B,在定义处于不完整 ...

  8. Kotlin——高级篇(五):集合之常用操作符汇总

    在上一篇文章Kotlin--高级篇(四):集合(Array.List.Set.Map)基础中讲解到了数组Array<T>.集合(List.Set.Map)的定义与初始化.但是由于篇幅的原因 ...

  9. 【BZOJ4550】小奇的博弈 博弈论

    [BZOJ4550]小奇的博弈 Description 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色.最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同.   小 ...

  10. textarea 换行

    这个是可以多行展示的Texat也就是DW设计模式下的多行 /*华丽的分割线==================================*/ 当你点击单行时你发现此时的标签换成了value=&q ...