OpenCV随机森林打破

时间:2014-01-02 22:40:52

标签: c++ opencv random-forest

有人可以告诉我,OpenCV随机森林代码是通过随机选择解决关系(即没有明确的多数投票),还是有更确定的机制?我似乎无法在OpenCV论坛,O'Reilly OpenCV书或Google中找到答案。

1 个答案:

答案 0 :(得分:0)

在深入研究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. 在必要时更新最大投票数
  5. 因此,随机断开关系的想法并没有直接集成到这段代码中,但应该记住,随机森林集合中的树是随机生成的。因此,理论上,打破平局过程是随机的,因为树的顺序(及其预测的顺序)是随机的。另外需要注意的是,为了获得最大票数,第一类是平局。

    此外,如果它是多数投票,那么如果任何一个类超过树数量的一半,则可以使for循环短路。因此,如果有50棵树,并且任何一个类别都有超过25票,那么就没有必要通过剩余的树来获得预测(因为它们与更改多数投票无关)。