我正在处理同样的问题,我想在这里分享我的解决方案。我从 CvRTrees 派生了一个类,并添加了一个具有所需行为的函数。我使用现有的 predict() 函数作为我的起点。这是我的代码:
class CvRTreesMultiClass : public CvRTrees
{
public:
int predict_multi_class( const CvMat* sample,
cv::AutoBuffer<int>& out_votes,
const CvMat* missing = 0) const;
};
和:
int CvRTreesMultiClass::predict_multi_class( const CvMat* sample,
cv::AutoBuffer<int>& out_votes,
const CvMat* missing ) const
{
int result = 0;
int k;
if( nclasses > 0 ) //classification
{
int max_nvotes = 0;
int* votes = out_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];
}
result = ntrees;
}
else // regression
{
throw std::runtime_error(__FUNCTION__ "can only be used classification");
}
return result;
}
调用此函数后,我只需根据每个班级收到的投票数计算概率(prob = out_votes[class_index] / result)。我认为这就是 OP 正在寻找的(至少我是)。