你可以注意到当我们做预测的时候,如果仅仅用最近的图片的是远远不够的。其实,我们更常用的是k近邻分类器。这个思想非常简单。代替寻找训练集中最近的图片,我们会寻找k个最相近的图片,并且让他们再测试图片上投票。特别的,再k=1的时候,我们已经涵盖了最近邻分类器。只管来说,更高的k值有一个平滑的影响使得分类器对极端值有更好的处理:


这张图表达了最近邻分类,和5-最近邻分类之间的差距,用二维的电荷3个类别(红色、蓝色、绿色区域)。标记颜色的区域可以展示出通过过L2距离计算出的决策范围。白色部分展示的是有歧义的点(例如,类别投票至少要有两种类型)。可以看到再一个最近邻分类器中,异常数据点(例如,再蓝色点中的绿色点)创建了一个很小的独立不正确预测区域,然而5-近邻分类器平滑的忽略了这些非法数据,而且提高了测试数据的一般性。我们也可以看到5-近邻的灰色区域图片也被近邻选票所约束(例如,2个近邻是红色,另两个是蓝色,最后一个是绿色)。
实际中,你会经常想要使用k近邻。但是k的值取多少。下面我们将解释这个问题。

验证集的超参数调优

k近邻分类器需要一个k值的设置。但是那个数字是最好的呢?并且,我们看到还有很多不同的距离函数我们使用过:L1norm,L2norm,这里还有许多其他的我们没有考虑的函数(例如,向量点积)。这些都叫超参数并且他们经常出现在机器学习算法的设计中。有时候选择一个什么样的参数并不明显。
你可能想我们应该尝试不同的值看哪个表现的最好。这是一个很好的想法并且这也就是我们要做的。但是这必须很小心的取尝试。特别的,我们不能用测试集来调整超参数。无论你何时设计机器学习算法,你应该考虑测试集作为一个最先考虑的资源。因此,最真实的危险就是你可以调整你的超参数再测试集上运行的很好,但是如果你把你的模型运用到真实场景中去,效果就会大打折扣。实际中,我们都会说你过拟合了你的测试集。另一个方面,当你使用他的时候,如果你把超参数测试运用在测试集上,那么你会再测试集中有很好的效果,并且因此你的测试集准确率会提高。但实际上并没有那么高。但如果你仅仅在最后使用测试集,这里还是存在着测试一个普遍性分类器的参数(在以后的课程中会有)。
仅仅再最后使用一次测试集评估
幸运的是,这里有一个正确的方法去测试你的超参数并且不会接触到测试集。这个想法就是把你的训练集一分为二:一个很小的训练集,我们叫做验证集。使用CIFAR-10做个例子,我们可以使用49000作为训练集,剩下的1000个作为验证集。这个验证集就是用来调超参数的。
这里有一个很像CIFAR-10的例子:

# assume we have Xtr_rows, Ytr, Xte_rows, Yte as before
# recall Xtr_rows is 50,000 x 3072 matrix
Xval_rows = Xtr_rows[:1000, :] # take first 1000 for validation
Yval = Ytr[:1000]
Xtr_rows = Xtr_rows[1000:, :] # keep last 49,000 for train
Ytr = Ytr[1000:]# find hyperparameters that work best on the validation set
validation_accuracies = []
for k in [1, 3, 5, 10, 20, 50, 100]:# use a particular value of k and evaluation on validation datann = NearestNeighbor()nn.train(Xtr_rows, Ytr)# here we assume a modified NearestNeighbor class that can take a k as inputYval_predict = nn.predict(Xval_rows, k = k)acc = np.mean(Yval_predict == Yval)print 'accuracy: %f' % (acc,)# keep track of what works on the validation setvalidation_accuracies.append((k, acc))

在最后一个过程,我们可以画一个图来展示哪个k值可以得到最好的结果。我们会把这个值与真实测试集来评估准确率。
将你的测试集分为训练集和验证集。用验证集来调所有的参数。在最后运行一次测试集并且报告准确率。

交叉验证.

再这些例子中你的训练集的大小会是很小的,人们有时会使用随机调参技术叫做交叉验证。再考虑上一个例子,这个思想就是不再玄奇前一千个点来做验证集,二十你可以获取一个更好的并且更少噪音的评估。例如,再5-个交叉验证中,我们可以把训练集分为5整份,用四个做训练,1个做验证。我们会迭代哪个是验证集,评估性能,并且最终再不同的集合中平均性能。


针对k值的5份交叉验证。针对每个k值我们训练四份并且再第五份上评估。对于每一个k我们接受一个再验证集上的准确率(y轴就是准确率,每个结果就是一个点)。趋势线由针对每个k的平均结果并且偏差显示为标准差。在这个特殊的例子中,交叉验证中表示当k=7的时候再这个特殊数据集中表现最好(对应图中最高点)。如果我们把数据集切割成更多份,我们会看到更平滑的曲线。

实际中.

在实际中,人们更喜欢避免交叉验证而是选择用一个单独验证集,由于交叉验证是非常耗时的。分割人们趋向于使用50%-90%的训练集剩下的用验证。然而,这取决于多种因素:例如如果超参数的数字非常大那么你情愿用更大的验证集。如果很小,用交叉验证是更安全的。实际中典型的份额就是3份、5份、和十份交叉验证。

常规数据分块。一个训练和测试集给了。一个训练集被分为几份(例如五份)。1-4份训练集。一份(例如图中黄色部分)作为验证集并且用来测试超参数。交叉验证会迭代每一份作为验证集,从1到5。这会叫做5份交叉验证。在每个最后验证过后并且所有最好的超参数决定以后,模型会在测试集中评估一次。

近邻分类器的优点和缺点

来评价以下近邻分类器的好坏是值得的。很明显,一个优点就是很容易实现和理解。另外,分类器没有时间训练,由于所有训练数据需要存储和索引。然而,我们在测试时间上花费很多,由于区分一个测试用例需要与每一个训练数据来对比。这点很不好,由于在实际中我们通常会更加关注测试时间而不是训练时间。实际上,这节课后面的深度神经网络把这个权衡弄到了另外一个极限:他们训练起来非常耗时,然而一旦训练好了,就很容易去区分一个样本。这种模式更适合于实际中。
另一方面,近邻分类器的计算复杂度是一个很活跃的领域,并且有很多合适的近邻算法(ANN)和库存在可以加速计算效率(例如,FLANN)。
最近邻算法有时可以在许多地方使用,但是很少在图片识别中使用。一个问题就是图片是高维的对象。并且高维空间的距离是非常不直观的。以下图片就是两个图片的L2相似度:


高维数据的基于像素距离非常直观。一个原始图片(左)和三个其他图片都是在L2距离上都是很远的。很明显,像素距离并不能很好的响应抽象的相似度。
这里有一个更加可视化的图片让你相信用像素来对比图片的不同是不够的。我们可以用一个可视化工具叫t-SNE来展示CIFAR-10的图片并且把他们在二维中嵌入这样他们之间的距离就被很好展示出来。图片中,图片旁边的图片被看作是L2距离很近的图片。

图片分类-K近邻分类器相关推荐

  1. 机器学习 —— 基础整理(三)生成式模型的非参数方法: Parzen窗估计、k近邻估计;k近邻分类器...

    本文简述了以下内容: (一)生成式模型的非参数方法 (二)Parzen窗估计 (三)k近邻估计 (四)k近邻分类器(k-nearest neighbor,kNN) (一)非参数方法(Non-param ...

  2. k近邻分类器的使用:简单例子

    #k近邻分类器的简单例子 from sklearn.neighbors import KNeighborsClassifier #创建一组数据x和它对应的标签y: x = [[0], [1], [2] ...

  3. K近邻分类器(李飞飞CS231n学习笔记---lecture2:K最近邻算法)

    在讲解K近邻分类器之前,我们先来看一下最近邻分类器(Nearest Neighbor Classifier),它也是K = 1时的K近邻分类器. 目录 最近邻分类器 定义 存在问题 K近邻分类器(KN ...

  4. python分类器分5类_Python机器学习之K近邻分类器

    KNN 现在,如果我们有一个分类任务.需要用到scikit-learn库的分类器对象. 分类器要完成的任务是,给定一种鸢尾花卉的测量数据,为这种花卉分类.最简单的分类器是近邻分类器.近邻算法搜索训练集 ...

  5. Iris鸢尾花卉数据集算法练习——PCA和K近邻分类器

    本文章主要以sklearn中的Iris鸢尾花数据集为训练对象,练习了PCA和K-近邻算法的使用,以下为笔记内容: Iris数据集也叫安德森鸢尾花卉数据集,通过测量了三种不同花卉(山鸢尾.变色鸢尾和维吉 ...

  6. svm实现图片分类(python)_SVM分类器python实现

    本作业的目标如下: implement a fully-vectorized loss function for the SVM implement the fully-vectorized expr ...

  7. python 机器学习——K 近邻分类理论及鸢尾( Iris )数据集实例操作

    K 近邻分类理论及鸢尾( Iris )数据集实例操作 一.K 近邻分类理论 二.K 近邻分类实例操作 (1)导入数据 划分训练集测试集 (3)数据标准化 (4)用 K 近邻法建立模型 (5)性能评估 ...

  8. 基于k近邻算法的干豆品种分类

    摘 要 近年来,干豆由于其较高的营养价值和良好的口感越来越受到人们的欢迎.其种类繁多且易于种植,是世界食用作物中产量最高的一种.干豆品种分类对干豆培育方向.产量需求和品质改良具有重要意义.本文以k近邻 ...

  9. 【机器学习】原理与实现k近邻算法

    文章目录 系列文章目录 前言 一.k近邻算法是什么? 二.使用步骤 1.引入库 2.读入数据 总结 前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了 ...

最新文章

  1. Android视频拍摄功能总结
  2. 物理约束相关问题梳理
  3. 口令加密算法 - Java加密与安全
  4. mysql 不能添加外键 1215_MySQL错误1215:无法添加外键约束
  5. linux中top工具,Linux命令工具 top详解
  6. 使用Thread类和Runnable方法来创建一个线程的区别
  7. Could not connect to SMTP host: smtp.163.com, port: 25;阿里云 ECS
  8. 2020-10-24 pandas导入出现错误或者警告解决方案
  9. 性能测试--jmeter如何发送post请求【4】
  10. Introduction to Computer Networking学习笔记(二十):TCP拥塞控制-基本方法 AIMD
  11. 张尚老师  一位把心理学融入每一堂课程的实战教练式管理专家。学员追捧的大哥哥老师~
  12. 联想Y470 非虚拟机安装苹果Mac OS X Mavericks 10.9.1教程详解(文字+图片),通俗易懂亲自动手——序列二之镜像写入,引导建立
  13. python怎么画长方形_画一个漂亮的长方形
  14. Excel使用技巧:合并单元格如何分组排序
  15. RFID NFC NfcA NfcB NfcF NfcV Ndef NdefFormatable相关详解
  16. 细说pc端微信扫码登录
  17. C Primer Plus 第十二章 课后答案
  18. 本机访问VMware虚拟机中网页的方法
  19. jzoj 1006: 【入门】求商数和余数
  20. 知名硅谷黑客当街被刺身亡!年仅43岁,马斯克都怒了

热门文章

  1. 163邮箱苹果设置不成功_怎么样才能让自己服务器发出的邮件不被 Gmail、Hotmail、163、QQ 等邮箱放入垃圾箱...
  2. python——常用的数学计算公式
  3. 基于SSM酒店管理系统
  4. kubernetes 入门实践-搭建集群
  5. 安防海量高清视频无损压缩—四川省智慧公共安全系统案例
  6. 第三周 AVI、MP4、WAV文件格式
  7. 56.com flash http://www.56.com/deux4_97177389.swf
  8. IP 地址冲突检测程序源码(解决某种情况下检测无效的问题)
  9. 关于四舍六入五成双的问题
  10. 【iOS】关于keyWindow的获取