Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >KNN(k-NearestNeighbor)识别minist数据集

KNN(k-NearestNeighbor)识别minist数据集

作者头像
GavinZhou
发布于 2019-05-26 02:03:30
发布于 2019-05-26 02:03:30
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Gavin__Zhou/article/details/49383891

KNN算法介绍

KNN(K Nearest Neighbors,K近邻 )算法是机器学习所有算法中理论最简单,最好理解的。KNN是一种基于实例的学习,通过计算新数据与训练数据特征值之间的距离,然后选取K(K>=1)个距离最近的邻居进行分类判断(投票法)或者回归。如果K=1,那么新数据被简单分配给其近邻的类。KNN算法算是监督学习还是无监督学习呢?首先来看一下监督学习和无监督学习的定义。对于监督学习,数据都有明确的label(分类针对离散分布,回归针对连续分布),根据机器学习产生的模型可以将新数据分到一个明确的类或得到一个预测值。对于非监督学习,数据没有label,机器学习出的模型是从数据中提取出来的pattern(提取决定性特征或者聚类等)。例如聚类是机器根据学习得到的模型来判断新数据“更像”哪些原数据集合。KNN算法用于分类时,每个训练数据都有明确的label,也可以明确的判断出新数据的label,KNN用于回归时也会根据邻居的值预测出一个明确的值,因此KNN属于监督学习。

KNN算法流程

  • 选择一种距离计算方式, 通过数据所有的特征计算新数据与已知类别数据集中的数据点的距离
  • 按照距离递增次序进行排序,选取与当前距离最小的k个点
  • 对于离散分类,返回k个点出现频率最多的类别作预测分类;对于回归则返回k个点的加权值作为预测值
  • 按照投票的方式在返回的k个类别中选择出现次数最多的类别作为最终的预测类别

KNN算法关键

  • 数据的所有特征都要做可比较的量化。 若是数据特征中存在非数值的类型,必须采取手段将其量化为数值。举个例子,若样本特征中包含颜色(红黑蓝)一项,颜色之间是没有距离可言的,可通过将颜色转换为灰度值来实现距离计算。另外,样本有多个参数,每一个参数都有自己的定义域和取值范围,他们对distance计算的影响也就不一样,如取值较大的影响力会盖过取值较小的参数。为了公平,样本参数必须做一些scale处理,最简单的方式就是所有特征的数值都采取归一化处置。
  • 需要一个distance函数以计算两个样本之间的距离。 距离的定义有很多,如欧氏距离、余弦距离、汉明距离、曼哈顿距离等等。 一般情况下,选欧氏距离作为距离度量,但是这是只适用于连续变量。通常情况下,如果运用一些特殊的算法来计算度量的话,K近邻分类精度可显著提高,如运用大边缘最近邻法或者近邻成分分析法。
  • 确定K的值 K是一个自定义的常数,K的值也直接影响最后的估计,一种选择K值得方法是使用 cross-validate(交叉验证)误差统计选择法。交叉验证的概念之前提过,就是数据样本的一部分作为训练样本,一部分作为测试样本,比如选择95%作为训练样本,剩下的用作测试样本。通过训练数据训练一个机器学习模型,然后利用测试数据测试其误差率。 cross-validate(交叉验证)误差统计选择法就是比较不同K值时的交叉验证平均误差率,选择误差率最小的那个K值。例如选择K=1,2,3,… , 对每个K=i做100次交叉验证,计算出平均误差,然后比较、选出最小的那个。

KNN算法优缺点

一、 简单、有效。 二、 重新训练的代价较低(基本不需要训练)。 三、 计算时间和空间线性于训练集的规模(在一些场合不算太大),样本过大识别时间会很长。 四、 k值比较难以确定。

mnist手写数据识别

mnist是一个手写数字的库,包含数字从0-9,每个图像大小为32*32,详细介绍和数据下载见这里


用到了PIL,numpy这两个python库,没有安装的可以参照我的另外一篇博客去配置安装,这就不多说了 代码是我修改的大牛的原始代码生成的,参见下面的参考文献,我也已经上传CSDN,一份是大牛的原始代码,一份是新的


我们需要使用KNN算法去识别mnist手写数字,具体步骤如下: 首先需要将手写数字做成0 1串,将原图中黑色像素点变成1,白色为0,写成TXT文件; python代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def img2vector(impath,savepath):
    '''
    convert the image to an numpy array
    Black pixel set to 1,white pixel set to 0
    '''
    im = Image.open(impath)
    im = im.transpose(Image.ROTATE_90)
    im = im.transpose(Image.FLIP_TOP_BOTTOM)

    rows = im.size[0]
    cols = im.size[1]
    imBinary = zeros((rows,cols))
    for row in range(0,rows):
        for col in range(0,cols):
            imPixel = im.getpixel((row,col))[0:3]
            if imPixel == (0,0,0):
                imBinary[row,col] = 0
    #save temp txt like 1_5.txt whiich represent the class is 1 and the index is 5
    fp = open(savepath,'w')
    for x in range(0,imBinary.shape[0]):
        for y in range(0,imBinary.shape[1]):
            fp.write(str(int(imBinary[x,y])))
        fp.write('\n')
    fp.close()

结果大概像这样:

将所有的TXT文件中的0 1串变成行向量 python代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def vectorOneLine(filename):
    rows = 32
    cols = 32
    imgVector = zeros((1, rows * cols)) 
    fileIn = open(filename)
    for row in xrange(rows):
        lineStr = fileIn.readline()
        for col in xrange(cols):
            imgVector[0, row * 32 + col] = int(lineStr[col])
    return imgVector

KNN识别 python代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def kNNClassify(testImput, TrainingDataSet, TrainingLabels, k):
    numSamples = dataSet.shape[0] # shape[0] stands for the num of row
    #calculate the Euclidean distance
    diff = tile(newInput, (numSamples, 1)) - dataSet # Subtract element-wise
    squaredDiff = diff ** 2 # squared for the subtract
    squaredDist = sum(squaredDiff, axis = 1) # sum is performed by row
    distance = squaredDist ** 0.5
    #sort the distance vector
    sortedDistIndices = argsort(distance)
    #choose k elements
    classCount = {} # define a dictionary (can be append element)
    for i in xrange(k):
        voteLabel = labels[sortedDistIndices[i]]
        #initial the dict
        classCount[voteLabel] = classCount.get(voteLabel, 0) + 1
    #vote the label as final return
    maxCount = 0
    for key, value in classCount.items():
        if value > maxCount:
            maxCount = value
            maxIndex = key
    return maxIndex 

*识别结果*

参考文献: [1]大牛的博客:http://blog.csdn.net/zouxy09/article/details/16955347 [2]matlab 实现KNN: http://blog.csdn.net/rk2900/article/details/9080821 [3]分类算法的优缺点:http://bbs.pinggu.org/thread-2604496-1-1.html [4]代码下载地址:http://download.csdn.net/detail/gavin__zhou/9208821 http://download.csdn.net/detail/gavin__zhou/9208827

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015年10月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
机器学习算法-KNN(K-近邻)
本文中介绍的机器学习算法中的一种监督学习的算法:KNN算法,全称是K-Nearest Neighbor,中文称之为K近邻算法。
皮大大
2020/10/16
1.3K0
【机器学习】监督学习之KNN
一、kNN算法分析 K最近邻(k-Nearest Neighbor,KNN)分类算法可以说是最简单的机器学习算法了。它采用测量不同特征值之间的距离方法进行分类。它的思想很简单:如果一个样本在特征空间中
陆勤_数据人网
2018/02/27
9520
【机器学习】监督学习之KNN
K-近邻算法(KNN)概述
最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类。但是怎么可能所有测试对象都会找到与之完全匹配的训练对象呢,其次就是存在一个测试对象同时与多个训练对象匹配,导致一个训练对象被分到了多个类的问题,基于这些问题呢,就产生了KNN。 KNN是通过测量不同特征值之间的距离进行分类。它的的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。K通常是不大于20的整数。KN
瓜大三哥
2018/02/26
8570
K-近邻算法(KNN)概述
机器学习(一)——K-近邻(KNN)算法
最近在看《机器学习实战》这本书,因为自己本身很想深入的了解机器学习算法,加之想学python,就在朋友的推荐之下选择了这本书进行学习。
oYabea
2020/09/07
1.1K0
Machine Learning in Action:KNN Algorithm
对于分类问题,最主要的任务就是找到对应数据合适的分类。而机器学习的另一项任务就是回归,比如CTR预测之类的。ml算法按照有无label可以分为有监督学习和无监督学习,对于无监督学习的算法比较经典的有聚类算法,有监督的相对来说较多,回归类算法基本都是的。按照参数有可以划分成有参数模型和无参数模型和半参数模型,有参数模型有两个特征,一个是用参数代表从训练数据中获得的信息,只有当target function包含在了hypothesis set里面才会收敛。无参数模型是没有参数的,直接存储所以的训练数据,也就是不再用参数代表训练数据,比如KNN,无训练过程,而且一定收敛。对于半参数模型,参数一定有,但是一定收敛,最经典的就是神经网络模型,神经网络模型在理论上是可以拟合所有的target function,所有只要训练数据够多,一定可以收敛,因为他的hypothesis set包含了所以的target function。 如何选择算法,需要考虑两个方面:首先是使用这个算法的目的是什么,想要完成什么任务,其次就是数据怎么来,规模多大。开放ml程序一般要经历一下步骤,首先是收集数据,准备输入数据,也就是数据预处理,分析输入数据,训练算法。
西红柿炒鸡蛋
2019/03/21
4320
Machine Learning in Action:KNN Algorithm
机器学习笔记之KNN分类
KNN模型的核心思想很简单,即近朱者赤、近墨者黑,它通过将每一个测试集样本点与训练集中每一个样本之间测算欧氏距离,然后取欧氏距离最近的K个点(k是可以人为划定的近邻取舍个数,K的确定会影响算法结果),并统计这K个训练集样本点所属类别频数,将其中频数最高的所属类别化为该测试样本点的预测类别。
数据小磨坊
2018/07/25
9620
机器学习笔记之KNN分类
一文搞定KNN算法
本文中介绍的机器学习算法中的一种监督学习的算法:KNN算法,全称是K-Nearest Neighbor,中文称之为K近邻算法。
皮大大
2021/03/01
1.1K0
一文搞定KNN算法
KNN算法与案例:K-近邻的应用与优化
K-近邻算法(K-Nearest Neighbors, KNN)是一种简单而强大的监督学习算法,广泛应用于分类和回归任务。它的核心思想是通过计算样本之间的距离,将一个数据点的类别或数值预测为其最邻近的K个点的类别或数值。KNN算法具有直观的实现和较强的实际应用能力,尤其在数据较小、类别之间具有明显区分时,表现非常出色。
LucianaiB
2025/01/19
6480
Python&kNN近邻:玩家流失预测
作者:Fish http://www.gamedas.com 流失分析,是游戏数据分析中一个老生常谈的问题了,一般情况下,运营人员及数据分析师都会从下载-点击-注册-创角-加载-新手教程-…-流失,这样一系列的过程的转化率来一步步研究和细分来寻找玩家流失点,进而改进产品本身,或是变化其中的运营方式。这种方式在游戏测试或者前期留存震荡期及淘汰期是有显著效果的,可以细分分析到每个环节所出现的问题和痛点。当游戏进入留存稳定期时,真正目标用户的流失用这种环节转化率,等级流失,等级停滞的方法来研究便显得十分捉急了,毕
机器学习AI算法工程
2018/03/13
2K0
KNN算法虹膜图片识别(源码)
目录 1 K-近邻算法(KNN, k-NearestNeighbor) 2 K-近邻算法详述 3 K-近邻算法图片识别分类 4 参考文献 1 K-近邻算法(KNN, k-NearestNeighbor) 1.1 概念介绍 K-近邻算法(kNN,k-NearestNeighbor)分类算法由Cover和Hart在1968年首次提出。kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的
朱晓霞
2018/07/20
1.6K0
机器学习 学习笔记(14)k近邻学习
k近邻是一种常用的监督学习方法,其工作机制非常简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个邻居的信息来进行预测。通常在分类任务中可以使用投票法,即选择这k个样本中出现最多的类别标记作为预测结果,在回归任务中可以使用平均法,即将这个k个样本的实值输出标记的平均值作为预测结构,还可以基于距离远近进行加权平均或加权投票,距离越近的样本权重越大。
2018/09/04
3900
机器学习 学习笔记(14)k近邻学习
机器学习速成第二集——监督学习之分类(理论部分)!
监督学习中的分类部分是机器学习中非常重要的一个领域,它涉及将输入数据映射到预定义的类别或标签上。在监督学习中,算法通过有标记的数据进行训练,从而能够对新的未标记数据进行预测和分类。
用户11315985
2024/10/16
2510
机器学习速成第二集——监督学习之分类(理论部分)!
常见面试算法:k-近邻算法原理与python案例实现
k-近邻(kNN, k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法。
机器学习AI算法工程
2019/10/28
1.3K0
常见面试算法:k-近邻算法原理与python案例实现
100天搞定机器学习|Day7 K-NN
最近事情无比之多,换了工作、组队参加了一个比赛、和朋友搞了一些小项目,公号荒废许久。坚持是多么重要,又是多么艰难,目前事情都告一段落,我们继续100天搞定机器学习系列。想要继续做这个是因为,一方面在具体应用中,发现很多之前遗漏的点,可以在这里查漏补缺,巩固知识点。另一方面,也是想大家一起打卡学习,一起探讨。
Ai学习的老章
2019/04/08
5530
100天搞定机器学习|Day7 K-NN
K -近邻算法(kNN)(二)
本篇介绍用kNN算法解决 手写数字的图片识别问题。数据集使用的是MNIST手写数字数据集,它常被用来作为深度学习的入门案例。数据集下载网址:http://yann.lecun.com/exdb/mnist/
用户6021899
2019/08/14
7880
【模式识别】探秘分类奥秘:K-近邻算法解密与实战
这些技术通常不是孤立存在的,而是相互交叉和融合的,以解决更复杂的问题。在实际应用中,根据具体的问题和数据特点选择合适的模式识别技术是至关重要的。
SarPro
2024/02/20
3570
【模式识别】探秘分类奥秘:K-近邻算法解密与实战
机器学习19:k近邻(kNN)模型
k近邻(k-NearestNeighbor)学习是一种最简单的监督学习算法,工作机制非常简单:给定测试样本,基于某种距离度量找出训练集中与其最近的k个训练样本,然后基于这k个邻居的信息来进行预测。通常,在分类任务中使用投票法,即选择这k个样本职工出现最多的类别标记作为预测结果;在回归任务中可以使用平均法,即将这k个样本的实值输出标记的平均值作为预测结果;还可以基于距离远近来进行加权平均或者加权投票,距离越远的样本权重越大。
用户5473628
2019/08/08
1.5K0
机器学习19:k近邻(kNN)模型
K -近邻算法(kNN)(一)
大多数人都喜欢看电影,电影是如何分类呢?为了简化问题,假设所有的电影要么是爱情片,要么是动作片。如果我们已知一些电影的分类结果和电影中打斗镜头及亲吻镜头的次数,如下:
用户6021899
2019/08/14
5800
100天搞定机器学习|Day7 K-NN
最近事情无比之多,换了工作、组队参加了一个比赛、和朋友搞了一些小项目,公号荒废许久。坚持是多么重要,又是多么艰难,目前事情都告一段落,我们继续100天搞定机器学习系列。想要继续做这个是因为,一方面在具体应用中,发现很多之前遗漏的点,可以在这里查漏补缺,巩固知识点。另一方面,也是想大家一起打卡学习,一起探讨。
Ai学习的老章
2019/04/23
4010
100天搞定机器学习|Day7 K-NN
KNN (K 邻近)分类算法
最近看到一个很火的 100-Days-Of-ML-Code 的活动,在 Github 上看了下每日的学习内容,发现是个很好的查漏补缺的列表。这个学习列表里面包含机器学习,深度学习,统计学,线性代数等内容。KNN 是第 7 天的学习内容。
caoqi95
2019/03/27
1.5K0
KNN (K 邻近)分类算法
相关推荐
机器学习算法-KNN(K-近邻)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验