机器学习算法之KNN识别mnist数据集

本文介绍了如何使用KNN算法识别MNIST手写数字数据集,包括数据集读取、算法优化及Python中struct包的应用。通过对比不同k值,探讨了k值对准确率的影响,并提到了sklearn库的KNeighborsClassifier实现,以及精度、准确率和召回率的概念。
摘要由CSDN通过智能技术生成

KNN算法又称K邻近算法(K Nearest Neighbor),其基本思想为:样本空间中,某样本的类别为距离其最近的k个邻居所属类别中最多的那个类别。

MNIST数据集为一个带标注的手写数字识别的数据集,其官方下载地址为http://yann.lecun.com/exdb/mnist/。数据集包含60000个训练集和10000个测试集。该数据集中的文件以二进制方式保存,因此在读入时需要以二进制方式打开。

在学习读入MNIST数据集过程中,最大的收获是对Python中struct包的简单的了解。其中,对MNIST数据集的读入,主要参考博客http://www.cnblogs.com/x1957/archive/2012/06/02/2531503.html。个人觉得这一篇讲的还是很清楚的。

至于算法实现,有两个收获:

1. 算法优化:初始算法步骤比较冗长,肆无忌惮的使用for循环。这种做法对于MNIST这种数据量相对较大的数据集还是很致命的。改进后的算法,其运行时间明显减少(虽然还是很大安静)。

2. Numpy库中的argsort(list):以前对列表进行排序后想要获取对应的列表的索引,各种index,而且容易出现值重合的现象。但是,argsort(list)真的是神器。它对列表的值进行排序(降序)后,返回的列表值对应的索引。有木有很方便!

下面就是代码啦(Python):

读入图片,转化为一个数组(每一行为对应图片的像素):

# read the image file
# input: file path
#output: the list of piexl array for each image
def read_image(file_path):
    f_open=open(file_path,"rb")
    content=f_open.read()
    index=0
    magic, num_images,num_rows,num_columns=struct.unpack_from(">IIII",content,index) # 以大端法读入四个unsigned int
    print("number of images:"+str(num_images))
    print("number of rows:"+str(num_rows))
    print("number of columns:"+str(num_columns))
    index+=struct.calcsize(">IIII")
    img_piexl=[]
    for i in range(num_images):
        piexl_all=[]
        for j in range(num_columns):
            for k in range(num_rows):
                piexl=struct.unpack_from(">B",content,in
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值