1. 距离计算,不要通过遍历每个样本来计算和指定样本距离,而是通过对于指定样本进行广播(复制)成为一个shape和全局一致后,再进行整体计算,这里的广播 / 复制采用的是tile函数来实现的:
2. numpy的排序函数argsort,这个函数可以默认按照冒泡排序进行排序;对于一维数组,正序排列正常传入数组即可返回np.argsort(x);如果是逆序则是np.argsort(-x);类似的对于二维数组,需要指定一下axis,如果0代表按照列进行排序,axis=1代表按照行进行排序;
3. 对于字典的排序,可以使用sorted函数,来进行排序;这里牵涉到python常见的排序函数:
1)python内置的sort函数,这个函数特点就是没有返回值,原始数组将会被改变;
a = [2,5,1,3,0,1,8]
a.sort()
a
2)sorted函数,也是python内置函数,他不会改变原始数组内容;而是返回一个新的对象;其中有一个key参数,这个参数代表的是一个处理函数,一种是lamba,通过lamba匿名函数的模式来指定排序列:
s = [('a', 'zhangsan', 17), ('b', 'lisi', 23), ('c', 'lisi', 10)]
sorted(s, key=lambda x: x[2])
sorted(s, key=lambda x: x[0])
另外一个强大的排序模式就是operator,需要import operator之后才可以使用,在指定单列排序上其实和lambda是类似的,但是强大在于可以进行多级排序,类似于sql中groupby可以针对多个字段进行排序;
print(sorted(s, key=operator.itemgetter(2)))
print(sorted(s, key=operator.itemgetter(1,2)))
3)numpy.argsort,参见上一条介绍。
4. 对于tile函数,注意是numpy里面的函数,其第一个参数也是np.array;在手写体的判断实现中,我错误的传入了python原生的List类型,导致内存错误(MemoryError),开始的时候我以为是因为内存溢出,但是通过sys.getsizeof来查看发现python原生的List对象其实占用的空间更小;于是排查了一下,发现tile的函数接收的是“array_like",即numpy里面的数组类型。
 
def knnClassifier2(sample, dataset, labels, knum):
rowsCount = len(dataset)
diff = tile(sample, (rowsCount, 1)) - dataset
diffSq = diff **2
diffSqSum = diffSq.sum(axis=1)
distance = diffSqSum ** 0.5
cls2count={}
sortedIndics=distance.argsort()
'''
for index in sortedIndics:
cls =labels[index]
cls2count[cls] = cls2count.get(cls, 0) + 1
'''
for index in range(knum):
cls = labels[sortedIndics[index]]
cls2count[cls] = cls2count.get(cls, 0) + 1
sortedCls2count = sorted(cls2count.items(), key=lambda x:x[1], reverse=True)
 
return sortedCls2count[0][0]

KNN手写实践:Python基于数据集整体计算以及排序的更多相关文章

  1. 机器学习实战一:kNN手写识别系统

    实战一:kNN手写识别系统 本文将一步步地构造使用K-近邻分类器的手写识别系统.由于能力有限,这里构造的系统只能识别0-9.需要识别的数字已经使用图形处理软件,处理成具有相同的色彩和大小:32像素*3 ...

  2. 手写算法-python代码实现KNN

    原理解析 KNN-全称K-Nearest Neighbor,最近邻算法,可以做分类任务,也可以做回归任务,KNN是一种简单的机器学习方法,它没有传统意义上训练和学习过程,实现流程如下: 1.在训练数据 ...

  3. linux-基于tensorflow2.x的手写数字识别-基于MNIST数据集

    数据集 数据集下载MNIST 首先读取数据集, 并打印相关信息 包括 图像的数量, 形状 像素的最大, 最小值 以及看一下第一张图片 path = 'MNIST/mnist.npz' with np. ...

  4. 学习笔记TF020:序列标注、手写小写字母OCR数据集、双向RNN

    序列标注(sequence labelling),输入序列每一帧预测一个类别.OCR(Optical Character Recognition 光学字符识别). MIT口语系统研究组Rob Kass ...

  5. opencv实现KNN手写数字的识别

    人工智能是当下很热门的话题,手写识别是一个典型的应用.为了进一步了解这个领域,我阅读了大量的论文,并借助opencv完成了对28x28的数字图片(预处理后的二值图像)的识别任务. 预处理一张图片: 首 ...

  6. 机器学习(二)-kNN手写数字识别

    一.kNN算法是机器学习的入门算法,其中不涉及训练,主要思想是计算待测点和参照点的距离,选取距离较近的参照点的类别作为待测点的的类别. 1,距离可以是欧式距离,夹角余弦距离等等. 2,k值不能选择太大 ...

  7. OpenCV手写数字字符识别(基于k近邻算法)

    摘要 本程序主要参照论文,<基于OpenCV的脱机手写字符识别技术>实现了,对于手写阿拉伯数字的识别工作.识别工作分为三大步骤:预处理,特征提取,分类识别.预处理过程主要找到图像的ROI部 ...

  8. kaggle 实战 (1): PCA + KNN 手写数字识别

    文章目录 加载package read data PCA 降维探索 选择50维度, 拆分数据为训练集,测试机 KNN PCA降维和K值筛选 分析k & 维度 vs 精度 预测 生成提交文件 本 ...

  9. 利用TensorFlow识别手写的数字---基于Softmax回归

    1 MNIST数据集 MNIST数据集主要由一些手写数字的图片和相应的标签组成,图片一共有10类,分别对应从0-9,共10个阿拉伯数字.原始的MNIST数据库一共包含下面4个文件,见下表. 训练图像一 ...

随机推荐

  1. day 29 socket 初级版

    # 客户端介绍简单版# import socket# #1买手机# phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STR ...

  2. C++连接mysql数据库的两种方法

    本文主要介绍了C++连接mysql数据库的两种方法,希望通过本文,能对你有所帮助,一起来看. 现在正做一个接口,通过不同的连接字符串操作不同的数据库.要用到mysql数据库,以前没用过这个数据库,用a ...

  3. Day18作业及默写

    人狗大战 #!/usr/bin/env python # encoding: utf-8 # Author: MeiMeiLong <2559184081@qq.com> # Create ...

  4. python day10作业

  5. wx小程序获取用户位置信息

    wx小程序内置的接口只能获取用户的坐标,通过微信位置服务获取用户地址: http://lbs.qq.com/qqmap_wx_jssdk/index.html 注:需要在key的设置中打开webSer ...

  6. L2-008. 最长对称子串

    L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...

  7. SQL注入之Sqli-labs系列第二十六关(过滤空格、注释符、逻辑运算符注入)和第二十六A

    开始挑战第二十六关(Trick with comments and space) 0x1看看源代码 (1)过滤了#  or and  /**/  /  \ ,通过判断也过滤了空格 (2)这样一来只能看 ...

  8. 微软Power BI 每月功能更新系列——5月Power BI 新功能学习

    Power BI Desktop 5月份功能摘要 本月Power BI Desktop除了许多报表功能的更新,Power BI对条件格式进行了重大改进,可以对报表的任何字段(包括字符串和日期)进行条件 ...

  9. Maven项目的结构分析

    上图为简单的Maven结构,其中用src/main/resources写项目配置文件,src/main/java写项目的java文件,src/test/java写java测试类文件.

  10. Nginx配置之location模块和proxy模块

    1.location指令的用法介绍 Location主要用来匹配url,如:http://www.beyond.com/nice,在这里对于location来说www.beyond.com是域名,/n ...