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脚本实现统计日志文件中的ip访问次数代码分享
Aug 06 Python
Python实现扫描局域网活动ip(扫描在线电脑)
Apr 28 Python
python数组过滤实现方法
Jul 27 Python
使用python3.5仿微软记事本notepad
Jun 15 Python
Python操作MongoDB详解及实例
May 18 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
Sep 08 Python
python: line=f.readlines()消除line中\n的方法
Mar 19 Python
查看django执行的sql语句及消耗时间的两种方法
May 29 Python
Python嵌套式数据结构实例浅析
Mar 05 Python
Linux下远程连接Jupyter+pyspark部署教程
Jun 21 Python
Pytorch实验常用代码段汇总
Nov 19 Python
python的列表生成式,生成器和generator对象你了解吗
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
xml+php动态载入与分页
2006/10/09 PHP
php xml文件操作代码(一)
2009/03/20 PHP
用PHP将数据导入到Foxmail的实现代码
2010/09/05 PHP
php中根据变量的类型 选择echo或dump
2012/07/05 PHP
基于php-fpm的配置详解
2013/06/03 PHP
php如何连接sql server
2015/10/16 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
基于jquery的修改当前TAB显示标题的代码
2010/12/11 Javascript
jquery 检测元素是否存在的实例代码
2013/11/19 Javascript
jquery实现图片按比例缩放示例
2014/07/01 Javascript
Ionic快速安装教程
2016/06/03 Javascript
javascript之Boolean类型对象
2016/06/07 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
JS获取当前页面名称的简单实例
2016/08/19 Javascript
vue-router 学习快速入门
2017/03/01 Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
2018/08/12 Javascript
详解jquery和vue对比
2019/04/16 jQuery
JavaScript实现简单贪吃蛇效果
2020/03/09 Javascript
[02:55]DOTA2英雄基础教程 发条技师
2013/12/04 DOTA
[02:47]3.19DOTA2发布会 国服成长历程回顾
2014/03/25 DOTA
Python实现字典的key和values的交换
2015/08/04 Python
python的变量与赋值详细分析
2017/11/08 Python
Python3 获取文件属性的方式(时间、大小等)
2020/03/12 Python
在pycharm中创建django项目的示例代码
2020/05/28 Python
支持IE8的纯css3开发的响应式设计动画菜单教程
2014/11/05 HTML / CSS
html5 canvas绘制矩形和圆形的实例代码
2016/06/16 HTML / CSS
幽默自我介绍演讲稿
2014/08/21 职场文书
信用卡工作证明模板
2014/09/14 职场文书
生产操作工岗位职责
2014/09/16 职场文书
国博复兴之路观后感
2015/06/02 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
详解Redis复制原理
2021/06/04 Redis
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL
mysql如何查询连续记录
2022/05/11 MySQL
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js