Python徒手实现识别手写数字—对图片结果进行加权处理

简单的加权算法

写在前面

距离上一次更新已经很久远了,所以这一次趁着放假就把全部补完,这一次主要写的地方是针对上一章我们得出的排名来进行一个加权处理,令最后的结果更可信一点。

因为加权的方法种类繁多,所以我这里只是简单的自己随意“创造”了一种方法,主要目的还是训练编程能力,所以如果在逻辑方面上存在某些缺陷的话还望见谅。

方法概要

接着上一篇文章,我们得到了距离某一个待检测图片A1最近的十个训练用图片B1, B2, ...,B10。如果通过直接观察,我们通常情况下可以自己分析出这个图片上的数字很有可能是几。

比如说我举个例子,这十个图片上的数字分别为:3, 1, 1, 2, 1, 4, 1, 1, 2, 3.如果我们看第一名可以知道是3,但是在这十个数字中出现频率最高的是1,并且还占据挺靠前的位置,另一个3是出现在最末尾。所以这时候我们可能会认为这个数字是1的可能性更大一点。

也就是说,我们要设计一种加权算法,令最后的排名实现我们上述思考过程,得到一个处理后的真实结果。

加权

所以我的思路就是为每个排名分别加上权重。当然,因为上一篇文章中我们求得的是离被识别数字的距离,通常我们认为是距离越短就越相似,所以说我们最终的评判标准是越小越好的,那么我们这里的权重也设置为是越小越重要。比如说有三个权重1, 2, 3,那么1就要比2重要,2比3重要。

按照这样的思路,我们为了方便,只取距离被识别数字最近的五个图片B1-B5,权重分别为1, 2, 3, 4, 5。取成这样的权重仅仅是为了方便,目前没有其他意义。因为是顺手取的,所以说在准确度可能并没有十分好。在以后的任务中我会想办法找到一种能够根据结果反馈权重的算法,从而来确定权重。

当然,我们需要将上面五个权重进行归一化处理,也就是说权重之和为1.那么我们可以简单地列一个方程式,为

x + 2x + 3x + 4x + 5x = 1

其中的x就代表权重为1的归一化后的权重,解出x就可以得到五个权重。因此我们可以通过编程很简单的得到归一化后的权重列表

temp = np.array([1, 2, 3, 4, 5])
weight = list(temp/np.sum(temp))

可以得到五个权重分别为

B1 B2 B3 B4 B5
0.066 0.133 0.200 0.266 0.333

求相对距离

既然权重求出来了,那么某一个数字的总相对距离就很容易了。我们假设现在B1, B2属于同一个数字2,B3,B5属于同一个数字3,B4属于数字4.所以数字2的总相对距离为

d2 = B1w1 + B2w2

数字3的总相对距离为

d3 = B3w3 + B5w5

数字4的总相对距离为

d4 = B4*w4

因此我们只需要比较d2, d3, d4就可以知道哪一个数字可能是这个待识别图片上的数字。

放代码

我们把以上内容全部设定成一个函数,为CalculateWeight函数。

def CalculateWeight(pictures, n, testFiles):
    '''计算加权距离'''
    #权重(前五名)
    temp = np.array([1, 2, 3, 4, 5])
    weight = list(temp/np.sum(temp))
    weightNum = len(weight)
    for j, pic in enumerate(pictures):
        print(testFiles[j])
        #存储加权距离的字典
        weightDict = {}
        for i in range(weightNum):
            #判断该数字之前是否出现过
            if str(pic[n+i]) in weightDict:
                weightDict[str(pic[n+i])] = weightDict[str(pic[n+i])] + weight[i]*pic[i]
            else:
                weightDict[str(pic[n+i])] = weight[i]*pic[i]
        ShowRank(weightDict)

pictures是存储目前所有待检测图片距离其最近的n个训练图片的距离以及其对应的数字,以array形式存在,每一行代表一个待检测图片,其中前n列寸的是距离,后n列存的是对应的数字。

testFiles存储的是每一个待检测图片的名称。

利用for对每一个待检测图片进行循环,首先输出当前待检测图片的名称,然后建立一个字典weightDict。这个字典用来存储某一个数字的总相对距离,key为数字,value为总相对距离。

首先我们需要判断当前的数字是否已经存在于这个字典中,如果存在,那么就将当前算出来的相对距离加到这个key对应的的value中;如果不存在,那么就直接将当前的相对距离赋予key对应的value。循环了weightNum次以后,我们就可以得到当前图片的所有数字的总相对距离。这里我们就需要一个ShowRank函数来讲结果展示出来。

def ShowRank(weightDict):
    '''输出单个图片的排名顺序'''
    maxRank = [0, 9999]
    for item in weightDict:
        #寻找最小距离的数字
        if weightDict[item] < maxRank[1]:
            maxRank = [item, weightDict[item]]
        print('数字'+item+'的相对距离为'+str(weightDict[item]))
    print('最有可能为数字'+maxRank[0]+',相对距离为'+str(weightDict[item]))

这个函数内容就比较简单了,我就不再细说,主要是输出每一个数字与其对应的总相对距离,并找到最有可能(相对距离最小)的数字。

结果演示

我们可以拿五个测试,如下图所示:

运行程序以后我们直接得到了结果为

测试1.png
数字3.0的相对距离为14.5295906976
数字7.0的相对距离为21.6757647617
最有可能为数字3.0,相对距离为21.6757647617
测试2.png
数字4.0的相对距离为38.3158180871
最有可能为数字4.0,相对距离为38.3158180871
测试3.png
数字8.0的相对距离为2.51083001901
数字3.0的相对距离为29.8009289468
数字5.0的相对距离为8.16783067288
最有可能为数字8.0,相对距离为8.16783067288
测试4.png
数字1.0的相对距离为32.5987662245
数字3.0的相对距离为12.2730692216
最有可能为数字3.0,相对距离为12.2730692216
测试5.png
数字7.0的相对距离为18.5295580926
数字9.0的相对距离为7.94675193285
数字8.0的相对距离为14.284403787
最有可能为数字9.0,相对距离为14.284403787

可以看出除了测试4以外,其他全对,测试4中可能的结果也有1,也说不上错得太离谱。当然,之所以会出现这样的结果,是因为所有的训练图片都是我写的,所以识别我写的数字也就比较准,如果换一个人写就不一定了。出现失误的一切原因都是因为训练库太少啊,所以做这种识别的算法,最主要的还是我们的训练的库存。库存越多,信心也就越大。

总结

这一次就相当于告了一段落了,下一次就可能更加复杂,我想借用神经网络的那种负反馈机制来自动修改权重,从而来达到更精确的效果。当然,这就更加复杂了,也指不定什么时候能做出来。

目前来说下一篇应该会是利用qqbot来做qq自动回复机器人。其包括的功能大概有:指定短语回复,天气查询,签到与积分系统等。

如果喜欢的话,麻烦给一个喜欢或者赞或者收藏噢~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342