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系列之数据处理编程实例(一)
May 22 Python
python抓取并保存html页面时乱码问题的解决方法
Jul 01 Python
Python实现的自定义多线程多进程类示例
Mar 23 Python
Python之用户输入的实例
Jun 22 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
Nov 29 Python
Python3多目标赋值及共享引用注意事项
May 27 Python
python3.4+pycharm 环境安装及使用方法
Jun 13 Python
python实现将字符串中的数字提取出来然后求和
Apr 02 Python
python中的垃圾回收(GC)机制
Sep 21 Python
Python Serial串口基本操作(收发数据)
Nov 06 Python
python turtle绘图命令及案例
Nov 23 Python
python 安全地删除列表元素的方法
Mar 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简洁函数小结
2011/08/12 PHP
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
2013/06/01 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
JavaScript的作用域和块级作用域概念理解
2014/09/21 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
深入理解JavaScript程序中内存泄漏
2016/03/17 Javascript
JavaScript学习笔记之数组的增、删、改、查
2016/03/23 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
js 声明数组和向数组中添加对象变量的简单实例
2016/07/28 Javascript
js利用clipboardData实现截屏粘贴功能
2016/10/12 Javascript
jQuery模拟实现天猫购物车动画效果实例代码
2017/05/25 jQuery
vue实现某元素吸顶或固定位置显示(监听滚动事件)
2017/12/13 Javascript
全新打包工具parcel零配置vue开发脚手架
2018/01/11 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
react-native使用leanclound消息推送的方法
2018/08/06 Javascript
Vue实现固定定位图标滑动隐藏效果
2019/05/30 Javascript
BootstrapValidator验证用户名已存在(ajax)
2019/11/08 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
使用Python脚本对Linux服务器进行监控的教程
2015/04/02 Python
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
2020/05/15 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
阿联酋航空假期:Emirates Holidays
2018/03/20 全球购物
介绍一下你对SOA的认识
2016/04/24 面试题
员工试用期自我鉴定范文
2014/09/15 职场文书
产品委托授权书范本
2014/09/16 职场文书
学术会议邀请函
2015/01/30 职场文书
2015年光棍节活动总结
2015/03/24 职场文书
小学生大队委竞选稿
2015/11/20 职场文书
基于Redis延迟队列的实现代码
2021/05/13 Redis
Javascript中Microtask和Macrotask鲜为人知的知识点
2022/04/02 Javascript
使用Python获取字典键对应值的方法
2022/04/26 Python