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. pthread库实现一个简单的任务池

    pthread库实现一个简单的任务池 类关系图: 说明:         1:TaskManager类管理Task类,Task类是一个纯虚类;         2:ThreadManager类管理Th ...

  2. 搭建Django项目

    命令行搭建Django项目 1.安装django 在指定解释器环境下安装django 1.11.9 在真实python3环境下: pip3 install django==1.11.9 在虚拟环境下: ...

  3. Day8作业及默写

    1,有如下文件,a1.txt,里面的内容为: 老男孩是最好的培训机构, 全心全意为学生服务, 只为学生未来,不为牟利. 我说的都是真的.哈哈 分别完成以下的功能: 将原文件全部读出来并打印. with ...

  4. L2-001. 紧急救援(最短路的变形)*

    L2-001. 紧急救援 #include <cstdio> #include <algorithm> using namespace std; ; int const INF ...

  5. mac os x lipo 工具

    lipo是管理Fat文件的工具,可以查看平台列表,提取.重新打包 dreamdeMac-mini:test dream$ lipo -info libtest001.a Architectures i ...

  6. Xposed Hook & Anti-hook

    一点简单记录. xposed原理包括将hook的method转为Native.因此可检测如下: for (ApplicationInfo applicationInfo : applicationIn ...

  7. tmux允许鼠标滚动

    /********************************************************************** * tmux允许鼠标滚动 * 说明: * 默认tmux貌 ...

  8. Project篇:项目1

    项目: 步骤: (1)布置项目 (2)独立完成项目设计 (3)项目框架讲解 (4)独立完成项目功能编写 (5)项目讲解 项目内容介绍: 项目开发流程: 需求分析------>概要设计------ ...

  9. Fedora瘦身

    启用的服务 systemctl list-unit-files --type=service | grep enabled 所有服务 systemctl list-unit-files --type= ...

  10. C++ 作业 (循环链表构建队列)

    /* author screen name Andromeda_Galaxy; chinese name 杨子俊 */ #include<bits/stdc++.h> using name ...