机器学习实战kNN之手写识别
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之手写识别的更多相关文章
- python 实现 KNN 分类器——手写识别
1 算法概述 1.1 优劣 优点:进度高,对异常值不敏感,无数据输入假定 缺点:计算复杂度高,空间复杂度高 应用:主要用于文本分类,相似推荐 适用数据范围:数值型和标称型 1.2 算法伪代码 (1)计 ...
- k最邻近算法——使用kNN进行手写识别
上篇文章中提到了使用pillow对手写文字进行预处理,本文介绍如何使用kNN算法对文字进行识别. 基本概念 k最邻近算法(k-Nearest Neighbor, KNN),是机器学习分类算法中最简单的 ...
- 【项目实战】CNN手写识别复杂模型的构造
感谢视频教程:https://www.bilibili.com/video/BV1Y7411d7Ys?p=11 这里开一篇新博客不仅仅是因为教程视频单独出了1p,也是因为这是一种代码编写的套路,特在此 ...
- 【项目实战】CNN手写识别
由于只需要修改之前基于ANN模型代码的模型设计部分所以篇幅较短,简单的加点注释给自己查看即可 视频链接:https://www.bilibili.com/video/BV1Y7411d7Ys?p=10 ...
- 基于kNN的手写字体识别——《机器学习实战》笔记
看完一节<机器学习实战>,算是踏入ML的大门了吧!这里就详细讲一下一个demo:使用kNN算法实现手写字体的简单识别 kNN 先简单介绍一下kNN,就是所谓的K-近邻算法: [作用原理]: ...
- 机器学习实战一:kNN手写识别系统
实战一:kNN手写识别系统 本文将一步步地构造使用K-近邻分类器的手写识别系统.由于能力有限,这里构造的系统只能识别0-9.需要识别的数字已经使用图形处理软件,处理成具有相同的色彩和大小:32像素*3 ...
- kNN算法实例(约会对象喜好预测和手写识别)
import numpy as np import operator import random import os def file2matrix(filePath):#从文本中提取特征矩阵和标签 ...
- AI应用开发实战 - 手写识别应用入门
AI应用开发实战 - 手写识别应用入门 手写体识别的应用已经非常流行了,如输入法,图片中的文字识别等.但对于大多数开发人员来说,如何实现这样的一个应用,还是会感觉无从下手.本文从简单的MNIST训练出 ...
- KNN实现手写数字识别
KNN实现手写数字识别 博客上显示这个没有Jupyter的好看,想看Jupyter Notebook的请戳KNN实现手写数字识别.ipynb 1 - 导入模块 import numpy as np i ...
随机推荐
- erlang mnesia数据库简单应用
mnesia是erlang自带的分布式数据库,基于ets和dets实现的.mnesia兼顾了dets的持久性和ets的高性能,可以自动在多个erlang节点间同步数据库.最关键的是,mnesia实现了 ...
- hdu5024(dp)
意甲冠军: 薛期呵和王熙凤不想很接近生活(因为假定他们一起,柴可能取代王熙凤) 现在'.'事情是这样的.'#'一堵墙.薛期呵对宝让生活远: 因此,选择一个最长的公路,让他们住在两端: 路达一个转折点. ...
- Tomcat7.0更改默认的路径来访问自己的项目
如何使自己的项目没有输入:localhost:8080/项目名称/index.html 能够访问. 步骤,如下面的 : 找到tomcat --- config----server.xml 选中右键编 ...
- [译]JDK 6 and JDK 7中的subString()方法
(说明,该文章翻译自The substring() Method in JDK 6 and JDK 7) 在JDK 6 and JDK 7中的substring(int beginIndex, int ...
- Spring之IOC容器加载初始化的方式
引言 我们知道IOC容器时Spring的核心,可是如果我们要依赖IOC容器对我们的Bean进行管理,那么我们就需要告诉IOC容易他需要管理哪些Bean而且这些Bean有什么要求,这些工作就是通过通过配 ...
- ReSharper 8.1支持TypeScript语言之代码检查特征
自ReSharper 8.1发布以来,就支持TypeScript.其在TypeScript语言拼写帮助和代码完成中,几乎是一个里程碑的发展,这是令人激动的改进. 支持TypeScript效果就目前测试 ...
- iOS:由URL成员UIImage
很多时候,我们只能得到URL.然后,需要建立一个UIImage. 在正常情况下,.我们一般通过SDWebImage直接施工UIImageVIew的image,如何使用URL直接施工UIImage它? ...
- DDD(领域驱动设计)应对具体业务场景,Domain Model(领域模型)到底如何设计?
DDD(领域驱动设计)应对具体业务场景,Domain Model(领域模型)到底如何设计? 写在前面 阅读目录: 迷雾森林 找回自我 开源地址 后记 毫无疑问,领域驱动设计的核心是领域模型,领域模型的 ...
- Git的使用学习资源
开学第一天一般都挺认真的,认真做个功课. 跟据Ryan Tang的推荐,有两个比较好的学习Git的网站:http://git.gitcafe.com/book/zh 还有一个是CodeSchool的一 ...
- Spyder提示ValueError: API 'QString' has already been set to version 1
转载自:http://wuyuans.com/2013/02/spyder-valueerror-api-qstring-has-already-been-set-to-version-1/ 在IPy ...