我正在尝试使用函数 trainAuto 交叉验证我的训练数据,但出现错误::: OpenCV Error: Bad argument (虽然交叉验证一个或多个类已从样本中剔除。尝试减少)做火车。
当我将 trainAuto 功能更改为仅进行训练时,它可以工作,但我需要 trainauto。我需要验证我拥有的每个数据点,即 70 个点。我想要做的是交叉验证我的 trainingData 数组中的每个点。我所有的数据点和标签都存储在我的标签[70] 和 trainingData[70][2744] 数组中。当试图交叉验证我的训练数据时,我复制了我的 trainingData[70][2744] 中的每一行,除了应该测试的那一行,那一行被复制到 testData 数组中。这应该做 70 次,所以要进行 70 次测试。这是我的代码,任何帮助将不胜感激。
//my labels and points are stored here
int labels[70] = {};
float trainingData[70][2744] = {};
//this is where the copy of my test, labels and training data should end up for the cross validation
int labelstrain[69] = {};
float trainingDatatrain[69][2744] = {};
float testData[2744] = {};
//looping through everything and extracting test point, labels for the points and training data
for(int o = 0; o < 70; ++o){
memcpy(testData, trainingData[o], sizeof(testData));
for(int p = 0; p < 70; p++){
if(o != p){
labelstrain[p] = labels[p];
copy(trainingData[p], trainingData[p] + 2744, trainingDatatrain[p]);
}
else{
cout << "label that was left out: " <<labels[p]<< endl;
}
}
//creating matrix of my labels, test point and training data
Mat labelsMat(69, 1, CV_32SC1, labelstrain);
Mat trainingDataMat(69, 2744, CV_32FC1, trainingDatatrain);
Mat testDataMat(1, 2744, CV_32FC1, testData);
//here is my problem where i get a error. Only train here works fine
svmLin->trainAuto(ml::TrainData::create(trainingDataMat, ml::ROW_SAMPLE, labelsMat));
svmPoly->trainAuto(ml::TrainData::create(trainingDataMat, ml::ROW_SAMPLE, labelsMat));
svmRbf->trainAuto(ml::TrainData::create(trainingDataMat, ml::ROW_SAMPLE, labelsMat));
svmSig->trainAuto(ml::TrainData::create(trainingDataMat, ml::ROW_SAMPLE, labelsMat));
svmChi2->trainAuto(ml::TrainData::create(trainingDataMat, ml::ROW_SAMPLE, labelsMat));
svmInter->trainAuto(ml::TrainData::create(trainingDataMat, ml::ROW_SAMPLE, labelsMat));
//predicting on my point that is not in my trainingdata
float predictLin = svmLin->predict(testDataMat);
float predictPoly = svmPoly->predict(testDataMat);
float predictRbf = svmRbf->predict(testDataMat);
float predictSig = svmSig->predict(testDataMat);
float predictChi2 = svmChi2->predict(testDataMat);
float predictInter = svmInter->predict(testDataMat);
}