博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第三篇:基于K-近邻分类算法的手写识别系统
阅读量:7047 次
发布时间:2019-06-28

本文共 2858 字,大约阅读时间需要 9 分钟。

前言

       本文将继续讲解K-近邻算法的项目实例 - 手写识别系统。

       该系统在获取用户的手写输入后,判断用户写的是什么。

       为了突出核心,简化细节,本示例系统中的输入为32x32矩阵,分类结果也均为数字。但对于汉字或者别的分类情形原理都是一样的。

       有了前面学习的基础,下面直接进入项目开发步骤。

第一步:收集并准备数据

       在用户主目录的trainingDigits子目录中,存放的是2000个样本数据。

       每个样本一个文件,其中一部分如下所示:

      

       文件命名格式为:

              分类标签_标签内序号

       如 0_20.txt 就表示该样本是分类标签为0的第20个特征集。20就是个序号以区分标签内不同文件而已,没其他意义。

       样本数据都是32x32矩阵:

      

       对于这样的二维数据,如何判断样本和目标对象的距离呢?首先想到的是可以将二维降到一维。

       当然也可以考虑去找找二维的距离求解方法。

       下面给出降维函数:

1 # ============================================== 2 # 输入: 3 #        训练集文件名(含路径) 4 # 输出: 5 #        降维后的样本数据(这里一个文件一份样本数据) 6 # ============================================== 7 def img2vector(filename): 8     '将32x32的矩阵转换为1024一维向量' 9     10     # 初始化返回向量11     returnVect = numpy.zeros((1,1024))12     13     # 打开样本数据文件14     fr = open(filename)15     16     # 降维处理17     for i in range(32):18         lineStr = fr.readline()19         for j in range(32):20             returnVect[0,32*i+j] = int(lineStr[j])21             22     return returnVect

第二步:测试算法

       K临近的分类函数代码在之前的文章中给出了,这里直接调用:

# =================================================# 输入:#        空# 输出:#        对指定的测试集文件,指定的训练集数据进行K近邻分类#        并打印结果信息# =================================================def handwritingClassTest():    '手写数字识别系统测试代码'        # 分类列表    hwLabels = []        # 获取所有训练集文件名    trainingFileList = os.listdir('/home/fangmeng/trainingDigits')        # 定义训练集结构体    m = len(trainingFileList)    trainingMat = numpy.zeros((m, 1024))        for i in range(m):        # 当前训练集文件名        filenameStr = trainingFileList[i]        # 文件名(filenameStr去掉.txt后缀)        fileStr = filenameStr.split('.')[0]        # 分类标签        classNumStr = int(fileStr.split('_')[0])        # 将分类标签加入分类列表        hwLabels.append(classNumStr)        # 将当前训练集文件降维后加入到训练集结构体        trainingMat[i] = img2vector('/home/fangmeng/trainingDigits/%s' % filenameStr)        # 获取所有测试集文件名    testFileList = os.listdir('/home/fangmeng/testDigits')    # 错误分类记数    errorCount = 0    # 测试集文件个数    mTest = len(testFileList)        print "错误的分类结果如下:"    for i in range(mTest):        # 当前测试集文件名        fileNameStr = testFileList[i]        # 文件名(filenameStr去掉.txt后缀)        fileStr = fileNameStr.split('.')[0]        # 分类标签        classNumStr = int(fileStr.split('_')[0])        # 将当前测试集文件降维        vectorUnderTest = img2vector('/home/fangmeng/testDigits/%s' % fileNameStr)        # 对当前测试文件进行分类        classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)                if (classifierResult != classNumStr):             print "分类结果: %d, 实际结果: %d" % (classifierResult, classNumStr)            errorCount += 1.0                print "\n总错误数: %d" % errorCount    print "\n总错误数: %f" % (errorCount/float(mTest))

       运行结果:

      

小结

1. K-邻近算法的本质是用来分类的,要从分类的思想去思考这个算法的运用。

2. 再强调一次K-邻近算法是没有训练过程的,这点和以后学习的其他分类方法,比如决策树对比后就更清楚了。

3. K-邻近算法的效率很低,不论是从时间还是空间上看(单就这个简单项目都跑得很慢)。因此需要学习更多更优化的算法。

4. 有兴趣有时间可以考虑在hadoop/spark集群下实现这个项目或使用该算法的其他类似项目,定能大幅度提升性能。

转载地址:http://spzol.baihongyu.com/

你可能感兴趣的文章
0110-如何给Kerberos环境下的CDH集群添加Gateway节点
查看>>
正火的 Spring Boot 2.0 更新了啥?
查看>>
Kubernetes(K8s)Events介绍(上)
查看>>
Apsara SA系列混合云存储阵列发布
查看>>
携新一代车规级固态激光雷达而来,速腾聚创为助力自动驾驶量产有何新动作?...
查看>>
RStudio: Warning message: Setting LC_CTYPE failed, using "C" 浅析
查看>>
VDSM command failed: The method does not exist / is not available.
查看>>
Netflix Media Database - 起源和数据模型
查看>>
oracle查看执行计划
查看>>
深度强化学习从入门到大师:通过Q学习进行强化学习(第二部分)
查看>>
iptables快速记忆总结
查看>>
专访张银奎:要抓住技术发展趋势,只有不断学习和更新自己?
查看>>
mint-ui 的navbar踩坑记
查看>>
【直播回顾及资料下载】Fusion Design - 企业级UI解决方案揭秘
查看>>
Meta标签大集合
查看>>
Gitea 1.8.0 发布,组织可设置为公开、内部与私有状态
查看>>
Apache Subversion 1.12.0 发布,版本控制系统
查看>>
MyBatis Dynamic SQL 1.1.1 发布,生成动态 SQL 的框架
查看>>
Opera 60 正式发布,代号 Reborn 3
查看>>
《Java8实战》-第十章笔记(用Optional取代null)
查看>>