2015-01-09 25 views
1

我想在OpenCV 2.4.9中使用SVM,并且遇到了实现功能缩放的问题。我跑在本教程功能的源代码“介绍支持向量机”:opencv支持SVM无法使用缩放功能

http://docs.opencv.org/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html

当我只是复制粘贴代码并运行它,它工作得很好,这显示:

image

然后我试图通过使2个修改来归一化特征为[0,1]:

  1. 在训练SVM之前加入trainingDataMat /= 512.f;(因此规范化训练数据)

  2. 修改预测步骤为float response = SVM.predict(sampleMat/512.f);(因此规范化测试数据)。

这样做了以后,它预测的所有值是同一类,生产这种形象:

image

我缺少什么?是否有一些额外的步骤来实现我不知道的功能规范化?

+0

是否所有的列/功能都是从0到512? – carlosdc 2015-01-10 00:31:51

+0

告诉你什么,不关心这个问题,OpenCV的支持向量机不是很好。 – 2015-01-10 11:24:13

+0

而且,这不是功能规范化(通常)。虽然,我不明白常数的简单缩放应该如何对分类产生任何影响。你是否用数字检查了预测反应? – 2015-01-10 11:27:47

回答

0

我发现了一个可以产生所需行为的解决方法,但我必须承认我不确定为什么它可以工作。

正规化参数C在上述两个试验中都未指定,所以默认为1.但是,如果我在缩放版本中添加了一行以将其指定为512(即,缩放步骤),SVM运行良好!

我不明白的是,为什么正则化术语太小会导致训练数据错误分类,因为在这种情况下,训练点是线性可分的。我的理解是线性分离训练数据的错误分类通常是由于C太大而导致