[机器学习案例1]基于KNN手写数字识别

原创 2017年05月23日 20:30:55

算法介绍

之前已经介绍过,简单来说,K-NN可以看成:有那么一堆你已经知道分类的数据,然后当一个新数据进入的时候,就开始跟训练数据里的每个点求距离,然后挑离这个训练数据最近的K个点看看这几个点属于什么类型,然后用少数服从多数的原则,给新数据归类。

算法步骤:

算法步骤:
1. step.1—初始化距离为最大值
2. step.2—计算未知样本和每个训练样本的距离dist
3. step.3—得到目前K个最临近样本中的最大距离maxdist
4. step.4—如果dist小于maxdist,则将该训练样本作为K-最近邻样本
5. step.5—重复步骤2、3、4,直到未知样本和所有训练样本的距离都算完
6. step.6—统计K-最近邻样本中每个类标号出现的次数
7. step.7—选择出现频率最大的类标号作为未知样本的类标号

案例分析

首先一个CNN算法

from numpy import *  
import operator  

def createDataSet():  
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])  
    labels = ['A','A','B','B']  
    return group,labels  

def classify0(inX,dataSet,labels,k):  
    dataSetSize = dataSet.shape[0]  
    diffMat = tile(inX,(dataSetSize,1)) - dataSet  
    sqDiffMat = diffMat**2  
    sqDistances = sqDiffMat.sum(axis = 1)  
    distances = sqDistances**0.5  
    sortedDistIndicies = distances.argsort()  
    classCount = {}  
    for i in range(k):  
        voteIlabel = labels[sortedDistIndicies[i]]  
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1  
    sortedClassCount = sorted(classCount.iteritems(),  
                              key=operator.itemgetter(1),reverse=True)  
    return sortedClassCount[0][0] 

测试算法:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
from numpy import *
from os import listdir
import KNN
from numpy.core import multiarray



def img2vector(filename):
    '图像文件转换成矩阵'
    returnVect = zeros((1,1024))
    fr = open(filename)
    for i in range(32):             #将32行合并成一行
        lineStr = fr.readline()
        for j in range(32):
            returnVect[0,32*i+j] = int(lineStr[j])
    return returnVect               #一个样本最终成为一个1*1024的向量


def handwritingClassTest():
    '手写识别测试函数,调用了KNN模块的KNN分类器函数'
    hwLabels = []
    trainingFileList = listdir('trainingDigits')
    m = len(trainingFileList)
    trainingMat = zeros((m,1024))
    for i in range(m):
        fileNameStr = trainingFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classNumStr = int(fileStr.split('_')[0])
        hwLabels.append(classNumStr)
        trainingMat[i,:] = img2vector('trainingDigits/%s' % fileNameStr)

    testFileList = listdir('testDigits')
    errorCount = 0.0
    mTest = len(testFileList)
    for i in range(mTest):
        fileNameStr = testFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classNumStr = int(fileStr.split('_')[0])
        vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)
        classifierResult = KNN.classify0(vectorUnderTest, trainingMat, hwLabels, 3)
        print "in #%d, the classifier came back with: %d, the real answer is: %d" % (i, classifierResult, classNumStr)
        if (classifierResult != classNumStr):
            errorCount += 1.0
    print "\nthe total number of errors is: %d" % errorCount
    print "\nthe total error rate is: %f" % (errorCount/float(mTest))

handwritingClassTest()

源码下载地址:

源码下载地址

版权声明:本文为博主原创文章,未经博主允许不得转载。

机器学习实战笔记——基于KNN算法的手写识别系统

利用k-近邻分类器实现手写识别系统,训练数据集大约2000个样本,每个数字大约有200个样本,每个样本保存在一个txt文件中,手写体图像本身是32X32的二值图像,如下图所示: 首先,我们需要...
  • geekmanong
  • geekmanong
  • 2016年01月17日 14:16
  • 2400

机器学习实战k近邻算法(kNN)应用之手写数字识别代码解读

一.背景简要说明 书中假设待识别的数字已经使用图形处理软件将其处理为32*32的黑白图像,并将图片转换为文本格式。如下图代表数字0: 每个数字的训练样本大概有200个,每个数字的测...
  • SCUT_Arucee
  • SCUT_Arucee
  • 2015年12月11日 11:33
  • 3758

KNN--用于手写数字识别(机器学习入门笔记)

最近在看机器学习实战这本书,写下博客作为笔记以帮助记忆。一、K-近邻算法概述概括的说,K-近邻算法采用测量不同特征值之间的距离的方法进行分类。 它的工作原理是:存在一个样本数据集合,也称训练样本集,...
  • zengxyuyu
  • zengxyuyu
  • 2017年01月13日 21:32
  • 2287

机器学习实战k近邻算法(kNN)应用之手写数字识别代码解读

一.背景简要说明 书中假设待识别的数字已经使用图形处理软件将其处理为32*32的黑白图像,并将图片转换为文本格式。如下图代表数字0: 每个数字的训练样本大概有200个,每个数字的测...
  • SCUT_Arucee
  • SCUT_Arucee
  • 2015年12月11日 11:33
  • 3758

KNN--用于手写数字识别(机器学习入门笔记)

最近在看机器学习实战这本书,写下博客作为笔记以帮助记忆。一、K-近邻算法概述概括的说,K-近邻算法采用测量不同特征值之间的距离的方法进行分类。 它的工作原理是:存在一个样本数据集合,也称训练样本集,...
  • zengxyuyu
  • zengxyuyu
  • 2017年01月13日 21:32
  • 2287

机器学习--knn手写数字识别系统

0. 刚接触java,并且在学习机器学习的相关算法,knn又非常的易于实现,于是就有了这个小系统。 1.knn算法简介: 2.该程序的功能主要有如下几个,       功能1:可以在面板上手写输...
  • robin_Xu_shuai
  • robin_Xu_shuai
  • 2017年05月07日 20:04
  • 1037

机器学习-kNN实现简单的手写数字识别系统

不积跬步,无以至千里 功能 利用k-邻近算法,实现识别数字0到9 开发环境 Mac Python3.5(Anaconda) PIL numpy 数据集和项目源代码 Github:https:...
  • jking54
  • jking54
  • 2017年05月16日 09:43
  • 340

【机器学习】Knn算法实现手写数字识别

from numpy import * import os import time #inputX表示输入向量 #dataSet表示训练样本 #label表示训练样本的标签 #k是最近邻的参...
  • sarah98
  • sarah98
  • 2017年05月26日 21:19
  • 206

基于qt和opencv3实现机器学习之:利用最近邻算法(knn)实现手写数字分类

手写数字digits分类,这可是深度学习算法的入门练习。而且还有专门的手写数字MINIST库。opencv提供了一张手写数字图片给我们,先来看看 这是一张密密麻麻的手写数字图:图片大小为1000...
  • u013289254
  • u013289254
  • 2017年04月24日 16:36
  • 654

【10月23日】机器学习实战(一)KNN算法:手写识别系统

k-近邻算法怕是最简单的机器学习的分类算法了。简单的说,k-近邻算法采用测量不同特征值之间的距离方法进行分类。 源码+实验数据地址:https://github.com/MoonTreee/mach...
  • Moon_treee
  • Moon_treee
  • 2017年10月24日 09:30
  • 123
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[机器学习案例1]基于KNN手写数字识别
举报原因:
原因补充:

(最多只允许输入30个字)