Тривиальный случайный лес с OpenCV не работает и не похож на sklearn

Я пытаюсь заставить работать самый простой пример случайного леса. Данные обучения составляют 2 точки {0,0} с меткой 0 и {1,1} с меткой 1. Образец для прогнозирования — {2,2}. OpenCV возвращает 0, а не 1. Вот код OpenCV на C ++ (main.cpp):

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/ml/ml.hpp>

using namespace std;
using namespace cv;

int main(int argc, char const *argv[]) {
cout << " hi \n";
float trainingData[2][2] = { {0.0, 0.0}, {1.0, 1.0}};
Mat training_data(2, 2, CV_32FC1, trainingData);
float trainingClass[2] = {0.0,1.0};
Mat training_class(2, 1, CV_32FC1, trainingClass);
CvRTrees rtree;
rtree.train(training_data, CV_ROW_SAMPLE, training_class);
float sampleData[2] = {2.0, 2.0};
Mat sample_data(2, 1, CV_32FC1, sampleData);
cout << rtree.predict(sample_data) << "  <-- predict\n";
return 0;
}

cmake файл:

cmake_minimum_required(VERSION 2.8)
project( main )
find_package( OpenCV REQUIRED )
add_executable( main main.cpp )
target_link_libraries( main ${OpenCV_LIBS} )

Бег:

> cmake .;make;./main
hi
0  <-- predict

Для сравнения вот код склеарна питона (rfc.py):

from sklearn.ensemble import RandomForestClassifier
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = RandomForestClassifier(n_estimators=10)
clf = clf.fit(X, Y)
print clf.predict([[2., 2.]])

Бег:

> python rfc.py
[1]

1

Решение

количество очков для обучения слишком мало. если я изменю это на 3, все работает.

изменения min_sample_count до 2 тоже работает.

1

Другие решения

Других решений пока нет …