OpenCV SVM trainAuto ошибка: неверный аргумент (при перекрестной проверке один или несколько классов были исключены из выборки) - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь провести перекрестную проверку моих данных обучения с помощью функции trainAuto, и я получаю ошибку ::: OpenCV Error: неверный аргумент (При перекрестной проверке один или несколько классов были исключены из выборки. Попробуйтеуменьшить) в do_train.

Когда я меняю функцию 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);
}
...