kNN算法python实现和简单数字识别的方法


Posted in Python onNovember 18, 2014

本文实例讲述了kNN算法python实现和简单数字识别的方法。分享给大家供大家参考。具体如下:

kNN算法算法优缺点:

优点:精度高、对异常值不敏感、无输入数据假定
缺点:时间复杂度和空间复杂度都很高
适用数据范围:数值型和标称型

算法的思路:

KNN算法(全称K最近邻算法),算法的思想很简单,简单的说就是物以类聚,也就是说我们从一堆已知的训练集中找出k个与目标最靠近的,然后看他们中最多的分类是哪个,就以这个为依据分类。

函数解析:

库函数:

tile()
如tile(A,n)就是将A重复n次

a = np.array([0, 1, 2])

np.tile(a, 2)

array([0, 1, 2, 0, 1, 2])

np.tile(a, (2, 2))

array([[0, 1, 2, 0, 1, 2],[0, 1, 2, 0, 1, 2]])

np.tile(a, (2, 1, 2))

array([[[0, 1, 2, 0, 1, 2]],[[0, 1, 2, 0, 1, 2]]])

b = np.array([[1, 2], [3, 4]])

np.tile(b, 2)

array([[1, 2, 1, 2],[3, 4, 3, 4]])

np.tile(b, (2, 1))

array([[1, 2],[3, 4],[1, 2],[3, 4]])`

自己实现的函数

createDataSet()生成测试数组
kNNclassify(inputX, dataSet, labels, k)分类函数

inputX 输入的参数
dataSet 训练集
labels 训练集的标号
k 最近邻的数目

#coding=utf-8

from numpy import *

import operator
def createDataSet():

    group = array([[1.0, 0.9], [1.0, 1.0], [0.1, 0.2], [0.0, 0.1]])

    labels = ['A','A','B','B']

    return group,labels

#inputX表示输入向量(也就是我们要判断它属于哪一类的)

#dataSet表示训练样本

#label表示训练样本的标签

#k是最近邻的参数,选最近k个

def kNNclassify(inputX, dataSet, labels, k):

    dataSetSize = dataSet.shape[0]#计算有几个训练数据

    #开始计算欧几里得距离

    diffMat = tile(inputX, (dataSetSize,1)) - dataSet

    

    sqDiffMat = diffMat ** 2

    sqDistances = sqDiffMat.sum(axis=1)#矩阵每一行向量相加

    distances = sqDistances ** 0.5

    #欧几里得距离计算完毕

    sortedDistance = distances.argsort()

    classCount = {}

    for i in xrange(k):

        voteLabel = labels[sortedDistance[i]]

        classCount[voteLabel] = classCount.get(voteLabel,0) + 1

    res = max(classCount)

    return res
def main():

    group,labels = createDataSet()

    t = kNNclassify([0,0],group,labels,3)

    print t

    

if __name__=='__main__':

    main()

kNN应用实例

手写识别系统的实现

数据集:

两个数据集:training和test。分类的标号在文件名中。像素32*32的。数据大概这个样子:

kNN算法python实现和简单数字识别的方法

kNN算法python实现和简单数字识别的方法

方法:

kNN的使用,不过这个距离算起来比较复杂(1024个特征),主要是要处理如何读取数据这个问题的,比较方面直接调用就可以了。

速度:

速度还是比较慢的,这里数据集是:training 2000+,test 900+(i5的CPU)

k=3的时候要32s+

#coding=utf-8

from numpy import *

import operator

import os

import time
def createDataSet():

    group = array([[1.0, 0.9], [1.0, 1.0], [0.1, 0.2], [0.0, 0.1]])

    labels = ['A','A','B','B']

    return group,labels

#inputX表示输入向量(也就是我们要判断它属于哪一类的)

#dataSet表示训练样本

#label表示训练样本的标签

#k是最近邻的参数,选最近k个

def kNNclassify(inputX, dataSet, labels, k):

    dataSetSize = dataSet.shape[0]#计算有几个训练数据

    #开始计算欧几里得距离

    diffMat = tile(inputX, (dataSetSize,1)) - dataSet

    #diffMat = inputX.repeat(dataSetSize, aixs=1) - dataSet

    sqDiffMat = diffMat ** 2

    sqDistances = sqDiffMat.sum(axis=1)#矩阵每一行向量相加

    distances = sqDistances ** 0.5

    #欧几里得距离计算完毕

    sortedDistance = distances.argsort()

    classCount = {}

    for i in xrange(k):

        voteLabel = labels[sortedDistance[i]]

        classCount[voteLabel] = classCount.get(voteLabel,0) + 1

    res = max(classCount)

    return res
def img2vec(filename):

    returnVec = zeros((1,1024))

    fr = open(filename)

    for i in range(32):

        lineStr = fr.readline()

        for j in range(32):

            returnVec[0,32*i+j] = int(lineStr[j])

    return returnVec

    

def handwritingClassTest(trainingFloder,testFloder,K):

    hwLabels = []

    trainingFileList = os.listdir(trainingFloder)

    m = len(trainingFileList)

    trainingMat = zeros((m,1024))

    for i in range(m):

        fileName = trainingFileList[i]

        fileStr = fileName.split('.')[0]

        classNumStr = int(fileStr.split('_')[0])

        hwLabels.append(classNumStr)

        trainingMat[i,:] = img2vec(trainingFloder+'/'+fileName)

    testFileList = os.listdir(testFloder)

    errorCount = 0.0

    mTest = len(testFileList)

    for i in range(mTest):

        fileName = testFileList[i]

        fileStr = fileName.split('.')[0]

        classNumStr = int(fileStr.split('_')[0])

        vectorUnderTest = img2vec(testFloder+'/'+fileName)

        classifierResult = kNNclassify(vectorUnderTest, trainingMat, hwLabels, K)

        #print classifierResult,' ',classNumStr

        if classifierResult != classNumStr:

            errorCount +=1

    print 'tatal error ',errorCount

    print 'error rate',errorCount/mTest

        

def main():

    t1 = time.clock()

    handwritingClassTest('trainingDigits','testDigits',3)

    t2 = time.clock()

    print 'execute ',t2-t1

if __name__=='__main__':

    main()

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
Python遍历文件夹和读写文件的实现代码
Aug 28 Python
Python实现发送QQ邮件的封装
Jul 14 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
Jan 09 Python
python中将一个全部为int的list 转化为str的list方法
Apr 09 Python
python3中函数参数的四种简单用法
Jul 09 Python
为什么从Python 3.6开始字典有序并效率更高
Jul 15 Python
FFrpc python客户端lib使用解析
Aug 24 Python
Django app配置多个数据库代码实例
Dec 17 Python
后端开发使用pycharm的技巧(推荐)
Mar 27 Python
如何使用python切换hosts文件
Apr 29 Python
详解python中groupby函数通俗易懂
May 14 Python
浅析Python迭代器的高级用法
Jul 16 Python
决策树的python实现方法
Nov 18 #Python
linux 下实现python多版本安装实践
Nov 18 #Python
centos 下面安装python2.7 +pip +mysqld
Nov 18 #Python
朴素贝叶斯算法的python实现方法
Nov 18 #Python
使用django-suit为django 1.7 admin后台添加模板
Nov 18 #Python
DJANGO-ALLAUTH社交用户系统的安装配置
Nov 18 #Python
django 自定义用户user模型的三种方法
Nov 18 #Python
You might like
php+highchats生成动态统计图
2014/05/21 PHP
php实现微信公众平台账号自定义菜单类
2014/12/02 PHP
php中使用gd库实现下载网页中所有图片
2015/05/12 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
2018/01/29 PHP
3款实用的在线JS代码工具(国外)
2012/03/15 Javascript
JavaScript事件处理器中的event参数使用介绍
2013/05/24 Javascript
js Map List 遍历使用示例
2013/07/10 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
2016/08/10 Javascript
VueJS全面解析
2016/11/10 Javascript
EsLint入门学习教程
2017/02/17 Javascript
React入门教程之Hello World以及环境搭建详解
2017/07/11 Javascript
JS数组交集、并集、差集的示例代码
2017/08/23 Javascript
Angular4学习笔记router的简单使用
2018/03/30 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
JS正则表达式验证密码强度
2020/03/18 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
2020/11/04 Javascript
打印出python 当前全局变量和入口参数的所有属性
2009/07/01 Python
基于python 字符编码的理解
2017/09/02 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
python实现祝福弹窗效果
2019/04/07 Python
Python实现性能自动化测试竟然如此简单
2019/07/30 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
2020/02/16 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
keras的load_model实现加载含有参数的自定义模型
2020/06/22 Python
美国最大的半成品净菜电商:Blue Apron(蓝围裙)
2018/04/27 全球购物
英国景点门票网站:attractiontix
2019/08/27 全球购物
商得四方公司面试题(gid+)
2014/04/30 面试题
自考毕业生自我鉴定
2013/11/04 职场文书
资源环境与城市管理专业推荐信
2013/11/30 职场文书
安全目标责任书
2014/07/22 职场文书
党员学习新党章思想汇报
2014/10/25 职场文书
博士给导师的自荐信
2015/03/06 职场文书
2015年公务员工作总结
2015/04/24 职场文书
SQL语句中JOIN的用法场景分析
2021/07/25 SQL Server