使用交叉验证的 KNN 分类器

Posted

技术标签:

【中文标题】使用交叉验证的 KNN 分类器【英文标题】:KNN Classifier using cross validation 【发布时间】:2014-06-04 03:19:31 【问题描述】:

我正在尝试使用交叉验证方法来实现 KNN 分类器,其中我有一个特定字符的不同图像用于训练(例如 5 个图像),另外两个用于测试。现在我通过简单地在训练时选择具有最小误差值的 K 来了解交叉验证的想法,然后将它与测试数据一起使用来确定我的结果有多准确。

我的问题是如何在 matlab 中训练图像以获得我的 K 值?我会比较它们并尝试找出不匹配的地方吗?!

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

首先,您需要准确定义您的任务。 F.ex 给定 R^(MxN) 中的图像 I,我们希望将 I 分类为包含人脸的图像或没有人脸的图像。

我经常使用像素分类器,其任务类似于:对于图像,我决定每个像素是人脸像素还是非人脸像素。

定义任务的一个重要部分是做出可以用作训练分类器的基础的假设。 F.ex 我们相信像素强度的分布可以用来区分人脸图像和不包含人脸的图像。

然后您需要选择一些定义您的图像的功能。这可以通过多种方式完成,您应该搜索其他人在分析您正在使用的相同类型的图像时会做什么。

像素分类中一种广泛使用的方法是使用像素强度值并对图像进行多尺度分析。多尺度分析的想法是,不同的结构在称为尺度的不同模糊级别上最为明显。作为一个插图,考虑一棵树的图像。在没有模糊的情况下,我们注意到精细的结构,例如小树枝和树叶。当我们模糊图像时,我们会注意到树干和主要分支。这通常用作分割方法的一部分。

当您了解自己的任务和特征后,您就可以训练分类器了。如果您使用 kNN 和交叉验证来找到最佳 k,您应该在训练/测试中拆分数据集,然后在训练/验证集中拆分训练集。然后,您使用缩减的训练集进行训练,并使用验证集来决定哪个 k 是最好的。在二元分类的情况下,例如人脸与非人脸,错误率通常用作衡量性能的指标。

最后,您使用参数在完整数据集上训练分类器并估计其在测试集上的性能。

分类示例:有奶还是无奶?

作为一个完整的例子,考虑从上方拍摄的一杯咖啡的图像,它显示了围绕着棕色圆盘的杯子边缘。进一步假设所有图像都经过缩放和裁剪,因此圆盘的直径相同,图像的尺寸也相同。为了简化任务,我们将彩色图像转换为灰度图像,并将像素强度缩放到 [0,1] 范围内。

我们想要训练一个分类器,使其能够区分加牛奶的咖啡和不加牛奶的咖啡。通过检查一些咖啡图像的直方图,我们看到每张图像的直方图中都有两个明显分开的“凸起”。我们认为这些凸起对应于前景(咖啡)和背景。现在我们假设前景的平均强度可以用来区分咖啡+牛奶/咖啡。

为了找到前景像素,我们观察到,因为前景/背景比率是相同的(根据设计),我们只需找到为每个图像提供该比率的强度值即可。然后我们计算前景像素的平均强度,并将这个值作为每张图像的特征。

如果我们有 N 个手动标记的图像,我们会将其分成训练集和测试集。然后我们计算训练集中每个图像的平均前景强度,给我们一组(平均前景强度,标签)值。我们希望使用 kNN,其中图像被分配与 k 个最接近图像的多数类相同的类。我们将距离测量为平均前景像素强度差的绝对值。

我们通过交叉验证搜索最优 k。我们使用 2 折交叉验证(又名保持)来找到最佳 k。我们测试 k = 1,3,5 并选择在验证集上给出最小预测误差的 k。

【讨论】:

@Silas...是的,我已经有了训练和测试数据。据你了解,我需要在训练时定义一些东西,以便在测试时寻找。例如,如果图像包含一定数量/颜色的像素,那么它将被匹配。问题是,它是否需要完全匹配,或者至少大部分都存在。示例:前 3 行像素应该代表对象像素 测试:前 3 行是对象像素,但有些像素是背景像素......这应该匹配还是不匹配?!如果我错了,请纠正我。 @omarsafwany 我添加了一个方法示例。需要注意的一点是,分类的难度与任务的一般性有关。因此,Google 街景中的对象识别/分类比咖啡示例要困难得多。

以上是关于使用交叉验证的 KNN 分类器的主要内容,如果未能解决你的问题,请参考以下文章

如何定义kNN分类器的最大k?

如何进行交叉验证 SVM 分类器

如何交叉验证朴素贝叶斯分类器?

如何在 keras 分类器中使用交叉验证

如何在朴素贝叶斯分类器中使用 k 折交叉验证?

如何在同一折叠上使用多个分类器运行 scikit 的交叉验证