之前使用SVM对MNIST数据集进行了分类实验,得到了98.46%的分类正确率(见:使用libsvm对MNIST数据集进行实验)。

今天用python写了个小程序,来测试一下KNN的分类效果。

由于KNN的计算量太大,还没有使用KD-tree进行优化,所以对于60000训练集,10000测试集的数据计算比较慢。这里只是想测试观察一下KNN的效果而已,不调参。

K选择之前看过貌似最好不要超过20,因此,此处选择了K=10,距离为欧式距离。如果需要改进,可以再调整K来选择最好的成绩。

先跑了一遍不经过scale的,也就是直接使用像素灰度值来计算欧式距离进行比较。发现开始基本稳定在95%的正确率上,吓了一跳。因为本来觉得KNN算是没有怎么“学习”的机器学习算法了,猜测它的特点可能会是在任何情况下都可以用,但都表现的不是最好。所以估计在60%~80%都可以接受。没想到能基本稳定在95%上,确定算法和代码没什么问题后,突然觉得是不是这个数据集比较没挑战性。。。

去MNIST官网(http://yann.lecun.com/exdb/mnist/),上面挂了以该数据集为数据的算法的结果比较。查看了一下KNN,发现有好多,而且错误率基本都在5%以内,甚至能做到1%以内。唔。

跑的结果是,正确率:96.687%。也就是说,错误率error rate为3.31%左右。

再跑一下经过scale的数据,即对灰度数据归一化到[0,1]范围内。看看效果是否有所提升。

经过scale,最终跑的结果是,正确率:竟然也是96.687%! 也就是说,对于该数据集下,对KNN的数据是否进行归一化并无效果!

在跑scale之前,个人猜测:由于一般对数据进行处理之前都进行归一化,防止高维诅咒(在784维空间中很容易受到高维诅咒)。因此,预测scale后会比前者要好一些的。但是,现在看来二者结果相同。也就是说,对于K=10的KNN算法中,对MNIST的预测一样的。

对scale前后的正确率相同的猜测:由于在训练集合中有60000个数据点,因此0-9每个分类平均都有6000个数据点,在这样的情况下,对于测试数据集中的数据点,相临近的10个点中大部分都是其他分类而导致分类错误的概率会比较地(毕竟10相对与6000来说很小),所以,此时,KNN不仅可以取得较好的分类效果,而且对于是否scale并不敏感,效果相同。

代码如下:

#KNN for MNIST
from numpy import *
import operatordef line2Mat(line):line = line.strip().split(' ')label = line[0]mat = []for pixel in line[1:]:pixel = pixel.split(':')[1]mat.append(float(pixel))return mat, label#matrix should be type: array. Or classify() will get error.
def file2Mat(fileName):f = open(fileName)lines = f.readlines()matrix = []labels = []for line in lines:mat, label = line2Mat(line)matrix.append(mat)labels.append(label)print 'Read file '+str(fileName) + ' to matrix done!'return array(matrix), labels#classify mat with trained data: matrix and labels. With KNN's K set.
def classify(mat, matrix, labels, k):diffMat = tile(mat, (shape(matrix)[0], 1)) - matrix#diffMat = array(diffMat)sqDiffMat = diffMat ** 2sqDistances = sqDiffMat.sum(axis=1)distances = sqDistances ** 0.5sortedDistanceIndex = distances.argsort()classCount = {}for i in range(k):voteLabel = labels[sortedDistanceIndex[i]]classCount[voteLabel] = classCount.get(voteLabel,0) + 1sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1),reverse=True)return sortedClassCount[0][0]def classifyFiles(trainMatrix, trainLabels, testMatrix, testLabels, K):rightCnt = 0for i in range(len(testMatrix)):if i % 100 == 0:print 'num '+str(i)+'. ratio: '+ str(float(rightCnt)/(i+1))label = testLabels[i]predictLabel = classify(testMatrix[i], trainMatrix, trainLabels, K)if label == predictLabel:rightCnt += 1return float(rightCnt)/len(testMatrix)trainFile = 'train_60k.txt'
testFile = 'test_10k.txt'
trainMatrix, trainLabels = file2Mat(trainFile)
testMatrix, testLabels = file2Mat(testFile)
K = 10
rightRatio = classifyFiles(trainMatrix, trainLabels, testMatrix, testLabels, K)
print 'classify right ratio:' +str(right)

使用KNN对MNIST数据集进行实验相关推荐

  1. 使用libsvm对MNIST数据集进行实验

    在学SVM中的实验环节,老师介绍了libsvm的使用.当时看完之后感觉简单的说不出话来. 1. libsvm介绍 虽然原理要求很高的数学知识等,但是libsvm中,完全就是一个工具包,拿来就能用.当时 ...

  2. 使用Decision Tree对MNIST数据集进行实验

    之前已经对MNIST使用过SVM和KNN的方法进行分类,效果看起来还不错.今天使用决策树来实验,看看结果如何. 使用的Decision Tree中,对MNIST中的灰度值进行了0/1处理,方便来进行分 ...

  3. 图像识别:利用KNN实现手写数字识别(mnist数据集)

    图像识别:利用KNN实现手写数字识别(mnist数据集) 步骤: 1.数据的加载(trainSize和testSize不要设置的太大) 2.k值的设定(不宜过大) 3.KNN的核心:距离的计算 4.k ...

  4. 如何来玩MNIST数据集?

    MNIST数据集是一个基本的手写字体识别数据集,包含50000个训练样本和10000个测试样本,都是28*28的分辨率,可以用来做很多机器学习算法的研究.下面来看看这个数据集有哪些方法来玩. 之前已经 ...

  5. DL之DNN优化技术:自定义MultiLayerNet【5*100+ReLU】对MNIST数据集训练进而比较三种权重初始值(Xavier参数初始化、He参数初始化)性能差异

    DL之DNN优化技术:自定义MultiLayerNet[5*100+ReLU]对MNIST数据集训练进而比较三种权重初始值(Xavier参数初始化.He参数初始化)性能差异 导读 #思路:观察不同的权 ...

  6. TensorflowSharp 简单使用与KNN识别MNIST流程

    机器学习是时下非常流行的话题,而Tensorflow是机器学习中最有名的工具包.TensorflowSharp是Tensorflow的C#语言表述.本文会对TensorflowSharp的使用进行一个 ...

  7. MNIST数据集的导入与预处理

    在做KNN+LDA对MNIST数据集分类时遇到了不少坑,本篇文章主要是记录一下解决这些坑的方案,完整的代码和实验报告等作业结束提交后再进行上传. MNIST数据集 MNIST数据集简介 MNIST数据 ...

  8. NN学习技巧之参数最优化的四种方法对比(SGD, Momentum, AdaGrad, Adam),基于MNIST数据集

    前面几篇博文分析了每一种参数优化方案,现在做一个对比,代码参考斋藤的红鱼书第六章. 实验对mnist数据集的6万张图片训练,使用5层全连接神经网络(4个隐藏层,每个隐藏层有100个神经元),共迭代20 ...

  9. 机器学习入门(07)— MNIST 数据集手写数字的识别

    和求解机器学习问题的步骤(分成学习和推理两个阶段进行)一样,使用神经网络解决问题时,也需要首先使用训练数据(学习数据)进行权重参数的学习:进行推理时,使用刚才学习到的参数,对输入数据进行分类. 1. ...

最新文章

  1. 13.angular时间
  2. Exploring the 7 Different Types of Data Stories
  3. 多路 IO 转接 :select 函数
  4. Flask从入门到做出一个博客的大型教程
  5. mysql error 1201_ERROR 1201 (HY000): Could not initialize master info structure; .....
  6. 为什么出现股市二八现象?
  7. xaf 设置内置(built-in actions)按钮的可用状态
  8. 程序员面试金典——9.4集合的子集
  9. 2021数学建模学习笔记
  10. python读取csmar_Python:爬取上市公司公告-Wind-CSMAR
  11. java 面试 英语自我介绍
  12. 【2023年中国法定节假日的订阅链接】
  13. Template /template/pimple/a.ftl not found
  14. SQL语句——处理函数
  15. 楚留香冰最新服务器,一梦江湖:各门派冰雪外观极寒之刃上线,冰晶透亮玩家直呼绝了!...
  16. 计算机网络期末复习:第一章概念
  17. 判断点圆关系 (30 分)
  18. Transformer:让ChatGPT站在肩膀上的巨人?
  19. Elasticsearch from/size-浅分页查询-深分页 scroll-深分页search_after深度查询区别使用及应用场景
  20. GB/T 1.1—2009《标准化工作导则 第1部分:标准的结构和编写》简介

热门文章

  1. 解决ping的IP 但是ping 不通域名的问题 或者请求找不到主机 请检查该名称
  2. 无法在流的结尾之外进行读取_IO流,字节流,字符流
  3. python无法打开文档_win32com Excel。应用程序无法打开任何文档
  4. 文件操作函数java_java中文件的操作
  5. axure中的拐弯箭头_Axure教程:实现菜单下拉效果
  6. java上传+限制单文件,VereMVC 之 单文件上传
  7. linux 启动两个摄像头,Linux:(多摄像头)如何运行指定的摄像头
  8. pytorch运行遇到的问题_如何解决吸塑机在运行中遇到真空度的问题
  9. volley 调用php接口,使用Volley发送帖子请求并使用PHP接收
  10. android 之适配器与json对象解析技术的联用的进一步优化(解决图片错位)