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中PDB模块中的命令来调试Python代码的教程
Mar 30 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
May 27 Python
详解python中的hashlib模块的使用
Apr 22 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
Aug 15 Python
Python学习笔记之字符串和字符串方法实例详解
Aug 22 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
Sep 26 Python
windows、linux下打包Python3程序详细方法
Mar 17 Python
Python列表去重复项的N种方法(实例代码)
May 12 Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
Nov 19 Python
python excel和yaml文件的读取封装
Jan 12 Python
如何用用Python将地址标记在地图上
Feb 07 Python
django使用多个数据库的方法实例
Mar 04 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
IIS6的PHP最佳配置方法
2007/03/19 PHP
Wordpress php 分页代码
2009/10/21 PHP
PHP简单日历实现方法
2016/07/20 PHP
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
extjs之去除s.gif的影响
2010/12/25 Javascript
Nodejs极简入门教程(二):定时器
2014/10/25 NodeJs
jquery队列函数用法实例
2014/12/16 Javascript
JavaScript DOM基础
2015/04/13 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
jQuery实现的模拟弹出窗口功能示例
2016/11/24 Javascript
js实现简单的手风琴效果
2017/02/27 Javascript
JavaScript拖动层Div代码
2017/03/01 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
jQuery 操作 HTML 元素和属性的方法
2018/11/12 jQuery
JQuery事件委托(适用于给动态生成的脚本元素添加事件)
2020/02/01 jQuery
小程序websocket心跳库(websocket-heartbeat-miniprogram)
2020/02/23 Javascript
在vue项目中封装echarts的步骤
2020/12/25 Vue.js
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
Python 移动光标位置的方法
2019/01/20 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
python用线性回归预测股票价格的实现代码
2019/09/04 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
keras中的loss、optimizer、metrics用法
2020/06/15 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
Collection和Collections的区别
2016/05/02 面试题
大学生四年生活自我鉴定
2013/11/21 职场文书
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
人力资源管理专业自荐信
2014/06/24 职场文书
三严三实心得体会范文
2014/10/13 职场文书
深入开展党的群众路线教育实践活动心得体会
2014/11/05 职场文书
民事撤诉申请书范本
2015/05/18 职场文书
法制教育主题班会
2015/08/13 职场文书
导游词之昭君岛
2020/01/17 职场文书
Win10 heic文件怎么打开 ? Win10 heic文件打开教程
2022/04/06 数码科技