基于Python手写拼音识别
作者:newlw?? 发布时间:2022-10-22 09:24:09
标签:Python,手写,拼音,识别
一、算法构造
1.简单介绍一下knn算法
KNN算法,也叫K最近邻算法。功能是分类。算法逻辑非常简单,说直白点就是:先找到跟你最近的k个邻居(假设k=5),再看你的邻居给哪个类别投票(即邻居的标签),少数服从多数,得票最多的结果就是你的类别。
在这个算法中最关键的三点:
k值 :选择距离最近的k个邻居。
距离计算:计算距离的方法有欧式距离和曼哈顿距离,本文采用欧式距离,即先求差值的平方和,再开根号。
分类标签:本文的分类标签即a,b,c,d等字母
2.Python实现KNN
'''
k:k值
testdata:测试数据集
traindata:训练数据集
labels:分类标签
'''
def knn(k, testdata, traindata, labels):
'''定义算法'''
traindatasize = traindata.shape[0] #计算训练集的长度
dif = tile(testdata,(traindatasize,1)) - traindata #将测试集扩展至训练集的长度,再求差值
sqrdif = dif**2 #求差值的平方
sumsqrdif = sqrdif.sum(axis=1) #求平方和
distance = sumsqrdif**0.5 #再开根号,即所有的距离
sorted_distance = distance.argsort() #对距离进行排序,返回排序后的索引
count = {} #准备一个空字典,存放投票结果
for i in range(0,k):
vote = labels[sorted_distance[i]] #提取索引多对应的标签值作为字典的key
count[vote] = count.get(vote,0)+1 #票数作为字典的value
sorted_count = sorted(count.items(),key=lambda x:x[1],reverse=True) #对最后的投票结果进行排序
return sorted_count[0][0] #返回得票最多的标签
二、准备数据
用最笨的方法,手写了一批png格式的数字图片:
图片的尺寸都是统一的:32*32像素
图片的命名也是统一的:数字标签+"_"+第n张图+“.png"
1、将图片转换成数组矩阵
训练数据集与测试数据集都是标准化后的数组矩阵,而我们的试验对象是手写体数字图片,首先需要将图片进行一下数据化处理。
def img2Model(originDataPath, modelpath):
list = os.listdir(originDataPath)
for child in list:
s_list = os.listdir(originDataPath + child)
for i in s_list:
filepath=originDataPath + child + '/' + i
# print(filepath)
img = cv2.imdecode(np.fromfile(filepath, dtype=np.uint8),0)
img = cv2.resize(img, (32, 32))
img = np.asarray(img)
img[img > 127] = 255
img[img <= 127] = 1
img[img == 255] = 0
dstFileName = modelPath + i.split('.')[0] + '.txt'
np.savetxt(dstFileName, img, fmt='%d', delimiter=' ')
三、处理数据:训练集与测试集
1、区分训练集和测试集
# 随机分拣出测试集,其他文件为训练集
def shutildata(modelpath, trainpath, testpath):
txtlist = os.listdir(modelpath)
index = [random.randint(0, len(txtlist)) for i in range(10)]
# print(index)
arr = [txtlist[i].split('.')[0].split("_")[1] for i in index]
for i in txtlist:
try:
if i.split(".")[0].split("_")[1] in arr:
shutil.copy(modelpath + "/" + i, testpath)
else:
shutil.copy(modelpath + "/" + i, trainpath)
except:
pass
2、加载数据
# 加载数据
def load_data(dataFilePath):
arr = np.loadtxt(dataFilePath, dtype=np.int)
arr = arr.flatten()
return arr
3、建立训练数据
# 建立训练数据集
def makeTrainData(trainpath):
labels = []
trainfile = os.listdir(trainpath)
trainarr = np.zeros((len(trainfile), 1024))
for i in range(0, len(trainfile)):
# print(trainfile[i])
thislabel = trainfile[i].split(".")[0].split("_")[0]
if len(thislabel) != 0:
labels.append(int(thislabel))
trainarr[i, :] = load_data(trainpath + trainfile[i])
return trainarr, labels
四、测试数据
# 验证
def validate(testpath, trainpath, k):
trainarr, labels = makeTrainData(trainpath)
testfiles = os.listdir(testpath)
count = 0
# 读取字典表
with open('num_char.json', 'r') as f:
dict = json.loads(f.read())
# print(dict)
for i in range(0, len(testfiles)):
testpicname = testfiles[i].split("_")[0]
testarr = load_data(testpath + testfiles[i])
result = knn(k, testarr, trainarr, labels)
testpicname = dict[str(testpicname)]
result = dict[str(result)]
print("真正字母:"+testfiles[i] +" " + testpicname + " " + "测试结果为:{}".format(result))
if str(testpicname) == str(result):
count += 1
print("-----------------------------")
print("测试集为:{}个,其中正确了{}个".format(len(testfiles),count))
print("正确率为{}".format(count / len(testfiles)))
print()
来源:https://blog.csdn.net/newlw/article/details/122513002
0
投稿
猜你喜欢
- 这篇文章主要介绍了微信小程序顶部导航栏可滑动并选中放大,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 代码如下:<title>雷锋|优酷-专辑 采集程序</title></head> &
- 当浏览网页时,总有那么一类网站华丽而富有趣味性。在浏览信息的同时,足够让我们眼前一亮。它们在充分融入动画、视频、游戏、甚至是与众不同的交互操
- 前言最近将使用爬虫爬取的链接保存到 mysql 数据库中时,发现我将链接使用 json_encode 保存时候,在数据库中却显示了转义字符,
- php代码很简单:$server="127.0.0.1";println("Begin");$lin
- 是否曾经有过这样的经历:把一个元素置于另一个元素之上,而希望下面的那个元素成为可点击的?现在,利用css的pointer-events属性即
- 关于数据库的逻辑设计,是一个很广泛的问题。本文主要针对开发应用中遇到在MS SQL Server上进行表设计时,对表的主键设计应注意的问题以
- 如何取得刚添加的记录自动增加的ID字段的号码?我们用下面这个程序就行:rs(1)=oldrname &nb
- 今天终于抽出时间瞟了一眼JavaScript的新标准ECMA262v5,让我欣喜的是,不像是因为过于激进而被废除的v4,这个新标准对Java
- 一:操作session1:session配置Session 的配置文件存储在config/session.php中,配置参数有:(1):配置
- 当前记录集不支持更新。这可能是提供程序的限制,也可能是选定锁定类型的限制 问题的解决方法如下:第一:ACC
- RegExp对象的语义和使用:检查字符串匹配获取字符串中的部分内容在原字符串的基础上构建一个新的字符串(包括添加、删除和修改)构建一个Reg
- 摘要:本文介绍了字符与编码的发展过程,相关概念的正确理解。举例说明了一些实际应用中,编码的实现方法。然后,本文讲述了通常对字符与编码的几种误
- Oracle客户端精简后的文件,可以实现数据库的通信,直接和软件打包: 第一步:拷贝文件:主要是四个目录:bin,nls,oracore,N
- 下面展示一下非瀑布流的item布局情况,每个item的高度都是一样的,所以 他的index就是左右左右,position所对应的itemVi
- 在数据库testDB中存在架构A及用户A,现将testDB数据库所属的用户由A改为B,同时删除用户A;架构也由A改为B,删除架构A,操作如下
- 要很好地领会Ajax技术的关键是了解超文本传输协议(HTTP),该协议用来传输网页、图像以及因特网上在浏览器与服务器间传输的其他类型文件。只
- QQ登录Banner增加了剧情的概念之后,已经推出了春节和情人节两期。这之后设想能围绕Banner做的更加丰富,对传统文化的体现也能更为深入
- php屏蔽电话号码中间四位:Method 1:function hidtel($phone){  
- 当然,这些并非真正的定律,而只是一些有益的忠告,使你免陷于使用层时可能的困顿中。原来有九条定律的,我们精简掉一条,还有下面的八条:1. 如果