kNN算法算是机器学习入门级绝佳的素材。书上是这样诠释的:“存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都有标签,即我们知道样本集中每一条数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征比较,算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前K个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类”。

优点:精度高、对异常值不敏感、无数据输入假定。

缺点:计算复杂度高、空间复杂度高。

适用数据范围:数值型或标称型。

算法的python实现:

def kNN(data, dataSet, dataLabel, k=3, similarity=sim_distance):
scores = [(sim_distance(data, dataSet[i]), dataLabel[i]) for i in range(len(dataSet))]
sortedScore = sorted(scores, key=lambda d: d[0], reverse=False)
scores = sortedScore[0:k] classCount = {}
for score in scores:
classCount[score[1]] = classCount.get(score[1], 0) + 1 sortedClassCount = sorted(classCount.items(), key=lambda d: d[1], reverse=True)
return sortedClassCount[0][0]

下面分为几步骤来学习这个算法:

(1)准备数据

(2)测试算法

先介绍一个这个手写识别系统,简单起见,该系统只能识别数字0---9,需要识别的数字已经使用图形处理软件,处理成具有相同色彩和大小:32*32像素的黑白照片。目录trainingDigits中包含了大约2000个训练样本,目录testDigits中大约有900个测试样本。

第一步,准备数据:将图片数据转换成测试向量。这一步就是把我们32*32的二进制图像矩阵转换成1*1024的向量。

def img2vector(filename):
vec = []
file = open(filename)
for i in range(32):
line = file.readline()
for j in range(32):
vec.append(int(line[j]))
return vec

第二步,测试算法准确率,我们用
trainingDigits目录下的样本做训练,来测试testDigits目录下的样本,来计算准确率。

def test():
trainData, trainLabel = [], []
trainFileList = os.listdir('digits/trainingDigits/')
for filename in trainFileList:
trainData.append(img2vector('digits/trainingDigits/%s' % filename))
trainLabel.append(int(filename.split('_')[0])) succCnt, failCnt = 0, 0
testFileList = os.listdir('digits/testDigits')
for filename in testFileList:
data = img2vector('digits/testDigits/%s' % filename)
num = kNN(data, trainData, trainLabel)
if num == int(filename.split('_')[0]):
succCnt += 1
print 'succ'
else:
failCnt += 1
print 'fail' print "error rate is : %f " % (failCnt/float(failCnt+succCnt))

我这里测试,K取默认值3,错误率是0.013742,

不会上传文件,所以把代码贴在下面,测试数据在
http://download.csdn.net/detail/wyb_009/5649337第二章下面

import os, math
def sim_distance(a, b):
sum_of_squares = sum([pow(a[i]-b[i], 2) for i in range(len(a))])
return sum_of_squares def kNN(data, dataSet, dataLabel, k=3, similarity=sim_distance):
scores = [(sim_distance(data, dataSet[i]), dataLabel[i]) for i in range(len(dataSet))]
sortedScore = sorted(scores, key=lambda d: d[0], reverse=False)
scores = sortedScore[0:k] classCount = {}
for score in scores:
classCount[score[1]] = classCount.get(score[1], 0) + 1 sortedClassCount = sorted(classCount.items(), key=lambda d: d[1], reverse=True)
return sortedClassCount[0][0] def img2vector(filename):
vec = []
file = open(filename)
for i in range(32):
line = file.readline()
for j in range(32):
vec.append(int(line[j]))
return vec def test():
trainData, trainLabel = [], []
trainFileList = os.listdir('digits/trainingDigits/')
for filename in trainFileList:
trainData.append(img2vector('digits/trainingDigits/%s' % filename))
trainLabel.append(int(filename.split('_')[0]))
print "load train data ok" succCnt, failCnt = 0, 0
testFileList = os.listdir('digits/testDigits')
for filename in testFileList:
data = img2vector('digits/testDigits/%s' % filename)
num = kNN(data, trainData, trainLabel)
if num == int(filename.split('_')[0]):
succCnt += 1
print 'succ'
else:
failCnt += 1
print 'fail: kNN get %ld, real is %ls' %(num, int(filename.split('_')[0])) print "error rate is : %f " % (failCnt/float(failCnt+succCnt)) if __name__ == "__main__":
test()

机器学习实战kNN之手写识别的更多相关文章

  1. python 实现 KNN 分类器——手写识别

    1 算法概述 1.1 优劣 优点:进度高,对异常值不敏感,无数据输入假定 缺点:计算复杂度高,空间复杂度高 应用:主要用于文本分类,相似推荐 适用数据范围:数值型和标称型 1.2 算法伪代码 (1)计 ...

  2. k最邻近算法——使用kNN进行手写识别

    上篇文章中提到了使用pillow对手写文字进行预处理,本文介绍如何使用kNN算法对文字进行识别. 基本概念 k最邻近算法(k-Nearest Neighbor, KNN),是机器学习分类算法中最简单的 ...

  3. 【项目实战】CNN手写识别复杂模型的构造

    感谢视频教程:https://www.bilibili.com/video/BV1Y7411d7Ys?p=11 这里开一篇新博客不仅仅是因为教程视频单独出了1p,也是因为这是一种代码编写的套路,特在此 ...

  4. 【项目实战】CNN手写识别

    由于只需要修改之前基于ANN模型代码的模型设计部分所以篇幅较短,简单的加点注释给自己查看即可 视频链接:https://www.bilibili.com/video/BV1Y7411d7Ys?p=10 ...

  5. 基于kNN的手写字体识别——《机器学习实战》笔记

    看完一节<机器学习实战>,算是踏入ML的大门了吧!这里就详细讲一下一个demo:使用kNN算法实现手写字体的简单识别 kNN 先简单介绍一下kNN,就是所谓的K-近邻算法: [作用原理]: ...

  6. 机器学习实战一:kNN手写识别系统

    实战一:kNN手写识别系统 本文将一步步地构造使用K-近邻分类器的手写识别系统.由于能力有限,这里构造的系统只能识别0-9.需要识别的数字已经使用图形处理软件,处理成具有相同的色彩和大小:32像素*3 ...

  7. kNN算法实例(约会对象喜好预测和手写识别)

    import numpy as np import operator import random import os def file2matrix(filePath):#从文本中提取特征矩阵和标签 ...

  8. AI应用开发实战 - 手写识别应用入门

    AI应用开发实战 - 手写识别应用入门 手写体识别的应用已经非常流行了,如输入法,图片中的文字识别等.但对于大多数开发人员来说,如何实现这样的一个应用,还是会感觉无从下手.本文从简单的MNIST训练出 ...

  9. KNN实现手写数字识别

    KNN实现手写数字识别 博客上显示这个没有Jupyter的好看,想看Jupyter Notebook的请戳KNN实现手写数字识别.ipynb 1 - 导入模块 import numpy as np i ...

随机推荐

  1. JavaScript中的单引号和双引号报错的解决方法

    在使用JavaScript显示消息或者传递字符数据的时候,经常会碰到数据中夹杂单引号(')或者双引号("),这种语句往往会造成JavaScript报错.对此一般采用/'或者/"的解 ...

  2. installshield 32位打包和64位打包的注意事项

    原文:installshield 32位打包和64位打包的注意事项 32/64位问题要把握几点:1. 明确你的产品是否需要区分32/64位2. 明确你的产品中是否有32/64位的服务注册3. 了解In ...

  3. curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in

    当系统开启safe_mode和 open_basedir,在程序中使用以下语句 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); 并且遇到301,302状态 ...

  4. three.js 源代码凝视(七)Math/Euler.js

    商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发 ...

  5. Javascript实战开发:教你使用raphael.js绘制中国地图

    最近的数据统计项目中要用到中国地图,也就是在地图上动态的显示某个时间段某个省份地区的统计数据,我们不需要flash,仅仅依靠raphael.js以及SVG图像就可以完成地图的交互操作.在本文中,我给大 ...

  6. [翻译]初识SQL Server 2005 Reporting Services Part 2

    原文:[翻译]初识SQL Server 2005 Reporting Services Part 2 在Part 1文章中我们对SQL Server Reporting Services 2005(S ...

  7. Win7下Redmine2.0.3+Mysql55+Ruby1.8.7成功安装记录分享

    准备软件: Ruby 下载网页: http://rubyforge.org/frs/?group_id=167&release_id=46836 http://files.rubyforge. ...

  8. Oracle之savepoint

    Oracle之savepoint 什么是savepoint?Use the SAVEPOINT statement to identify a point in a transaction to wh ...

  9. 分布式文件系统之MogileFS工作原理及实现过程

    MogileFS是一套高效的文件自动备份组件,由Six Apart开发,广泛应用在包括LiveJournal等web2.0站点上.MogileFS由3个部分组成:   第1个部分:是server端,包 ...

  10. IOS UI 第八篇:基本UI

    实现图片的滚动,并且自动停止在每张图片上     - (void)viewDidLoad{    [super viewDidLoad]; UIScrollView *scrollView = [[U ...