我正在尝试使用交叉验证方法来实现KNN分类器,其中我具有用于训练的特定字符的不同图像(例如,5个图像),并且另外两个用于测试。现在我通过在训练和训练时选择具有最小误差值的K来获得交叉验证的想法。然后将其与测试数据一起使用,以查找结果的准确程度。
我的问题是如何在matlab中训练图像以获得我的K值?我是否比较它们并试图找到不匹配或什么?!
任何帮助都会非常感激。
答案 0 :(得分:3)
首先,您需要准确定义任务。 F.ex在R ^(MxN)中给出一个图像I,我们希望将I分类为包含面部的图像或没有面部的图像。
我经常使用像素分类器,其任务类似于:对于图像,我决定每个像素是面像素还是非面像素。
定义任务的一个重要部分是做出一个假设,可以作为训练分类器的基础。 F.ex我们相信像素强度的分布可用于区分面部图像和不包含面部的图像。
然后,您需要选择一些定义图像的功能。这可以通过多种方式完成,您应该在分析您正在使用的相同类型的图像时搜索其他人的行为。
像素分类中一种广泛使用的方法是使用像素强度值并对图像进行多尺度分析。多尺度分析的想法是不同的结构在称为尺度的不同模糊水平上最明显。作为例证考虑树的图像。没有模糊,我们注意到精细的结构,如小树枝和树叶。当我们模糊图像时,我们会注意到树干和主要树枝。这通常用作分割方法的一部分。
当您了解任务和功能时,您可以训练分类器。如果您使用kNN和交叉验证来查找最佳k,则应在训练/测试中拆分数据集,然后在训练/验证集中拆分训练集。然后使用简化训练集训练并使用验证集来确定哪个k是最佳的。在二元分类的情况下,例如面对非面,错误率通常用作衡量绩效的指标。
最后,您使用参数在完整数据集上训练分类器并估计其在测试集上的性能。
分类示例:有无牛奶?
作为一个完整的例子,考虑从上面拍摄的一杯咖啡的图像,因此它显示了杯子的边缘围绕着一个棕色的圆盘。进一步假设所有图像都被缩放和裁剪,因此盘的直径是相同的,并且图像的尺寸是相同的。为了简化任务,我们将彩色图像转换为灰度,并将像素强度缩放到[0,1]范围。
我们想要训练一个分类器,这样就可以区分咖啡加牛奶和没有牛奶的咖啡。通过检查一些咖啡图像的直方图,我们看到每个图像都有两个"凸起"在直方图中明确分开。我们相信这些颠簸对应于前景(咖啡)和背景。现在我们假设前景的平均强度可以用来区分咖啡+牛奶/咖啡。
为了找到前景像素,我们观察到因为前景/背景比率相同(按设计),我们可以找到给出每个图像比率的强度值。然后我们计算前景像素的平均强度,并将此值用作每个图像的特征。
如果我们手动标记了N个图像,我们将其分为训练和测试集。然后,我们计算训练集中每个图像的平均前景强度,给出一组(平均前景强度,标签)值。我们想要使用kNN,其中图像被分配与k个最近图像的多数类相同的类。我们将距离测量为平均前景像素强度差异的绝对值。
我们通过交叉验证搜索最佳k。我们使用2倍交叉验证(aka holdout)来找到最佳k。我们测试k = {1,3,5}并选择在验证集上给出最小预测误差的k。