首先,我们准备了0~9的训练集和测试集,这些手写体全部经过像素转换,用0,1表示,有颜色的区域为0,没有颜色的区域为1。实现代码如下:

# 图片处理
# 先将所有图片转为固定宽高,比如32*,然后再进行处理
from PIL import Image as img f = open('f:/result/weixin.txt', 'a')
im = img.open('f:/data/weixin.jpg')
# im.save('f:/data/weixin.bmp')
length = im.size[] # 长
width = im.size[] # 宽
# k=im.getpixel((,)) #获取图片某个像素的色素
for i in range(, length):
for j in range(, width):
RGB = im.getpixel((i, j))
RGB_SUM = RGB[] + RGB[] + RGB[]
if RGB_SUM == :
# 说明当前位置为黑色
f.write('')
else:
f.write('')
f.write('\n')
f.close()

手写数字体转换为0,1像素矩阵如下:

我们一共准备了1934个训练集和934个测试集,分别为0~9的手写体像素矩阵

基于贝叶斯模型对手写体数字进行识别

贝叶斯模型实现代码:

from numpy import *
from os import listdir class Bayes:
def __init__(self):
self.length = - # 如果未进行训练,则length为-
self.labelcount = dict()
self.vectorcount = dict() def fit(self, dataSet: list, labels: list):
if (len(dataSet) != len(labels)):
raise ValueError("输入的测试数组和类别数组不一致")
self.length = len(dataSet[]) # 测试数据特征值的长度
labelsnum = len(labels) # 所有类别数量
no_repeat_lables = len(set(labels)) # 不重复类别的数量
for item in range(no_repeat_lables):
# 当前类别的数量占总类别数量的比例
self.labelcount[item] = labels.count(item) / labelsnum
for vector, label in zip(dataSet, labels):
if (label not in self.vectorcount):
self.vectorcount[label] = []
self.vectorcount[label].append(vector)
print('训练结束')
return self def btest(self, TestData, labelSet):
if (self.length == -):
raise ValueError("还未进行训练")
# 计算当前testdata分别为各个类别的概率
lbDict = dict()
for thislb in labelSet:
p =
alllabel = self.labelcount[thislb]
allvector = self.vectorcount[thislb]
vnum = len(allvector)
allvector = array(allvector).T
for index in range(, len(TestData)):
vector = list(allvector[index])
p = p * vector.count(TestData[index]) / vnum
lbDict[thislb] = p * alllabel # 当前标签的概率
thislabel = sorted(lbDict, key=lambda x: lbDict[x], reverse=True)[]
return thislabel

之后,我们利用建立好的贝叶斯模型加载训练集、训练模型,实现代码如下:

# 加载数据
def dataToArray(filename):
arr = []
f = open(filename)
for i in range(0, 32):
thisline = f.readline()
for j in range(0, 32):
arr.append(int(thisline[j]))
return arr # 建立一个函数取文件名前缀
def seplabel(fname):
filestr = fname.split(".")[0]
label = int(filestr.split("_")[0])
return label # 建立训练数据
def traindata():
labels = []
trainfile = listdir("f:/data/traindata/")
num = len(trainfile)
# 长度1024(列),每一行存储一个文件
# 用一个数组存储所有训练数据,行:文件总数,列:1024
trainarr = zeros((num, 1024))
for i in range(0, num):
thisfname = trainfile[i]
thislabel = seplabel(thisfname)
labels.append(thislabel)
trainarr[i, :] = dataToArray("f:/data/traindata/" + thisfname)
return trainarr, labels 在对数据进行训练后,我们建立好的模型对测试数据中的手写体""进行测试,实现代码如下: # 抽某一个测试文件出来进行试验
trainarr, labels = traindata()
thistestfile = "8_76.txt"
testarr = dataToArray("f:/data/testdata/" + thistestfile)
b = Bayes()
b.fit(trainarr, labels)
label = b.btest(testarr, labels)
print(label)

结果如下:

结果证明贝叶斯方法可以准确地识别出手写体“8”,接下来我们对贝叶斯方法的精度进行测试,这次我们对所有的测试集进行识别,实现代码如下:

# 识别多个手写体数据
testfile = listdir("f:/data/testdata/")
num = len(testfile)
count = 0
for i in range(0, num):
this_file = testfile[i]
this_label = seplabel(this_file) # 正确的label
test_arr = dataToArray("f:/data/testdata/" + this_file)
result = b.btest(test_arr, labels_all)
if (result == this_label):
count += 1
acc = count / num
print(acc)

结果显示,最终精度为:

实验结果还不错,证明贝叶斯模型的确是一个较好的分类模型

基于KNN模型对手写体数字进行识别

接下来我们使用KNN对手写体数字进行识别,实验控制变量,继续采用之前的测试集和数据集。
首先,我们实现KNN模型:

from numpy import *
import operator
from os import listdir def knn(k, testdata, traindata, labels):
traindatasize = traindata.shape[0]
dif = tile(testdata, (traindatasize, 1)) - traindata # 扩展数组行
sqdif = dif ** 2
sumsqdif = sqdif.sum(axis=1) # 行求和
dis = sumsqdif ** 0.5 # 距离
sort_dis = argsort(dis) # 排序,返回的是索引
count = {}
for i in range(0, k):
vote = labels[sort_dis[i]] # 显示当前类
count[vote] = count.get(vote, 0) + 1 # 统计各类别次数
sortcount = sorted(count.items(), key=operator.itemgetter(1), reverse=True) # 按照降序排列字典
return sortcount[0][0]

然后,我们利用训练集创建KNN模型:

# 加载数据
def dataToArray(filename):
arr = []
f = open(filename)
for i in range(0, 32):
thisline = f.readline()
for j in range(0, 32):
arr.append(int(thisline[j]))
return arr # 取出文件前缀,获得label
def seplabel(filename):
filestr = filename.split(".")[0]
label = int(filestr.split("_")[0])
return label # 建立训练数据
def traindata():
labels = []
trainfile = listdir("f:/data/traindata/")
num = len(trainfile)
# 长度1024(列),每一行存储一个文件
# 用一个数组存储所有训练数据,行:文件总数,列:1024
trainarr = zeros((num, 1024))
for i in range(0, num):
thisfname = trainfile[i]
thislabel = seplabel(thisfname)
labels.append(thislabel)
trainarr[i, :] = dataToArray("f:/data/traindata/" + thisfname)
return trainarr, labels 最后,利用创建的KNN模型对测试集进行测试,同样是测试手写体“8”: #抽某一个测试文件出来进行试验
trainarr,labels=traindata()
thistestfile="8_76.txt"
testarr=dataToArray("f:/data/testdata/"+thistestfile)
rknn=knn(3,testarr,trainarr,labels)
print(rknn)

结果为:

说明KNN模型也可以识别出手写体“8”,接下来我们利用所有测试集求出KNN模型的精度:

#用测试数据调用KNN算法去测试,看是否能够准确识别
def datatest():
trainarr,labels=traindata()
testlist=listdir("f:/data/testdata")
tnum=len(testlist)
count = 0
for i in range(0,tnum):
thistestfile=testlist[i]
this_label = seplabel(thistestfile)
testarr=dataToArray("f:/data/testdata/"+thistestfile)
rknn=knn(3,testarr,trainarr,labels)
if (rknn == this_label):
count += 1
acc = count / tnum
print(acc)

结果为:

基于贝叶斯模型和KNN模型分别对手写体数字进行识别的更多相关文章

  1. 基于贝叶斯网(Bayes Netword)图模型的应用实践初探

    1. 贝叶斯网理论部分 笔者在另一篇文章中对贝叶斯网的理论部分进行了总结,在本文中,我们重点关注其在具体场景里的应用. 2. 从概率预测问题说起 0x1:条件概率预测模型之困 我们知道,朴素贝叶斯分类 ...

  2. 复杂领域的Cynefin模型和Stacey模型

    最近好奇“复杂系统”,收集了点资料,本文关于Cynefin模型和Stacey模型.图文转自互联网后稍做修改. Cynefin模型提供一个从因果关系复杂情度来分析当前情况而作决定的框架,提出有五个领域: ...

  3. Knowledge Tracing -- 基于贝叶斯的学生知识点追踪(BKT)

    目前,教育领域通过引入人工智能的技术,使得在线的教学系统成为了智能教学系统(ITS),ITS不同与以往的MOOC形式的课程.ITS能够个性化的为学生制定有效的 学习路径,通过根据学生的答题情况追踪学生 ...

  4. 三分钟掌控Actor模型和CSP模型

    回顾一下前文<三分钟掌握共享内存模型和 Actor模型> Actor vs CSP模型 传统多线程的的共享内存(ShareMemory)模型使用lock,condition等同步原语来强行 ...

  5. 文本信息检索——布尔模型和TF-IDF模型

    文本信息检索--布尔模型和TF-IDF模型 1. 布尔模型 ​ 如要检索"布尔检索"或"概率检索"但不包括"向量检索"方面的文档,其相应的查 ...

  6. 贫血模型和DDD模型

    贫血模型和DDD模型 1.贫血模型 1.1 概念 常见的mvc三层架构 简单.没有行为 2.领域驱动设计 2.1 概念(2004年提出的) Domain Driven Design 简称 DDD DD ...

  7. 并发编程:Actors 模型和 CSP 模型

    https://mp.weixin.qq.com/s/emB99CtEVXS4p6tRjJ2xww 并发编程:Actors 模型和 CSP 模型 ImportNew 2017-04-27    

  8. Inception模型和Residual模型卷积操作的keras实现

    Inception模型和Residual残差模型是卷积神经网络中对卷积升级的两个操作. 一.  Inception模型(by google) 这个模型的trick是将大卷积核变成小卷积核,将多个卷积核 ...

  9. Actor模型和CSP模型的区别

    引用至:http://www.jdon.com/concurrent/actor-csp.html Akka/Erlang的actor模型与Go语言的协程Goroutine与通道Channel代表的C ...

随机推荐

  1. js中yyyymmdd hh:mm:ss字符转换为Date

    var dateString="20190102 10:30:35"; var pattern = /(\d{4})(\d{2})(\d{2})/; var formatedDat ...

  2. 【游戏体验】Colour My World(让我的世界充满色彩)

    这是一款玩法简单的游戏 但是它给你的感觉不一样 推荐试玩 个人测评 游戏性 7/10 音乐 9/10 剧情 6/10 总评 22/30

  3. Dart语言学习(四)Dart字符串

    一.字符串的创建 使用 单引号,双引号 创建字符串 使用 三个引号或双引号 创建多行字符串 使用 r 创建原始 raw 字符串 String str1 = 'Hello';//"" ...

  4. CentOS6.5_x64卸载系统原有MySQL

    1.查看系统是否存在MySQL的版本 rpm -qa | grep mysql 2.删除老版本的开头文件和库(rpm -e --nodeps XXX) rpm -e --nodeps mysql-5. ...

  5. __dirname和__filename和process.cwd()三者的区别

    1.process cwd() 方法返回 Node.js 进程当前工作的目录 例:我在F:\自己的文件\自己在网上学习的知识点\node学习\node-API\process 这个文件加下面创建了一个 ...

  6. iOS性能优化之内存(memory)优化

    https://www.jianshu.com/p/8662b2efbb23 近期在工作中,对APP进行了内存占用优化,减少了不少内存占用,在此将经验进行总结和分享,也欢迎大家进行交流. 在优化的过程 ...

  7. ios开源

    a http://code.cocoachina.com b http://code4app.com c http://www.oschina.net/ios/codingList/ d github ...

  8. php-cp(php连接池)扩展的安装

    今天看到php有连接池的扩展,不管效果怎么样,都值得一试,这样才会有突破. 先从guthub上搜索源码:[ https://github.com/swoole/php-cp ] 通过命令clone到自 ...

  9. Jmeter_接口串联自动化测试_登录后充值获取cookie

    1.登陆->充值->运行会报错 2,那如何解决这个问题呢,添加HTTP COokie管理器 另外一种方法,登录->提取正则表达式,充值->添加HTTP cookie管理器

  10. redis介绍、单机安装以及java调用

    什么是redis Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库.和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求(非关系型的.分布式的.开源的.水平可扩展 ...