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. <Spark><Tuning and Debugging>

    Overview 这一部分我们主要讨论如果配置一个Spark application,如何tune and debug Spark workloads 配置对Spark应用性能调优很重要.我们有必要理 ...

  2. kbmMW安全第#3 - 基于硬件的随机数#2

    在之前的基于硬件的随机数博文中,我介绍了如何使用基于外部硬件的随机数生成器,来生成高质量的随机数. 但是,后来英特尔和AMD的CPU也包含随机值生成器.从2015年6月开始,来自Ivy Bridge的 ...

  3. JAVA自动补全代码

    打开eclipse(对myeclipse同样适用) 找到窗口(windows)菜单,打开最后一项首选项(Preferences)找到下属菜单java打开,打开里边的编辑器(Editor)菜单,点击内容 ...

  4. 一个跳转提示页面---JS

    //一个跳转提示页面   <script type="text/javascript">   var s=5;     function go(){        do ...

  5. Android内核sys_setresuid() Patch提权(CVE-2012-6422)

    让我们的Android ROOT,多一点套路. 一.简单套路 CVE-2012-6422的漏洞利用代码,展示了另一种提权方法.(见附录) 这也是一个mmap驱动接口校验导致映射任意内核地址的洞.将内核 ...

  6. todolist待办事项

    使用html/css原生js实现待办事项列表: 支持添加待办事项,删除待办事项,切换待办事项的状态(正在进行,已经完成) 支持对正在进行以及已经完成事项编辑(单击内容即可编辑) 源代码:链接:http ...

  7. pip install GitHub package

    /********************************************************************************* * pip install Git ...

  8. Python3中的运算符

    一.Python3中的运算符 强调这是Python3中的运算符 +    加法 -     减法 *     乘法 /     除法 //    整除,只要整数部分 **   幂运算 %   取余数 ...

  9. P1220 关路灯 (区间dp)

    题目链接:传送门 题目大意: 总共有N盏灯,老张从点C(1 ≤ C ≤ N)开始关灯(关灯不需要等待时间,C点的灯直接关掉),与此同时灯开始烧电(已知功率Pi). 老张每次可以往左走关最近的灯或者往右 ...

  10. P1242 新汉诺塔(搜索+模拟退火)

    题目链接:传送门 题目大意: 汉诺塔,给定n个盘子(n <= 45),起始状态和结束状态,求最小的步数以及路径. 思路: 考虑用dfs贪心地将剩余最大盘归位. #include<bits/ ...