Я использую opencv3 для Visual Studio 2017, кодирование на C ++, для Surface Pro (Windows 10 64-разрядная версия).
Я хочу обучить дерево решений, чтобы оно могло предсказывать с помощью регрессии.Мне нужно, чтобы он мог прогнозировать между ответами, которых не было в представленном обучающем наборе.Например, этот код:
cv::Mat samples(6, 1, CV_32FC1);
samples.at<float>(0, 0) = 1.5;
samples.at<float>(1, 0) = 2.7;
samples.at<float>(2, 0) = 3.8;
samples.at<float>(3, 0) = 4.3;
samples.at<float>(4, 0) = 5.4;
samples.at<float>(5, 0) = 5.2;
cv::Mat responses = samples.clone();
cv::Mat samples2(5, 1, CV_32FC1);
samples2.at<float>(0, 0) = 1.8;
samples2.at<float>(1, 0) = 2.5;
samples2.at<float>(2, 0) = 3.6;
samples2.at<float>(3, 0) = 4.4;
samples2.at<float>(4, 0) = 5.3;
cv::Ptr< cv::ml::DTrees > model = cv::ml::DTrees::create();
model->setMinSampleCount(1);
model->setCVFolds(1);
model->setMaxDepth(10);
model->setRegressionAccuracy(.01f);
model->train(samples, cv::ml::ROW_SAMPLE, responses);
cv::Mat results;
model->predict(samples2, results);
for (int i = 0; i < results.rows; i++) {
for (int j = 0; j < results.cols; j++)
cout << results.at<float>(i, j) << ", ";
cout << endl;
}
Вывод:
1,5
2,7
3,8
4,3
5.2
Это простая проблема идентичности, какой бы ни была выборка, таков и должен быть ответ.Однако из этого примера он может только предсказать ответы, которые он видел.Насколько я понимаю, это потому, что каждый лист ответа является постоянной величиной.После того, как дерево решений заканчивается, оно приземляется на один из этих листов с постоянным значением.
Мой вопрос: кто-нибудь знает способ манипулирования деревом решений (предпочтительно с использованием OpenCV), чтобы онможет предсказать ответы за пределами того, что он видел?например, используя интерполяцию и / или экстраполяцию.