KNN算法又称最邻近算法,其核心思想是用待分类的数据与已知的数据进行一一比较,从所有已知数据中选出最相似的K个数据,在这最相似的K个数据中,哪一类的个数最多我们就判定未知数据属于哪一类。通俗来讲假设我们已经知道有一百人的人脸信息分属于三个地区,这时新来了一个人让你去判断他最可能来自哪个地区,KNN就是用这一个未知地区信息的人去和那一百个已知地区信息的人进行比对,从一百个里选出K个最像的人出来,假设这K个人中五个来自地区1,一个来自地区2,一个来自地区3,那么我们就判定这个人是来自地区1的。
所以KNN可以简化为以下两步:
1. 将待判断的未知数据样本和所有已知数据样本进行比较,选出最相似的K个
2. 从K个结果中进行投票,选出票数最多的结果作为预测结果
距离度量(Distance Metric)来比较图片
在计算机中,图像可以表示为矩阵数据的形式,那么我们对两张图片的比较实际是对两个矩阵进行比较。KNN中非常关键的一步是对图像进行比较来判断两张图片的相似程度,那么我们比较的方法实际是采用距离度量的方法,距离值的大与小就表示两张图片的相似程度。
距离的计算有两种计算公式,一种是Manhattan距离(L1 distance),一种是Euclidean距离(L2 distance)

通常采用的是L2 distance作为距离度量的方法,但具体选用L1还是L2应该依据使用的场景来进行选择,他们两的选择会影响训练出的分类器的准确率。
超参数K的选取
超参数是指需要预先设定,不能从数据中习得的参数,比如这里的K。K的具体取值同样也会影响最后分类器的准确性。K的选取是调参的过程,我们使用一部分数据进行分类器的训练,再用一部分数据去测试该K下的准确性,调制K的值重复这一过程,只至选取一个准确度最高的K。在实际应用中,我们希望的是能够用已知训练数据集得到的分类器去判断位置的数据的结果,并且这一结果具有高的准确度,所以在测试的时候我们还会准备一部分数据作为测试数据来判断这一分类器的表现。综上我们会将数据集分为训练数据(train),调试数据(validation),测试数据(test)这三部分。

还有一种交叉验证的方法是将数据分为多份(fold)和一个测试数据(test),取其中的几份作为训练数据,一份作为调试数据。比如fold1,2,3,4作为test,fold5作为validation。也可以让fold4作为validation,其余的作为test,这样可以进行交叉验证。不变的是只有当你的所有参数调整完以后才可以用test数据去测试结果的好坏。
