c++ - OpenCV 随机森林打破平局

标签 c++ opencv random-forest

有人能告诉我 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;
    }
  }
}

所以,它似乎要做的是:

  1. 遍历每棵树并得到预测
  2. 更新该特定预测类别的投票数
  3. 将特定预测类别的投票数与最大投票数 (max_nvotes) 进行比较
  4. 必要时更新最大投票数

因此,随机打破关系的想法并没有直接集成到这段代码中,但应该记住随机森林集成中的树是随机生成的。因此,理论上,打破平局的过程是随机的,因为树的顺序(以及它们的预测顺序)是随机的。需要注意的另一件事是,平局进入头等舱以获得最大票数。

此外,如果多数票才算数,那么如果任何一个类超过树数的一半,就可以使 for 循环短路。因此,如果有 50 棵树并且其中任何一类的票数超过 25 票,则无需遍历并从剩余的树中获得预测(因为它们与改变多数票无关)。

关于c++ - OpenCV 随机森林打破平局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20893291/

相关文章:

python - Scikit-learn,随机森林——每棵树包含多少个样本?

machine-learning - 随机森林: how to favor false negatives over false positives

c++ - iMX6 上的 Qt5 : how to make sure the hardware acceleration is in use?

c++ - 更现代的循环 C++ 数组的方式

c++ - 为什么float**不能用float(*)[5]初始化?

c - 如何在 OpenCV 中扭曲图像?

c++ - 在预期下执行的随机森林

c++ - 引用对象 vector ?

opencv - OpenCV中的视频阅读

c# - 使用Open CV检测对象缺陷