KNN分类算法实现手写数字识别

需求:

利用一个手写数字“先验数据”集,使用knn算法来实现对手写数字的自动识别;

先验数据(训练数据)集:

?数据维度比较大,样本数比较多。

? 数据集包括数字0-9的手写体。

?每个数字大约有200个样本。

?每个样本保持在一个txt文件中。

?手写体图像本身的大小是32x32的二值图,转换到txt文件保存后,内容也是32x32个数字,0或者1,如下:

数据集压缩包解压后有两个目录:(将这两个目录文件夹拷贝的项目路径下E:/KNNCase/digits/

?目录trainingDigits存放的是大约2000个训练数据

?目录testDigits存放大约900个测试数据。

模型分析:

1、手写体因为每个人,甚至每次写的字都不会完全精确一致,所以,识别手写体的关键是“相似度”

2、既然是要求样本之间的相似度,那么,首先需要将样本进行抽象,将每个样本变成一系列特征数据(即特征向量)

3、手写体在直观上就是一个个的图片,而图片是由上述图示中的像素点来描述的,样本的相似度其实就是像素的位置和颜色之间的组合的相似度

4、因此,将图片的像素按照固定顺序读取到一个个的向量中,即可很好地表示手写体样本

5、抽象出了样本向量,及相似度计算模型,即可应用KNN来实现

python实现:

新建一个KNN.py脚本文件,文件里面包含四个函数:

1) 一个用来生成将每个样本的txt文件转换为对应的一个向量,

2) 一个用来加载整个数据集,

3) 一个实现kNN分类算法。

4) 最后就是实现加载、测试的函数。

  1 #!/usr/bin/python
  2 # coding=utf-8
  3 #########################################
  4 # kNN: k Nearest Neighbors
  5
  6 # 参数:        inX: vector to compare to existing dataset (1xN)
  7 #             dataSet: size m data set of known vectors (NxM)
  8 #             labels: data set labels (1xM vector)
  9 #             k: number of neighbors to use for comparison
 10
 11 # 输出:     多数类
 12 #########################################
 13
 14 from numpy import *
 15 import operator
 16 import os
 17
 18
 19 # KNN分类核心方法
 20 def kNNClassify(newInput, dataSet, labels, k):
 21     numSamples = dataSet.shape[0]  # shape[0]代表行数
 22
 23     # # step 1: 计算欧式距离
 24     # tile(A, reps): 将A重复reps次来构造一个矩阵
 25     # the following copy numSamples rows for dataSet
 26     diff = tile(newInput, (numSamples, 1)) - dataSet  # Subtract element-wise
 27     squaredDiff = diff ** 2  # squared for the subtract
 28     squaredDist = sum(squaredDiff, axis = 1)   # sum is performed by row
 29     distance = squaredDist ** 0.5
 30
 31     # # step 2: 对距离排序
 32     # argsort()返回排序后的索引
 33     sortedDistIndices = argsort(distance)
 34
 35     classCount = {}  # 定义一个空的字典
 36     for i in xrange(k):
 37         # # step 3: 选择k个最小距离
 38         voteLabel = labels[sortedDistIndices[i]]
 39
 40         # # step 4: 计算类别的出现次数
 41         # when the key voteLabel is not in dictionary classCount, get()
 42         # will return 0
 43         classCount[voteLabel] = classCount.get(voteLabel, 0) + 1
 44
 45     # # step 5: 返回出现次数最多的类别作为分类结果
 46     maxCount = 0
 47     for key, value in classCount.items():
 48         if value > maxCount:
 49             maxCount = value
 50             maxIndex = key
 51
 52     return maxIndex
 53
 54 # 将图片转换为向量
 55 def  img2vector(filename):
 56     rows = 32
 57     cols = 32
 58     imgVector = zeros((1, rows * cols))
 59     fileIn = open(filename)
 60     for row in xrange(rows):
 61         lineStr = fileIn.readline()
 62         for col in xrange(cols):
 63             imgVector[0, row * 32 + col] = int(lineStr[col])
 64
 65     return imgVector
 66
 67 # 加载数据集
 68 def loadDataSet():
 69     # # step 1: 读取训练数据集
 70     print "---Getting training set..."
 71     dataSetDir = ‘E:/KNNCase/digits/‘
 72     trainingFileList = os.listdir(dataSetDir + ‘trainingDigits‘)  # 加载测试数据
 73     numSamples = len(trainingFileList)
 74
 75     train_x = zeros((numSamples, 1024))
 76     train_y = []
 77     for i in xrange(numSamples):
 78         filename = trainingFileList[i]
 79
 80         # get train_x
 81         train_x[i, :] = img2vector(dataSetDir + ‘trainingDigits/%s‘ % filename)
 82
 83         # get label from file name such as "1_18.txt"
 84         label = int(filename.split(‘_‘)[0]) # return 1
 85         train_y.append(label)
 86
 87     # # step 2:读取测试数据集
 88     print "---Getting testing set..."
 89     testingFileList = os.listdir(dataSetDir + ‘testDigits‘) # load the testing set
 90     numSamples = len(testingFileList)
 91     test_x = zeros((numSamples, 1024))
 92     test_y = []
 93     for i in xrange(numSamples):
 94         filename = testingFileList[i]
 95
 96         # get train_x
 97         test_x[i, :] = img2vector(dataSetDir + ‘testDigits/%s‘ % filename)
 98
 99         # get label from file name such as "1_18.txt"
100         label = int(filename.split(‘_‘)[0]) # return 1
101         test_y.append(label)
102
103     return train_x, train_y, test_x, test_y
104
105 # 手写识别主流程
106 def testHandWritingClass():
107     # # step 1: 加载数据
108     print "step 1: load data..."
109     train_x, train_y, test_x, test_y = loadDataSet()
110
111     # # step 2: 模型训练.
112     print "step 2: training..."
113     pass
114
115     # # step 3: 测试
116     print "step 3: testing..."
117     numTestSamples = test_x.shape[0]
118     matchCount = 0
119     for i in xrange(numTestSamples):
120         predict = kNNClassify(test_x[i], train_x, train_y, 3)
121         if predict == test_y[i]:
122             matchCount += 1
123     accuracy = float(matchCount) / numTestSamples
124
125     # # step 4: 输出结果
126     print "step 4: show the result..."
127     print ‘The classify accuracy is: %.2f%%‘ % (accuracy * 100)

KNNTest.py

#!/usr/bin/python
# coding=utf-8

import KNN
KNN.testHandWritingClass()

测试结果:

时间: 2024-10-22 01:44:33

KNN分类算法实现手写数字识别的相关文章

C#中调用Matlab人工神经网络算法实现手写数字识别

手写数字识别实现 设计技术参数:通过由数字构成的图像,自动实现几个不同数字的识别,设计识别方法,有较高的识别率 关键字:二值化  投影  矩阵  目标定位  Matlab 手写数字图像识别简介: 手写阿拉伯数字识别是图像内容识别中较为简单的一个应用领域,原因有被识别的模式数较少(只有0到9,10个阿拉伯数字).阿拉伯数字笔画少并且简单等.手写阿拉伯数字的识别采用的方法相对于人脸识别.汉字识别等应用领域来说可以采用更为灵活的方法,例如基于规则的方法.基于有限状态自动机的方法.基于统计的方法和基于神

使用AI算法进行手写数字识别

人工智能 ??人工智能(Artificial Intelligence,简称AI)一词最初是在1956年Dartmouth学会上提出的,从那以后,研究者们发展了众多理论和原理,人工智能的概念也随之扩展.由于人工智能的研究是高度技术性和专业的,各分支领域都是深入且各不相通的,因而涉及范围极广 . 人工智能的核心问题包括建构能够跟人类似甚至超越人类的推理.知识.学习.交流.感知.使用工具和操控机械的能力等,当前人工智能已经有了初步成果,甚至在一些影像识别.语言分析.棋类游戏等等单方面的能力达到了超越

KNN算法案例--手写数字识别

import numpy as np import matplotlib .pyplot as plt import pandas as pd from sklearn.neighbors import KNeighborsClassifier # 加载数据 img_arr = plt.imread('./data/8/8_88.bmp') plt.imshow(img_arr) <matplotlib.image.AxesImage at 0x1786b073780> img_arr.sha

实验楼 1. k-近邻算法实现手写数字识别系统--《机器学习实战 》

首先看看一些关键词:K-NN算法,训练集,测试集,特征(空间),标签 举实验楼中的样例,通俗的讲讲K-NN算法:电影有两个分类(标签)-动作片-爱情片.两个特征--打斗场面--亲吻画面. 将那些数字和分类用图像表示大概如下: 两个红圆圈分别代表两种电影,他们包含了表中的数据,求解中间蓝色方框(就一个点(X,Y))属于哪一类,k-nn算法的解决方式是计算方框到两圆的距离,离谁近就属于谁.再具体点就是通过特征值来计算,假设接吻镜头次数=x,打斗=y,那么根据计算方式 d = ((X - x)^2 +

CNN:人工智能之神经网络算法进阶优化,六种不同优化算法实现手写数字识别逐步提高,应用案例自动驾驶之捕捉并识别周围车牌号—Jason niu

import mnist_loader from network3 import Network from network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayer training_data, validation_data, test_data = mnist_loader.load_data_wrapper() mini_batch_size = 10 #NN算法:sigmoid函数:准确率97% net = Netw

Python 手写数字识别-knn算法应用

在上一篇博文中,我们对KNN算法思想及流程有了初步的了解,KNN是采用测量不同特征值之间的距离方法进行分类,也就是说对于每个样本数据,需要和训练集中的所有数据进行欧氏距离计算.这里简述KNN算法的特点: 优点:精度高,对异常值不敏感,无数据输入假定 缺点:计算复杂度高,空间复杂度高 适用数据范围:数值型和标称型(具有有穷多个不同值,值之间无序)    knn算法代码: #-*- coding: utf-8 -*- from numpy import * import operatorimport

机器学习(二)-kNN手写数字识别

一.kNN算法 1.kNN算法是机器学习的入门算法,其中不涉及训练,主要思想是计算待测点和参照点的距离,选取距离较近的参照点的类别作为待测点的的类别. 2,距离可以是欧式距离,夹角余弦距离等等. 3,k值不能选择太大或太小,k值含义,是最后选取距离最近的前k个参照点的类标,统计次数最多的记为待测点类标. 4,欧式距离公式: 二.关于kNN实现手写数字识别 1,手写数字训练集测试集的数据格式,本篇文章说明的是<机器学习实战>书提供的文件,将所有数字已经转化成32*32灰度矩阵. 三.代码结构构成

Kaggle竞赛丨入门手写数字识别之KNN、CNN、降维

引言 这段时间来,看了西瓜书.蓝皮书,各种机器学习算法都有所了解,但在实践方面却缺乏相应的锻炼.于是我决定通过Kaggle这个平台来提升一下自己的应用能力,培养自己的数据分析能力. 我个人的计划是先从简单的数据集入手如手写数字识别.泰坦尼克号.房价预测,这些目前已经有丰富且成熟的方案可以参考,之后关注未来就业的方向如计算广告.点击率预测,有合适的时机,再与小伙伴一同参加线上比赛. 数据集 介绍 MNIST ("Modified National Institute of Standards an

DeepLearning (四) 基于自编码算法与softmax回归的手写数字识别

[原创]Liu_LongPo 转载请注明出处 [CSDN]http://blog.csdn.net/llp1992 softmax 回归模型,是logistic 回归模型在多分类问题上的推广.关于logistic回归算法的介绍,前面博客已经讲得很清楚,详情可以参考博客 机器学习实战ByMatlab(五)Logistic Regression 在logistic回归模型中,我们的激励函数sigmoid的输入为: z=θ0x0+θ1x1+θ2x2+...+θnxn 则可以得到假设函数为: hθ(x)