gpt4 book ai didi

c++ - CvSVM 回归只预测整数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:53:08 25 4
gpt4 key购买 nike

我正在尝试使用 this 来熟悉 CvSVM包含 590 张图像的手动标记数据库,从 0-5 分级(0 为模糊,5 为完美)。如果等级 <3,我将其标记为 0(模糊),如果 >=3,我将其标记为 1(清晰)。

对于功能,我只是使用五种不同的通用指标进行模糊评估。每个都通过训练数据中的均值和标准差进行标准化。相同的训练均值和标准差也用于标准化测试数据。

出于某种原因,我的 SVM 只能预测整数。我已经检查了 int 转换和其他愚蠢的错误,但无法弄清楚。我意识到我的特征可能不是很健壮,因为不同图像之间存在很大差异(标准化不是很有帮助,因为标准化测试特征的范围最终大于训练特征的范围),但仍然我觉得我应该得到一些小数预测,即使它们不准确。

训练:

// data format is [ img1 grade feature1 feature2 ... feature5, img2... ]
void train_svm(CvSVM& svm, const Mat& data)
{
CvSVMParams params;
params.svm_type = CvSVM::EPS_SVR;
params.kernel_type = CvSVM::RBF;
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, (int)1e8, FLT_EPSILON);

CvParamGrid Cgrid(.01, 100, exp(1));
CvParamGrid gammaGrid(.01, 10, exp(.05));
CvParamGrid pGrid(.01, 1.8, exp(.01));

params.C = Cgrid.min_val;
params.gamma = gammaGrid.min_val;
params.p = pGrid.min_val;

// split features from grades
Mat features = data.colRange(2, data.cols);
Mat grades = data.colRange(1, 2);

try
{
svm.train_auto(features, grades, Mat(), Mat(), params, 10,
Cgrid,
gammaGrid,
pGrid,
CvSVM::get_default_grid(CvSVM::NU),
CvSVM::get_default_grid(CvSVM::COEF),
CvSVM::get_default_grid(CvSVM::DEGREE),
false);
}
catch (Exception e)
{
params = svm.get_params();
qDebug() << params.C << params.gamma << params.p;
}
params = svm.get_params();

svm.train(features, grades, Mat(), Mat(), params);
}

测试:

void test_svm(const CvSVM& svm, const Mat& data)
{
Mat features = data.colRange(2, data.cols);
Mat grades = data.colRange(1, 2);

int num_test = features.rows;
assert(features.rows == grades.rows);

Mat results(num_test, 1, CV_32FC1);

svm.predict(features, results);
qDebug() << "Act\t\tPred";
for (int i = 0; i < num_test; i++)
{
float actual = grades.at<float>(i, 0);
float predicted = results.at<float>(i, 0);
qDebug() << actual << "\t" << predicted;
}
}

预测总是 0 或 1。没有小数。

谁能找出我做错了什么?

最佳答案

我认为您将分类 (n>=2) 与回归 (n=2) 混合在一起。基本 SVM 计算单个超平面来分离 2 个类。有 2 个概括:要么计算所有类之间的多个超平面(n>2 分类),要么如果您有一个超平面,则可以确定新点与该超平面的距离。

但假设您在第 1 类和第 3 类之间有一个超平面,并且有一个点落在边界上。您不能只预测第 2 类,因为它位于 1 和 3 的边界上。

关于c++ - CvSVM 回归只预测整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24814496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com