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编程-将Python程序转化为可执行程序[整理]
Apr 09 Python
Python变量作用范围实例分析
Jul 07 Python
Python中列表和元组的使用方法和区别详解
Dec 30 Python
教你用Python脚本快速为iOS10生成图标和截屏
Sep 22 Python
python3实现UDP协议的服务器和客户端
Jun 14 Python
Python实现一个Git日志统计分析的小工具
Dec 14 Python
Python读取MRI并显示为灰度图像实例代码
Jan 03 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
May 21 Python
Python使用分布式锁的代码演示示例
Jul 30 Python
python实现网站微信登录的示例代码
Sep 18 Python
Python基于Dlib的人脸识别系统的实现
Feb 26 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
Mar 02 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中运用http调用的GET和POST方法示例
2014/09/29 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
2015/03/19 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
PHP网络操作函数汇总
2015/05/18 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
javascript 正则替换 replace(regExp, function)用法
2010/05/22 Javascript
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
javascript实现图像循环明暗变化的方法
2015/02/25 Javascript
jQuery中ScrollTo用法示例
2016/09/04 Javascript
Vuejs第十一篇组件之slot内容分发实例详解
2016/09/09 Javascript
JS访问DOM节点方法详解
2016/11/29 Javascript
分享一个精简的vue.js 图片lazyload插件实例
2017/03/13 Javascript
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
vue+element-ui集成随机验证码+用户名+密码的form表单验证功能
2018/08/05 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
2018/09/07 jQuery
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
微信小程序点击生成朋友圈分享图(遇到的坑)
2020/06/17 Javascript
解决vue项目 build之后资源文件找不到的问题
2020/09/12 Javascript
javascript实现简易计算器功能
2020/09/23 Javascript
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
python进程管理工具supervisor使用实例
2014/09/17 Python
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
python引用DLL文件的方法
2015/05/11 Python
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
详解Matplotlib绘图之属性设置
2019/08/23 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
python中return不返回值的问题解析
2020/07/22 Python
Python做图像处理及视频音频文件分离和合成功能
2020/11/24 Python
文秘专业自荐信
2013/10/14 职场文书
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
学校安全管理责任书
2014/07/23 职场文书
车间主任岗位职责范本
2015/04/08 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript