Может ли кто-нибудь сказать мне, разрешает ли код случайного леса OpenCV связи (т. Е. Нет четкого большинства голосов) путем случайного выбора или существует более детерминированный механизм? Я не могу найти ответ на форумах OpenCV, в книге O’Reilly OpenCV или в Google.
После более глубокого изучения кода OpenCV () я нашел следующий соответствующий код:
if( nclasses > 0 ) //classification {
int max_nvotes = 0;
cv::AutoBuffer<int> _votes(nclasses);
int* votes = _votes;
memset( votes, 0, sizeof(*votes)*nclasses );
for( k = 0; k < ntrees; k++ ) {
CvDTreeNode* predicted_node = trees[k]->predict( sample, missing );
int nvotes;
int class_idx = predicted_node->class_idx;
CV_Assert( 0 <= class_idx && class_idx < nclasses );
nvotes = ++votes[class_idx];
if( nvotes > max_nvotes ) {
max_nvotes = nvotes;
result = predicted_node->value;
}
}
}
Итак, что он делает:
Таким образом, идея случайного разрыва связей напрямую не интегрирована в этот фрагмент кода, но следует иметь в виду, что деревья в ансамбле случайных лесов генерируются случайным образом. Таким образом, теоретически процесс разрыва связи является случайным, поскольку порядок деревьев (и порядок их предсказаний) является случайным. Еще одна вещь, на которую стоит обратить внимание, это то, что ничья идет в первый класс, чтобы получить максимальное количество голосов.
Кроме того, если учитывается большинство голосов, то можно замкнуть цикл for, если какой-либо из классов превышает более половины числа деревьев. Таким образом, если имеется 50 деревьев и любой из классов имеет более 25 голосов, то нет необходимости проходить и получать прогнозы по оставшимся деревьям (поскольку они не будут иметь значения для изменения большинства голосов).
Других решений пока нет …