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 set集合类型操作总结
Nov 07 Python
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
Jul 24 Python
Python使用post及get方式提交数据的实例
Jan 24 Python
Python3删除排序数组中重复项的方法分析
Jan 31 Python
Django保护敏感信息的方法示例
May 09 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
Jul 15 Python
Python企业编码生成系统之系统主要函数设计详解
Jul 26 Python
python 批量修改 labelImg 生成的xml文件的方法
Sep 09 Python
Python 解码Base64 得到码流格式文本实例
Jan 09 Python
从多个tfrecord文件中无限读取文件的例子
Feb 17 Python
django在开发中取消外键约束的实现
May 20 Python
python 第三方库paramiko的常用方式
Feb 20 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的explode和implode的使用说明
2011/07/17 PHP
PHP中empty,isset,is_null用法和区别
2017/02/19 PHP
jQuery 性能优化指南(3)
2009/05/21 Javascript
JavaScript获取页面上某个元素的代码
2011/03/13 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
简单的两种Extjs formpanel加载数据的方式
2013/11/09 Javascript
JS图片无缝、平滑滚动代码
2014/03/11 Javascript
详解各版本React路由的跳转的方法
2018/05/10 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
Angular6 用户自定义标签开发的实现方法
2019/01/08 Javascript
js+html实现点名系统功能
2019/11/05 Javascript
vue实现给div绑定keyup的enter事件
2020/07/31 Javascript
[01:31:03]DOTA2完美盛典全回顾 见证十五项大奖花落谁家
2017/11/28 DOTA
[01:12:40]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第三场 1月25日
2021/03/11 DOTA
Python常用内置函数总结
2015/02/08 Python
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
Python+Selenium使用Page Object实现页面自动化测试
2019/07/14 Python
对DJango视图(views)和模版(templates)的使用详解
2019/07/17 Python
Python 微信公众号文章爬取的示例代码
2020/11/30 Python
python sleep和wait对比总结
2021/02/03 Python
Mountain Warehouse澳大利亚官网:欧洲家庭户外品牌倡导者
2016/11/20 全球购物
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
德国综合购物网站:OTTO
2018/11/13 全球购物
三维科技面试题
2013/07/27 面试题
实习期自我鉴定
2013/10/11 职场文书
十八大报告观后感
2014/01/28 职场文书
大学生期末自我鉴定
2014/02/01 职场文书
学习雷锋精神心得体会范文
2014/03/12 职场文书
授权委托书
2014/09/17 职场文书
重阳节演讲稿:尊敬帮助老人 弘扬传统美德
2014/09/25 职场文书
2015年办公室个人工作总结
2015/04/20 职场文书
导游词之平津战役纪念馆
2019/11/04 职场文书
Python包argparse模块常用方法
2021/06/04 Python
python通过opencv调用摄像头操作实例分析
2021/06/07 Python
golang 实用库gotable的具体使用
2021/07/01 Golang