机器学习实战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 ...
随机推荐
- JS实现全选,用于界面批量操作向后台传值时使用
function seltAll(){ var chckBoxSign = document.getElementById("ckb"); //ckb 全选/反选的选择框id va ...
- sql点滴40—mysql乱码问题总结
原文:sql点滴40-mysql乱码问题总结 本文将为大家讲解如何处理Java连接过程中的MySQL中文乱码问题.一般MySQL中文乱码问题都是与字符集有关,这里作者的经历也大致差不多. MySQL默 ...
- PHP 调用asp.net Web Services服务问题总结
原文:PHP 调用asp.net Web Services服务问题总结 PHP是弱类型语言,转换非常不方便. < ?php //soap 客户端 $client=new SoapClient(' ...
- 使用WCF订阅替换轮训
之前因为某些特定岗位的人不知道是不方便还是什么的原因,所以随便做了个独立于所有系统之外的邮件审批服务,功能是那些人在邮件里给待审批单据发个“同意”就自动审批通过,大致分为3部分:第一部分每隔固定时间去 ...
- asp.net页面生命周期回顾
---根据一讲师所讲做了一下笔记,仅供参考 会存在些错误 页面声明周期: 1.HttpApplication在第11和第12个事件之间开始了页面声明周期,调用了第8个事件创建实例的pr(Process ...
- Redis API与常用数据类型简介
Redis API与常用数据类型简介 一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些 ...
- 实现透明渐变的Activity
如果光是透明全屏的Activity的话,直接继承内置theme即可 <activity android:theme="@android:style/Theme.NoTitleBar.F ...
- 微信SDK使用总结
最近做一个分享功能,需要使用微信SDK分享内容给朋友或朋友圈.期间遇到些奇怪的问题,花了点时间去折腾了一番. 首先需要到微信开放平台http://open.weixin.qq.com/?lang=zh ...
- SOA、ESB、NServiceBus、云计算
SOA.ESB.NServiceBus.云计算 总结 SOA SOA 是通过功能组件化.服务化,来实现系统集成.解决信息孤岛,这是其主要目标.而更进一步则是实现更快响应业务的变化.更快推出新的应用系统 ...
- 关于ListView中convertView的缓存个数的探究
在面试的时候经常会被问到一个有关ListView的问题:一个ListView的高度最多可以显示5个item,但是却有20条数据要显示,问最多会有多少个convertView会被复用?或者如在ListV ...