【发布时间】: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]:
在训练 SVM 之前添加
trainingDataMat /= 512.f;(从而规范化训练数据)将预测步骤修改为
float response = SVM.predict(sampleMat/512.f);(从而标准化测试数据)。
执行此操作后,它预测所有值是同一类,生成此图像:
我错过了什么?是否有一些我不知道的实现特征规范化的额外步骤?
【问题讨论】:
-
您的所有列/功能是否都从 0 变为 512?
-
告诉你什么,不仅仅是这个问题,OpenCV 的 SVM 不好。
-
而且,这不是特征标准化的方式(通常)。虽然,我看不出一个简单的常数缩放应该如何对分类产生任何影响。您是否以数字方式检查了预测响应?
-
@carlosdc 此代码生成 4 个具有 2 个特征和 2 个类的训练数据点,训练一个线性 SVM,然后预测 512x512 网格上每个点的类(生成上面的图像,用训练标记为圆圈的点)。特征本身是
float值,范围从 0 到 511。 -
@a-Jays 我最初将功能缩放到 [-1 1],但在提出问题之前我将其简化为上述方案,因此我的代码将尽可能与原始代码相似。关于检查响应,除了代码运行的参数扫描(生成发布的图像)之外,我还在调试模式下检查了响应。它们与图形输出相匹配。是否有其他检查您的回复的方法?