神经网络学习引入-邻近算法Nearest Neighbor Classifier

邻近算法

这个分类算法与卷积神经网络无关,并且在实际应用中的使用也并不是特别广泛,但是通过对这个算法的学习,我们能够对图片分类问题有一个大致的解决思路。

L1距离与L2距离

给定的两个图片,将它们表现成两个矢量I1、I2,一个最容易理解、最容易被接受的对比它们的方法是L1距离
d 1 ( I 1 , I 2 ) = p I 1 p I 2 p d_{1}(I_{1},I_{2})=\sum_{p}|I_{1}^{p}-I_{2}^{p}|

  • 计算距离的另一方法
    有许多方法都可以用于计算两个矢量的距离,另一个常用的方法是L2距离
    d 2 ( I 1 , I 2 ) = p ( I 1 p I 2 p ) 2 d_{2}(I_{1},I_{2})=\sqrt{\sum_{p}(I_{1}^{p}-I_{2}^{p})^{2}}

  • L1距离和L2距离的对比
    在实际使用中,当计算两个矢量的区别的时候,L2距离比L1距离更能体现二者的区别。(In particular, the L2 distance is much more unforgiving than the L1 distance when it comes to differences between two vectors.)也就是说,L2距离倾向于将二者的差异放大。
    L1距离和L2距离(或者说两个图片的L1或L2距离)是最常用的评价两张图片差异的方法。

K邻近算法 K-Nearest neighbor Classifier

除了找到训练集中距离最近的一张图片之外,我们还希望可以通过寻找最近的k张图片来用于对待分类图片进行分类。

  • 如何选取一个合适的k?
    使用验证集(validation sets)来调整超参数。也就是说,所有的样本集会被分为三个部分:训练集,验证集,测试集。训练集用于训练模型,验证集用于调整超参数以寻找到一个最合适的超参数(传说中的炼丹),测试集用于评价整个模型的效率(准确率召回率这些东西的计算)。
    我们不能用测试集来调整超参数,这样的话我们的模型的结果仅仅只对该训练集有意义,失去了普遍性。也就是说测试集仅仅只在整个流程的最后使用且仅仅使用一次

交叉验证 Cross-validation

当我们手上的样本集数量非常小的时候,使用一个更为精巧的方法来进行超参数的调整——交叉验证方法。
在不同的验证集之间进行迭代并在最后将它们的得分取一个平均值作为最终得分
下面以5折交叉验证作为例子:先将训练集分为五等份A、B、C、D、E,然后选取其中的四份A、B、C、D用于训练,剩下的一份E作为验证集用于超参数的调整,得到一个评分 R 1 R_{1}
同样的,A、B、C、E作为训练集,D作为验证集,得到结果 R 2 R_{2} ;
A、B、D、E作为训练集,C作为验证集,得到结果 R 3 R_{3} ;
A、C、D、E作为训练集,B作为验证集,得到结果 R 4 R_{4} ;
B、C、D、E作为训练集,A作为验证集,得到结果 R 5 R_{5} ;
最终模型得分为 ( R 1 + R 2 + R 3 + R 4 + R 5 ) / 5 (R_{1}+R_{2}+R_{3}+R_{4}+R_{5})/5

在实际使用中,反而不是特别喜爱使用交叉验证,因为交叉验证需要消耗大量的计算资源。只有在样本集不充足,验证集能够获取的样本非常小的时候才使用交叉验证。

邻近算法的优缺点

  • 优点:实现简单,易于理解,训练时间短。
    因为邻近算法的训练过程只需要存储训练数据并建立索引

  • 缺点:测试时间长,占用过多的存储空间。
    给一个测试数据进行预测需要对比训练集中的每一个样本数据,倒置需要消耗很长的时间。
    在实际应用中,我们往往更关心一个模型的测试效率而不是很关心模型训练会占用的时间。
    邻近算法必须存储所有的训练数据,占用过多的存储空间。

猜你喜欢

转载自blog.csdn.net/AG9GgG/article/details/84498901