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实现bitmap数据结构详解
Feb 17 Python
Python实现的数据结构与算法之链表详解
Apr 22 Python
Python测试人员需要掌握的知识
Feb 08 Python
python搭建服务器实现两个Android客户端间收发消息
Apr 12 Python
python线程中同步锁详解
Apr 27 Python
python隐藏终端执行cmd命令的方法
Jun 24 Python
django之静态文件 django 2.0 在网页中显示图片的例子
Jul 28 Python
python实现各种插值法(数值分析)
Jul 30 Python
Python实现使用dir获取类的方法列表
Dec 24 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
Feb 26 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
Mar 02 Python
Python序列化模块JSON与Pickle
Jun 05 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 如何向 MySQL 发送数据
2006/10/09 PHP
Symfony2学习笔记之控制器用法详解
2016/03/17 PHP
PHP基于curl模拟post提交json数据示例
2018/06/22 PHP
PHP的PDO预处理语句与存储过程
2019/01/27 PHP
jquery 最简单易用的表单验证插件
2010/02/27 Javascript
基于jquery可配置循环左右滚动例子
2011/09/09 Javascript
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
用js实现in_array的方法
2013/11/05 Javascript
jQuery制作简洁的图片轮播效果
2015/04/03 Javascript
BootStrap制作导航条实例代码
2016/05/06 Javascript
浅谈js中的in-for循环
2016/06/28 Javascript
微信小程序 地图定位简单实例
2016/10/14 Javascript
Javascript实现的StopWatch功能示例
2017/06/13 Javascript
彻底理解js面向对象之继承
2018/02/04 Javascript
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
2019/01/15 Javascript
JavaScript 判断iPhone X Series机型的方法
2019/01/28 Javascript
vue实现简单的日历效果
2020/09/24 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
[01:48:04]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第一场 2月7日
2021/03/11 DOTA
python 七种邮件内容发送方法实例
2014/04/22 Python
python的格式化输出(format,%)实例详解
2018/06/01 Python
pandas 时间格式转换的实现
2019/07/06 Python
运用PyTorch动手搭建一个共享单车预测器
2019/08/06 Python
在python中利用dict转json按输入顺序输出内容方式
2020/02/27 Python
Python如何对XML 解析
2020/06/28 Python
Python压缩模块zipfile实现原理及用法解析
2020/08/14 Python
皮尔·卡丹巴西官方商店:Pierre Cardin
2017/07/21 全球购物
澳大利亚百货公司:David Jones
2018/02/08 全球购物
工程部经理岗位职责
2013/12/08 职场文书
校企合作协议书
2014/04/16 职场文书
社区志愿者活动总结
2014/06/26 职场文书
领导四风问题整改措施思想汇报
2014/10/13 职场文书
2015暑期社会实践通讯稿
2015/07/18 职场文书
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS
MySQL数据库如何使用Shell进行连接
2022/04/12 MySQL