python实现kNN算法识别手写体数字的示例代码


Posted in Python onAugust 16, 2019

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()

输出结果为:

python实现kNN算法识别手写体数字的示例代码

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编程中的文件操作攻略
Oct 16 Python
深度定制Python的Flask框架开发环境的一些技巧总结
Jul 12 Python
Python利用matplotlib生成图片背景及图例透明的效果
Apr 27 Python
CentOS下使用yum安装python-pip失败的完美解决方法
Aug 16 Python
python操作excel的方法(xlsxwriter包的使用)
Jun 11 Python
用python爬取租房网站信息的代码
Dec 14 Python
对python 多个分隔符split 的实例详解
Dec 20 Python
python函数与方法的区别总结
Jun 23 Python
django中使用Celery 布式任务队列过程详解
Jul 29 Python
Python安装tar.gz格式文件方法详解
Jan 19 Python
python函数中将变量名转换成字符串实例
May 11 Python
Python Opencv轮廓常用操作代码实例解析
Sep 01 Python
python爬虫 爬取超清壁纸代码实例
Aug 16 #Python
Python PO设计模式的具体使用
Aug 16 #Python
python使用sessions模拟登录淘宝的方式
Aug 16 #Python
Django错误:TypeError at / 'bool' object is not callable解决
Aug 16 #Python
Python facenet进行人脸识别测试过程解析
Aug 16 #Python
Python Web框架之Django框架Model基础详解
Aug 16 #Python
pycharm配置git(图文教程)
Aug 16 #Python
You might like
在PHP3中实现SESSION的功能(二)
2006/10/09 PHP
mysql 全文搜索 技巧
2007/04/27 PHP
php利用header函数实现文件下载时直接提示保存
2009/11/12 PHP
php5.2以下版本无json_decode函数的解决方法
2014/05/25 PHP
php操作XML、读取数据和写入数据的实现代码
2014/08/15 PHP
Laravel中前端js上传图片到七牛云的示例代码
2017/09/04 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
JS 页面自动加载函数(兼容多浏览器)
2009/05/18 Javascript
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
了解Javascript的模块化开发
2015/03/02 Javascript
jQuery对JSON数据进行排序输出的方法
2015/06/24 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(二)
2016/05/17 Javascript
jQuery简单实现点击文本框复制内容到剪贴板上的方法
2016/08/01 Javascript
浅谈Node.js 中间件模式
2018/06/12 Javascript
基于nodejs的微信JS-SDK简单应用实现
2019/05/21 NodeJs
element的el-table中记录滚动条位置的示例代码
2019/11/06 Javascript
有趣的JavaScript隐式类型转换操作实例分析
2020/05/02 Javascript
[01:33]完美世界DOTA2联赛PWL S3 集锦第二期
2020/12/21 DOTA
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
2015/03/30 Python
Python判断两个对象相等的原理
2017/12/12 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
浅谈TensorFlow中读取图像数据的三种方式
2020/06/30 Python
python简单实现9宫格图片实例
2020/09/03 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
The North Face北面美国官网:美国著名户外品牌
2018/09/15 全球购物
Hammitt官网:设计师手袋
2020/05/23 全球购物
会计专业毕业生自我鉴定
2013/10/29 职场文书
女子职高个人自荐书
2014/02/01 职场文书
个人简历自我评价
2014/02/02 职场文书
社会公德演讲稿
2014/05/20 职场文书
篮球比赛口号
2014/06/10 职场文书
干部四风问题整改措施思想汇报
2014/10/13 职场文书