1。总体概要

kNN算法已经在上一篇博客中说明。对于要处理手写体数字,需要处理的点主要包括:

(1)图片的预处理:将png,jpg等格式的图片转换成文本数据,本博客的思想是,利用图片的rgb16进制编码(255,255,255)为白色,(0,0,0)为黑色,获取图片大小后,逐个像素进行判断分析,当此像素为空白时,在文本数据中使用0来替换,反之使用1来替换。

from PIL import Image

'''将图片转换成文档,使用0,1分别替代空白和数字'''

pic = Image.open('/Users/wangxingfan/Desktop/1.png')

path = open('/Users/wangxingfan/Desktop/1.txt','a')

width = pic.size[0]

height = pic.size[1]

for i in range(0,width):

for j in range(0,height):

c_RGB = pic.getpixel((i,j))#获取该像素所对应的RGB值

if c_RGB[0]+c_RGB[1]+c_RGB[2]>0:#白色

path.write('0')

elif c_RGB[0]+c_RGB[1]+c_RGB[2]==0:#黑色

path.write('1')

else:

pass

path.write('\n')

path.close()

(2)训练集的构建。首先想到的是将(1)中图片处理后的文本数据构建成list形式,所以训练集将是二维数组,形如[[1,0,1,1,0,,,,,0,1],[0,1,1,1,10,,,,],[0,0,1,0,,,],,,,,]所以我们构建函数处理训练集数据。

2。代码

简单的总结这个算法,就是将测试数据向量化,逐个和同样向量化的训练数据进行kNN运算,求的最短距离出现最多的分类就是我们要的分类。建立训练集的过程就是将文件数据向量化的过程。

#!/user/bin/env python

#-*- coding:utf-8 -*-

from os import listdir#获取文件目录下所有文件

'''

from PIL import Image

#将图片转换成文档,使用0,1分别替代空白和数字

pic = Image.open('/Users/wangxingfan/Desktop/1.png')

path = open('/Users/wangxingfan/Desktop/1.txt','a')

width = pic.size[0]

height = pic.size[1]

for i in range(0,width):

for j in range(0,height):

c_RGB = pic.getpixel((i,j))#获取该像素所对应的RGB值

if c_RGB[0]+c_RGB[1]+c_RGB[2]>0:#白色

path.write('0')

elif c_RGB[0]+c_RGB[1]+c_RGB[2]==0:#黑色

path.write('1')

else:

pass

path.write('\n')

path.close()

'''

import numpy as np

import operator as opt

def kNN(dataSet, labels, testData, k):

'''首先明确列表不能想加减,dataSet是数组形式,而对于下面的test函数,testData只是一列,相当于列表,所以在进行加减时,需要将其转换为数组,我们使用np下的tile函数来实现'''

testDatasize = dataSet.shape[0]#获取dataSet的总行数

dataSet = dataSet.astype('float64')#不进行转换则报错

testData1 = np.tile(testData,(testDatasize,1))#使用tile函数返回多个重复构成的数组

testData1 = testData1.astype('float64')

distSquareMat = (dataSet - testData1) ** 2 # 计算差值的平方

distSquareSums = distSquareMat.sum(axis=1) # 求每一行的差值平方和,axis=0则按列计算

distances = distSquareSums ** 0.5 # 开根号,得出每个样本到测试点的距离

sortedIndices = distances.argsort() # 排序,得到排序后的下标

indices = sortedIndices[:k] # 取最小的k个

labelCount = {} # 存储每个label的出现次数,出现次数最多的就是我们要选择的类别

for i in indices:

label = labels[i]

labelCount[label] = labelCount.get(label, 0) + 1 # 次数加一,使用字典的get方法,第一次出现时默认值是0

sortedCount = sorted(labelCount.items(), key=opt.itemgetter(1), reverse=True) # 对label出现的次数从大到小进行排序

return sortedCount[0][0] # 返回出现次数最大的label

#定义函数读取某个文件,返回该文件组成的数组

def file_data(fname):

arr = []

path = open(fname)

for i in range(0,32):

line = path.readline()

for j in range(0,32):

arr.append(line[j])

return arr

#建立训练数据集

def train_data():

lables = []

file_list = listdir('/学习/视频课程/源码/第7周/testandtraindata/traindata/')

trainarr = np.zeros((len(file_list),1024))

for i in range(0,len(file_list)):

file = '/学习/视频课程/源码/第7周/testandtraindata/traindata/'+file_list[i]

lables.append(file_list[i].split('_')[0])#获取对应的文件类别

trainarr[i,:] = file_data(file)#取所有列的第一个数据

return trainarr,lables

#测试函数

def test():

j = 0

k = 0

trainarr,lables = train_data()

testdata_list = listdir('/学习/视频课程/源码/第7周/testandtraindata/testdata/')

for i in range(0,len(testdata_list)):#逐个去测试

testfile = '/学习/视频课程/源码/第7周/testandtraindata/testdata/'+testdata_list[i]

testdata1 = file_data(testfile)

result = kNN(trainarr,lables,testdata1,k=3)

print(result+',real_number:'+testdata_list[i].split('_')[0])

if result == testdata_list[i].split('_')[0]:

j +=1

else:

k +=1

print('辨识成功率:'+j/(k+j))

test()

输出结果为:

3。几个知识点代码说明

(1)numpy.tile

p = np.array([0,0,0])

np.tile(p,(3,1))#表示columns方向重复三次,index方向不变

Out[12]:

array([[0, 0, 0],

[0, 0, 0],

[0, 0, 0]])

np.tile(p,(1,3))#表示index方向重复三次,行还是一行

Out[13]: array([[0, 0, 0, 0, 0, 0, 0, 0, 0]])

(2)array[1,:]表示取所有列的第【索引1】个数据(也就是第二行数据)

a = np.array([[1,1,1],[2,2,2],[3,3,3],[4,4,4]])

a[1,:]

Out[21]: array([2, 2, 2])

a[:,1]#所有行的第二列数据

Out[22]: array([1, 2, 3, 4])

(3)list并不能进行加减计算,需要使用numpy将数据转换为数组形式,且在使用例如:arr1+arr2时,需要两个数组的维度相同,在某个纬度上的数据长度也相同。

(4)使用os模块下的listdir,可以显示所有该文件夹下的文件,以列表的形式返回。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

python手机代码识别数字_python实现kNN算法识别手写体数字的示例代码相关推荐

  1. 基于KNN算法的手写体数字识别

    基于KNN算法的手写体数字识别 KNN分类算法是一种经典的分类算法,属于懒惰学习算法的一种. 1.算法原理 工作原理:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道 ...

  2. python怎么爬网站视频教程_python爬虫爬取某网站视频的示例代码

    把获取到的下载视频的url存放在数组中(也可写入文件中),通过调用迅雷接口,进行自动下载.(请先下载迅雷,并在其设置中心的下载管理中设置为一键下载) 实现代码如下: from bs4 import B ...

  3. python中if else语句_python 中if else 语句的作用及示例代码

    引入:if-else的作用,满足一个条件做什么,否则做什么. if-else语句语法结构 if 判断条件: 要执行的代码 else: 要执行的代码 判断条件:一般为关系表达式或bool类型的值 执行过 ...

  4. python源码脚本实例_python编写一个会算账的脚本的示例代码

    python算账脚本 1.假如小明卡里有10000元去商场买东西发现钱不够又向父母借了5000账单如下 2.以下脚本就能实现上面的运算 from time import strftime import ...

  5. 【OpenCV/C++】KNN算法识别数字的实现原理与代码详解

    KNN算法识别数字 一.KNN原理 1.1 KNN原理介绍 1.2 KNN的关键参数 二.KNN算法识别手写数字 2.1 训练过程代码详解 2.2 预测分类的实现过程 三.KNN算法识别印刷数字 2. ...

  6. 课程设计(毕业设计)—基于机器学习KNN算法手写数字识别系统—计算机专业课程设计(毕业设计)

    机器学习KNN算法手写数字识别系统 下载本文手写数字识别系统完整的代码和课设报告的链接(或者可以联系博主koukou(壹壹23七2五六98),获取源码和报告):https://download.csd ...

  7. OpenCV-Python实战(番外篇)——利用 KNN 算法识别手写数字

    OpenCV-Python实战(番外篇)--利用 KNN 算法识别手写数字 前言 手写数字数据集 MNIST 介绍 基准模型--利用 KNN 算法识别手写数字 改进模型1--参数 K 对识别手写数字精 ...

  8. python计算时间差代码_Python3显示当前时间、计算时间差及时间加减法示例代码...

    Python3显示当前时间.计算时间差及时间加减法示例代码 摘要 在使用Python写程序时,经常需要输出系统的当前时间以及计算两个时间之间的差值,或者将当前时间加减一定时间(天数.小时.分钟.秒)来 ...

  9. Python 手写机器学习最简单的 kNN 算法

    https://www.toutiao.com/a6698919092876739079/ Python 手写机器学习最简单的 kNN 算法 苏克1900 Python爬虫与数据挖掘 本文 3000 ...

最新文章

  1. 寻找优秀的程序员之实战指南-1
  2. 你管这破玩意叫哨兵?
  3. Werkzeug源码阅读笔记(四)
  4. 使用 Contour 接管 Kubernetes 的南北流量
  5. 中公教育计算机网络,计算机考试题库:计算机网络模拟练习题(2)
  6. 构造代码块会想你所想
  7. 2.myql数据导入到solr,并建立solr索引(学习笔记)
  8. [Node.js] 模块化 -- path路径模块
  9. Nginx编译-安装-配置-优化实践总结
  10. Summary on deep learning framework --- Torch7
  11. java滑杆和进度条_HTML5实现自带进度条和滑块滑杆效果
  12. 陈伊力:手游将会出现更多同步交互类游戏
  13. Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)
  14. 番茄时间管理——规则
  15. pc station v15 博图_PC STATION下载报错-工业支持中心-西门子中国
  16. 机械学习基础以及在pynq-Z2上部署Faster-RCNN的项目学习3
  17. 自动化工具之SelendroidRobotium
  18. 完美代码(让你编出无懈可击的完美代码)
  19. 当创新面对“顾客是上帝”和“市场调查”之类
  20. 为何说买5G手机只能买iPhone,不能买国产5G手机?

热门文章

  1. php修改音频文件_解析用PHP读写音频文件信息的详解(支持WMA和MP3)
  2. 主板怎么开启csm_华擎Z490主板移植AMD SAM加速技术:游戏性能提升最多11.5%
  3. pythontkinter在一块区域中绘图_用Python中的tkinter模块作图(续)
  4. java图书馆管理系统_六天写出来的基于Swing的图书管理系统你不来吐槽一下?
  5. 【JUC并发编程11】线程池
  6. Dubbo 一篇文章就够了:Dubbo遇到初恋
  7. shiro教程(1)-基于url权限管理
  8. 表单开发(二):获取单选按钮,多行文本框,下拉菜单,捆绑元素数据,用户注册
  9. Junit单元测试遇到的initializationerror:method initializationerror not found
  10. Android中用图片自定义一个进度条(实现蒙板效果)