机器学习实战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 ...
随机推荐
- 一步一步写算法(之prim算法 上)
原文:一步一步写算法(之prim算法 上) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前面我们讨论了图的创建.添加.删除和保存等问题.今 ...
- php利用SoapClient调用webservices
原文:php利用SoapClient调用webservices 1.开启soap支持,在php.ini中去除extension=php_soap.dll之前的':' 2.掉用页面 <?php h ...
- Android接口测试-JUnit入门
1.下载:http://www.junit.org 2.配置AndroidManifest.xml,在application节点加入 <!--使用单元测试库--> <u ...
- 快速构建Windows 8风格应用27-漫游应用数据
原文:快速构建Windows 8风格应用27-漫游应用数据 本篇博文主要介绍漫游应用数据概览.如何构建漫游应用数据.构建漫游应用数据最佳实践. 一.漫游应用数据概览 1.若应用当中使用了漫游应用数据, ...
- Goldeneye.py网站压力测试工具2.1版源码
Goldeneye压力测试工具的源代码,粗略看了下,代码写的蛮规范和易读的,打算边读边加上了中文注释,但是想来也没太大必要,代码600多行,值得学习的地方还是蛮多的,喜欢Python的同学可以一读 这 ...
- Ubuntu12.10无法安装openssh-server[已解决]
因为要在Ubuntu下搞些东西,家里的台式有Deepin2013,但是发现有很多依赖的问题,实在不想解决,就到win7下用VBox安装了Ubuntu.打算使用SourceCRT连接虚拟机,但是在安装在 ...
- leetcode第32题--Search in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- linux之stat函数解析
[lingyun@localhost stat_1]$ vim stat.c + stat.c ...
- 利用Matlab生成一个网格化的三维球面(生成直角坐标)
利用Matlab生成一个网格化的三维球面,分别对径向方向.经度方向和纬度方向进行网格化,代码如下: %生成一个笛卡尔坐标系下球面网格的x,y,z坐标 %r为球面距离 %nJingdu,nWeidu分别 ...
- C++ multimap容器访问同一键值元素的不同方法
multimap是一种多元map容器,允许一个键对应多个值. 本文介绍了 multimap访问同一键值元素的三种不同方法,详细看下面代码: typedef multimap<string,int ...