大话系列 | k近邻(下)—实战项目

关注+星标,听说他有点东西9eb93a3221d3ceec354dbae4cee123f9.png

全文共1164字,阅读全文需10分钟

写在前面的话

大家好,我是小一3144ee25863ee48cd20b556585138f1a.png

前面两节介绍了 k近邻算法,想必你对于k近邻算法的理论应该没啥问题

大话系列 | k近邻(上)—理论基础

大话系列 | k近邻(中)—有一棵树叫KD树

这节是k近邻算法的实战,小一感觉还比较好玩,刚好最近天池上有一个街景数字识别的比赛,改一改也可以去试试打比赛

ok,一起来看如何使用knn进行数字识别

开始实战

先来介绍一下项目的的背景

已有部分手写数字数据集,数据是存储在txt中,以一个32*32的矩阵存储。在矩阵中,有像素点的位置标为1,没有的标为0。每个txt文件的名称第一位数字表示该文件代表的书写数字

目前的训练数据1934个,测试数据946个,训练数据和测试数据并无较大区别


针对上面的背景,再结合上节的k近邻算法,建模的大致流程如下:

  • 每个文件的32*32矩阵通过拼接存成一列,存入新的矩阵A,这样每一列表示一个图片

  • 用测试数据和矩阵A的每一列求距离,求得的距离放在距离数组中

  • 从距离数组中取出最小的k个距离对应的训练图片的标签

  • 选取标签中的众数当做该预测图片的预测结果


方法也比较简单,顺着k近邻的流程撸一遍就大致明白了。

每个文件都是一张图,所有有很多个txt文件

67ee3c729867039ab6ae4d3bb38e0312.png

数据集预览

截几个数据的图,在配上小一鬼斧神工的画技

5f72c3cf1e0056a9294cf07df86c9d8e.png

灵魂画家~
读取数据

因为数据是小的txt文件,所以需要进行相应的处理

这里直接贴代码了,没什么技术难度

# 遍历文件
filenames = os.listdir(dirpath)
# 数据保存在二维数组中,标签保存在一维数组中
data_arr = np.zeros((len(filenames), 1024))
data_label = []

for i in range(len(filenames)):
    filename = filenames[i]
    # 读取每个文件的内容
    filepath = os.path.join(dirpath, filename)
    # 将32*32拼接成1*1024数组
    data_arr[i, :] = concat_info(filepath)
    data_label.append(filename[:1])

处理之后的数据现在长这样:

通过把二维数组拼接成一维数组,所以每一列都表示一个图片

693685a6b3843b3abd7423f78701cbc2.png

训练数据是一个二维的矩阵,样本标签是一个一维的列表

开始建模

因为数据都是规整数据,所以省略EDA步骤

这一步需要选择最优的k值,因为不知道哪个k值最优,前面说过可以使用交叉验证确定最优

这里我们直接使用网格搜索让模型自己找到最优的k值

7886e58de4faf7f1887a5fc4ab2f34cf.png

ok,网格搜索确定最优的k值为3,那我们直接建立模型

然后对测试集中的图片进行预测

17116df85891b19115214b273e64bf75.png

准确率达到98%,但是还是有部分图片是预测错误的,把出错误的图片拎出来康康,到底是写成什么鬼样子了才会连knn都不认识

428d1ec2a6faa953a5ed6b43270b382f.png

就这几个图片,看一下究竟是啥样子

81d21dff9fd40c7a91e83d8bce1d9f45.png

红色为预测结果,绿色为实际标签

一个原因是我们的样本数据不是很多,造成了识别错误,另一个也确实是手写的数字太......

考虑一下怎么解决这个问题:

  • 增大样本量,增大模型的识别能力,但是也会相应的增大计算成本

  • 设置权重,1的权重比0的权重高,所以01交接处的数字权重会高于连续数字的权重


好了,今天的项目就到这了


关于源码

公众号后台回复 手写数字识别 获取本节内容的源码

写在后面的话

五月不学习,六月徒伤悲

我是小一,我们下个算法见

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值