opencv SVM不适用于缩放功能

时间:2015-01-09 22:53:39

标签: c++ opencv svm

我正在尝试在OpenCV 2.4.9中使用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);(从而规范化测试数据)。

  3. 执行此操作后,它会将所有值预测为同一个类,从而生成此图像:

    image

    我错过了什么?是否有一些额外的步骤来实现我不知道的功能标准化?

1 个答案:

答案 0 :(得分:0)

我找到了一种可以产生所需行为的解决方法,但我必须承认我不确定为什么它会起作用。

正则化参数C未在上述两个试验中指定,因此默认为1.但是,如果我在缩放版本中添加一行以将其指定为512(即我划分的值)我在扩展步骤中的功能),SVM运行正常!

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