【问题标题】:opencv SVM doesn't work with scaled featuresopencv SVM 不适用于缩放特征
【发布时间】:2023-03-29 05:13:01
【问题描述】:

我正在尝试在 OpenCV 2.4.9 中使用 SVM,但在实现特征缩放时遇到了问题。我正在运行教程“支持向量机简介”中的源代码:

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

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

然后我尝试通过进行 2 次修改将特征标准化为 [0,1]:

  1. 在训练 SVM 之前添加 trainingDataMat /= 512.f;(从而规范化训练数据)

  2. 将预测步骤修改为float response = SVM.predict(sampleMat/512.f);(从而标准化测试数据)。

执行此操作后,它预测所有值是同一类,生成此图像:

我错过了什么?是否有一些我不知道的实现特征规范化的额外步骤?

【问题讨论】:

  • 您的所有列/功能是否都从 0 变为 512?
  • 告诉你什么,不仅仅是这个问题,OpenCV 的 SVM 不好
  • 而且,这不是特征标准化的方式(通常)。虽然,我看不出一个简单的常数缩放应该如何对分类产生任何影响。您是否以数字方式检查了预测响应?
  • @carlosdc 此代码生成 4 个具有 2 个特征和 2 个类的训练数据点,训练一个线性 SVM,然后预测 512x512 网格上每个点的类(生成上面的图像,用训练标记为圆圈的点)。特征本身是 float 值,范围从 0 到 511。
  • @a-Jays 我最初将功能缩放到 [-1 1],但在提出问题之前我将其简化为上述方案,因此我的代码将尽可能与原始代码相似。关于检查响应,除了代码运行的参数扫描(生成发布的图像)之外,我还在调试模式下检查了响应。它们与图形输出相匹配。是否有其他检查您的回复的方法?

标签: c++ opencv svm


【解决方案1】:

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

正则化参数C在上面的两个试验中都没有指定,所以它默认为1。但是,如果我在缩放版本中添加一行将其指定为512(即我划分特征的值在缩放步骤中),SVM 工作正常!

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

【讨论】:

    猜你喜欢
    • 2015-12-09
    • 2014-12-01
    • 2020-05-31
    • 2012-03-13
    • 2012-06-01
    • 2012-04-19
    • 2015-09-24
    • 2021-06-22
    • 2012-08-27
    相关资源
    最近更新 更多