我正在尝试在OpenCV 2.4.9中使用SVM,而我在实现功能扩展方面遇到了问题。我正在运行教程“支持向量机简介”中的源代码:
http://docs.opencv.org/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html
当我只是复制粘贴代码并运行它时,它可以正常工作,显示:
然后我尝试通过进行2次修改将特征标准化为[0,1]:
在训练SVM之前添加trainingDataMat /= 512.f;
(从而规范化训练数据)
将预测步骤修改为float response = SVM.predict(sampleMat/512.f);
(从而规范化测试数据)。
执行此操作后,它会将所有值预测为同一个类,从而生成此图像:
我错过了什么?是否有一些额外的步骤来实现我不知道的功能标准化?
答案 0 :(得分:0)
我找到了一种可以产生所需行为的解决方法,但我必须承认我不确定为什么它会起作用。
正则化参数C
未在上述两个试验中指定,因此默认为1.但是,如果我在缩放版本中添加一行以将其指定为512(即我划分的值)我在扩展步骤中的功能),SVM运行正常!
我不明白为什么正则化术语太小会导致训练数据的错误分类,因为在这种情况下训练点可以线性分离。我的理解是,线性可分的训练数据的错误分类通常是C
太大的结果。