35 #ifndef RF_VISITORS_HXX 36 #define RF_VISITORS_HXX 39 # include "vigra/hdf5impex.hxx" 41 #include <vigra/windows.h> 45 #include <vigra/multi_pointoperators.hxx> 141 template<
class Tree,
class Split,
class Region,
class Feature_t,
class Label_t>
147 Feature_t & features,
160 template<
class RF,
class PR,
class SM,
class ST>
170 template<
class RF,
class PR>
180 template<
class RF,
class PR>
196 template<
class TR,
class IntT,
class TopT,
class Feat>
204 template<
class TR,
class IntT,
class TopT,
class Feat>
243 template <
class Visitor,
class Next = StopVisiting>
253 next_(next), visitor_(visitor)
258 next_(stop_), visitor_(visitor)
261 template<
class Tree,
class Split,
class Region,
class Feature_t,
class Label_t>
267 Feature_t & features,
270 if(visitor_.is_active())
271 visitor_.visit_after_split(tree, split,
272 parent, leftChild, rightChild,
274 next_.visit_after_split(tree, split, parent, leftChild, rightChild,
278 template<
class RF,
class PR,
class SM,
class ST>
281 if(visitor_.is_active())
282 visitor_.visit_after_tree(rf, pr, sm, st, index);
283 next_.visit_after_tree(rf, pr, sm, st, index);
286 template<
class RF,
class PR>
289 if(visitor_.is_active())
290 visitor_.visit_at_beginning(rf, pr);
291 next_.visit_at_beginning(rf, pr);
293 template<
class RF,
class PR>
296 if(visitor_.is_active())
297 visitor_.visit_at_end(rf, pr);
298 next_.visit_at_end(rf, pr);
301 template<
class TR,
class IntT,
class TopT,
class Feat>
304 if(visitor_.is_active())
305 visitor_.visit_external_node(tr, index, node_t,features);
306 next_.visit_external_node(tr, index, node_t,features);
308 template<
class TR,
class IntT,
class TopT,
class Feat>
311 if(visitor_.is_active())
312 visitor_.visit_internal_node(tr, index, node_t,features);
313 next_.visit_internal_node(tr, index, node_t,features);
318 if(visitor_.is_active() && visitor_.has_value())
319 return visitor_.return_val();
320 return next_.return_val();
344 template<
class A,
class B>
358 template<
class A,
class B,
class C>
374 template<
class A,
class B,
class C,
class D>
393 template<
class A,
class B,
class C,
class D,
class E>
415 template<
class A,
class B,
class C,
class D,
class E,
440 template<
class A,
class B,
class C,
class D,
class E,
446 D & d, E & e, F & f, G & g)
468 template<
class A,
class B,
class C,
class D,
class E,
469 class F,
class G,
class H>
499 template<
class A,
class B,
class C,
class D,
class E,
500 class F,
class G,
class H,
class I>
531 template<
class A,
class B,
class C,
class D,
class E,
532 class F,
class G,
class H,
class I,
class J>
577 bool adjust_thresholds;
587 adjust_thresholds(
false), tree_id(0), last_node_id(0), current_label(0)
589 struct MarginalDistribution
592 Int32 leftTotalCounts;
594 Int32 rightTotalCounts;
601 struct TreeOnlineInformation
603 std::vector<MarginalDistribution> mag_distributions;
604 std::vector<IndexList> index_lists;
606 std::map<int,int> interior_to_index;
608 std::map<int,int> exterior_to_index;
612 std::vector<TreeOnlineInformation> trees_online_information;
616 template<
class RF,
class PR>
620 trees_online_information.resize(rf.options_.tree_count_);
627 trees_online_information[tree_id].mag_distributions.clear();
628 trees_online_information[tree_id].index_lists.clear();
629 trees_online_information[tree_id].interior_to_index.clear();
630 trees_online_information[tree_id].exterior_to_index.clear();
635 template<
class RF,
class PR,
class SM,
class ST>
641 template<
class Tree,
class Split,
class Region,
class Feature_t,
class Label_t>
647 Feature_t & features,
651 int addr=tree.topology_.size();
652 if(split.createNode().typeID() == i_ThresholdNode)
654 if(adjust_thresholds)
657 linear_index=trees_online_information[tree_id].mag_distributions.size();
658 trees_online_information[tree_id].interior_to_index[addr]=linear_index;
659 trees_online_information[tree_id].mag_distributions.push_back(MarginalDistribution());
661 trees_online_information[tree_id].mag_distributions.back().leftCounts=leftChild.classCounts_;
662 trees_online_information[tree_id].mag_distributions.back().rightCounts=rightChild.classCounts_;
664 trees_online_information[tree_id].mag_distributions.back().leftTotalCounts=leftChild.size_;
665 trees_online_information[tree_id].mag_distributions.back().rightTotalCounts=rightChild.size_;
667 double gap_left,gap_right;
669 gap_left=features(leftChild[0],split.bestSplitColumn());
670 for(i=1;i<leftChild.size();++i)
671 if(features(leftChild[i],split.bestSplitColumn())>gap_left)
672 gap_left=features(leftChild[i],split.bestSplitColumn());
673 gap_right=features(rightChild[0],split.bestSplitColumn());
674 for(i=1;i<rightChild.size();++i)
675 if(features(rightChild[i],split.bestSplitColumn())<gap_right)
676 gap_right=features(rightChild[i],split.bestSplitColumn());
677 trees_online_information[tree_id].mag_distributions.back().gap_left=gap_left;
678 trees_online_information[tree_id].mag_distributions.back().gap_right=gap_right;
684 linear_index=trees_online_information[tree_id].index_lists.size();
685 trees_online_information[tree_id].exterior_to_index[addr]=linear_index;
687 trees_online_information[tree_id].index_lists.push_back(IndexList());
689 trees_online_information[tree_id].index_lists.back().resize(parent.size_,0);
690 std::copy(parent.begin_,parent.end_,trees_online_information[tree_id].index_lists.back().begin());
693 void add_to_index_list(
int tree,
int node,
int index)
697 TreeOnlineInformation &ti=trees_online_information[tree];
698 ti.index_lists[ti.exterior_to_index[node]].push_back(index);
700 void move_exterior_node(
int src_tree,
int src_index,
int dst_tree,
int dst_index)
704 trees_online_information[dst_tree].exterior_to_index[dst_index]=trees_online_information[src_tree].exterior_to_index[src_index];
705 trees_online_information[src_tree].exterior_to_index.erase(src_index);
712 template<
class TR,
class IntT,
class TopT,
class Feat>
716 if(adjust_thresholds)
718 vigra_assert(node_t==i_ThresholdNode,
"We can only visit threshold nodes");
720 double value=features(0, Node<i_ThresholdNode>(tr.topology_,tr.parameters_,index).column());
721 TreeOnlineInformation &ti=trees_online_information[tree_id];
722 MarginalDistribution &m=ti.mag_distributions[ti.interior_to_index[index]];
723 if(value>m.gap_left && value<m.gap_right)
726 if(m.leftCounts[current_label]/
double(m.leftTotalCounts)>m.rightCounts[current_label]/double(m.rightTotalCounts))
736 Node<i_ThresholdNode>(tr.topology_,tr.parameters_,index).threshold()=(m.gap_right+m.gap_left)/2.0;
739 if(value>Node<i_ThresholdNode>(tr.topology_,tr.parameters_,index).threshold())
741 ++m.rightTotalCounts;
742 ++m.rightCounts[current_label];
747 ++m.rightCounts[current_label];
795 template<
class RF,
class PR,
class SM,
class ST>
799 if(
int(oobCount.
size()) != rf.ext_param_.row_count_)
801 oobCount.resize(rf.ext_param_.row_count_, 0);
802 oobErrorCount.resize(rf.ext_param_.row_count_, 0);
805 for(
int l = 0; l < rf.ext_param_.row_count_; ++l)
812 .predictLabel(
rowVector(pr.features(), l))
813 != pr.response()(l,0))
824 template<
class RF,
class PR>
828 for(
int l=0; l < static_cast<int>(rf.ext_param_.row_count_); ++l)
832 oobError += double(oobErrorCount[l]) / oobCount[l];
836 oobError/=totalOobCount;
869 void save(std::string filen, std::string pathn)
871 if(*(pathn.end()-1) !=
'/')
873 const char* filename = filen.c_str();
875 temp[0] = oob_breiman;
876 writeHDF5(filename, (pathn +
"breiman_error").c_str(), temp);
882 template<
class RF,
class PR>
885 class_count = rf.class_count();
886 tmp_prob.
reshape(Shp(1, class_count), 0);
887 prob_oob.
reshape(Shp(rf.ext_param().row_count_,class_count), 0);
888 is_weighted = rf.options().predict_weighted_;
889 indices.resize(rf.ext_param().row_count_);
890 if(
int(oobCount.
size()) != rf.ext_param_.row_count_)
892 oobCount.
reshape(Shp(rf.ext_param_.row_count_, 1), 0);
894 for(
int ii = 0; ii < rf.ext_param().row_count_; ++ii)
900 template<
class RF,
class PR,
class SM,
class ST>
908 if(rf.ext_param_.actual_msample_ < pr.features().shape(0) - 10000)
912 std::random_shuffle(indices.
begin(), indices.
end());
913 for(
int ii = 0; ii < rf.ext_param_.row_count_; ++ii)
915 if(!sm.is_used()[indices[ii]] && cts[pr.response()(indices[ii], 0)] < 40000)
917 oob_indices.push_back(indices[ii]);
918 ++cts[pr.response()(indices[ii], 0)];
921 for(
unsigned int ll = 0; ll < oob_indices.
size(); ++ll)
924 ++oobCount[oob_indices[ll]];
929 int pos = rf.tree(index).getToLeaf(
rowVector(pr.features(),oob_indices[ll]));
931 rf.tree(index).parameters_,
934 for(
int ii = 0; ii < class_count; ++ii)
936 tmp_prob[ii] = node.prob_begin()[ii];
940 for(
int ii = 0; ii < class_count; ++ii)
941 tmp_prob[ii] = tmp_prob[ii] * (*(node.prob_begin()-1));
943 rowVector(prob_oob, oob_indices[ll]) += tmp_prob;
948 for(
int ll = 0; ll < rf.ext_param_.row_count_; ++ll)
951 if(!sm.is_used()[ll])
959 int pos = rf.tree(index).getToLeaf(
rowVector(pr.features(),ll));
961 rf.tree(index).parameters_,
964 for(
int ii = 0; ii < class_count; ++ii)
966 tmp_prob[ii] = node.prob_begin()[ii];
970 for(
int ii = 0; ii < class_count; ++ii)
971 tmp_prob[ii] = tmp_prob[ii] * (*(node.prob_begin()-1));
982 template<
class RF,
class PR>
986 int totalOobCount =0;
987 int breimanstyle = 0;
988 for(
int ll=0; ll < static_cast<int>(rf.ext_param_.row_count_); ++ll)
997 oob_breiman = double(breimanstyle)/totalOobCount;
1063 void save(std::string filen, std::string pathn)
1065 if(*(pathn.end()-1) !=
'/')
1067 const char* filename = filen.c_str();
1069 writeHDF5(filename, (pathn +
"oob_per_tree").c_str(), oob_per_tree);
1070 writeHDF5(filename, (pathn +
"oobroc_per_tree").c_str(), oobroc_per_tree);
1071 writeHDF5(filename, (pathn +
"breiman_per_tree").c_str(), breiman_per_tree);
1073 writeHDF5(filename, (pathn +
"per_tree_error").c_str(), temp);
1075 writeHDF5(filename, (pathn +
"per_tree_error_std").c_str(), temp);
1076 temp[0] = oob_breiman;
1077 writeHDF5(filename, (pathn +
"breiman_error").c_str(), temp);
1078 temp[0] = oob_per_tree2;
1079 writeHDF5(filename, (pathn +
"ulli_error").c_str(), temp);
1085 template<
class RF,
class PR>
1088 class_count = rf.class_count();
1089 if(class_count == 2)
1093 tmp_prob.
reshape(Shp(1, class_count), 0);
1094 prob_oob.
reshape(Shp(rf.ext_param().row_count_,class_count), 0);
1095 is_weighted = rf.options().predict_weighted_;
1096 oob_per_tree.
reshape(Shp(1, rf.tree_count()), 0);
1097 breiman_per_tree.
reshape(Shp(1, rf.tree_count()), 0);
1099 if(
int(oobCount.
size()) != rf.ext_param_.row_count_)
1101 oobCount.
reshape(Shp(rf.ext_param_.row_count_, 1), 0);
1102 oobErrorCount.
reshape(Shp(rf.ext_param_.row_count_,1), 0);
1106 template<
class RF,
class PR,
class SM,
class ST>
1112 for(
int ll = 0; ll < rf.ext_param_.row_count_; ++ll)
1115 if(!sm.is_used()[ll])
1123 int pos = rf.tree(index).getToLeaf(
rowVector(pr.features(),ll));
1125 rf.tree(index).parameters_,
1128 for(
int ii = 0; ii < class_count; ++ii)
1130 tmp_prob[ii] = node.prob_begin()[ii];
1134 for(
int ii = 0; ii < class_count; ++ii)
1135 tmp_prob[ii] = tmp_prob[ii] * (*(node.prob_begin()-1));
1138 int label =
argMax(tmp_prob);
1140 if(label != pr.response()(ll, 0))
1145 ++oobErrorCount[ll];
1149 int breimanstyle = 0;
1150 int totalOobCount = 0;
1151 for(
int ll=0; ll < static_cast<int>(rf.ext_param_.row_count_); ++ll)
1158 if(oobroc_per_tree.
shape(2) == 1)
1160 oobroc_per_tree(pr.response()(ll,0),
argMax(
rowVector(prob_oob, ll)),0 ,index)++;
1164 if(oobroc_per_tree.
shape(2) == 1)
1165 oobroc_per_tree.
bindOuter(index)/=totalOobCount;
1166 if(oobroc_per_tree.
shape(2) > 1)
1170 for(
int gg = 0; gg < current_roc.
shape(2); ++gg)
1172 for(
int ll=0; ll < static_cast<int>(rf.ext_param_.row_count_); ++ll)
1176 int pred = prob_oob(ll, 1) > (double(gg)/double(current_roc.
shape(2)))?
1178 current_roc(pr.response()(ll, 0), pred, gg)+= 1;
1181 current_roc.
bindOuter(gg)/= totalOobCount;
1184 breiman_per_tree[index] = double(breimanstyle)/double(totalOobCount);
1185 oob_per_tree[index] = double(wrong_oob)/double(total_oob);
1191 template<
class RF,
class PR>
1196 int totalOobCount =0;
1197 int breimanstyle = 0;
1198 for(
int ll=0; ll < static_cast<int>(rf.ext_param_.row_count_); ++ll)
1204 oob_per_tree2 += double(oobErrorCount[ll]) / oobCount[ll];
1208 oob_per_tree2 /= totalOobCount;
1209 oob_breiman = double(breimanstyle)/totalOobCount;
1249 int repetition_count_;
1253 void save(std::string filename, std::string prefix)
1255 prefix =
"variable_importance_" + prefix;
1258 variable_importance_);
1268 : repetition_count_(rep_cnt)
1275 template<
class Tree,
class Split,
class Region,
class Feature_t,
class Label_t>
1286 Int32 const class_count = tree.ext_param_.class_count_;
1287 Int32 const column_count = tree.ext_param_.column_count_;
1288 if(variable_importance_.
size() == 0)
1291 variable_importance_
1296 if(split.createNode().typeID() == i_ThresholdNode)
1298 Node<i_ThresholdNode> node(split.createNode());
1299 variable_importance_(node.column(),class_count+1)
1300 += split.region_gini_ - split.minGini();
1310 template<
class RF,
class PR,
class SM,
class ST>
1314 Int32 column_count = rf.ext_param_.column_count_;
1315 Int32 class_count = rf.ext_param_.class_count_;
1325 typedef typename PR::FeatureWithMemory_t FeatureArray;
1326 typedef typename FeatureArray::value_type FeatureValue;
1328 FeatureArray features = pr.features();
1334 for(
int ii = 0; ii < rf.ext_param_.row_count_; ++ii)
1335 if(!sm.is_used()[ii])
1336 oob_indices.push_back(ii);
1342 #ifdef CLASSIFIER_TEST 1353 oob_right(Shp_t(1, class_count + 1));
1355 perm_oob_right (Shp_t(1, class_count + 1));
1359 for(iter = oob_indices.
begin();
1360 iter != oob_indices.
end();
1364 .predictLabel(
rowVector(features, *iter))
1365 == pr.response()(*iter, 0))
1368 ++oob_right[pr.response()(*iter,0)];
1370 ++oob_right[class_count];
1374 for(
int ii = 0; ii < column_count; ++ii)
1376 perm_oob_right.
init(0.0);
1378 backup_column.clear();
1379 for(iter = oob_indices.
begin();
1380 iter != oob_indices.
end();
1383 backup_column.push_back(features(*iter,ii));
1387 for(
int rr = 0; rr < repetition_count_; ++rr)
1390 int n = oob_indices.
size();
1391 for(
int jj = n-1; jj >= 1; --jj)
1392 std::swap(features(oob_indices[jj], ii),
1393 features(oob_indices[randint(jj+1)], ii));
1396 for(iter = oob_indices.
begin();
1397 iter != oob_indices.
end();
1401 .predictLabel(
rowVector(features, *iter))
1402 == pr.response()(*iter, 0))
1405 ++perm_oob_right[pr.response()(*iter, 0)];
1407 ++perm_oob_right[class_count];
1414 perm_oob_right /= repetition_count_;
1415 perm_oob_right -=oob_right;
1416 perm_oob_right *= -1;
1417 perm_oob_right /= oob_indices.
size();
1418 variable_importance_
1420 Shp_t(ii+1,class_count+1)) += perm_oob_right;
1422 for(
int jj = 0; jj < int(oob_indices.
size()); ++jj)
1423 features(oob_indices[jj], ii) = backup_column[jj];
1432 template<
class RF,
class PR,
class SM,
class ST>
1435 after_tree_ip_impl(rf, pr, sm, st, index);
1440 template<
class RF,
class PR>
1443 variable_importance_ /= rf.trees_.
size();
1453 template<
class RF,
class PR,
class SM,
class ST>
1455 if(index != rf.options().tree_count_-1) {
1456 std::cout <<
"\r[" << std::setw(10) << (index+1)/static_cast<double>(rf.options().tree_count_)*100 <<
"%]" 1457 <<
" (" << index+1 <<
" of " << rf.options().tree_count_ <<
") done" << std::flush;
1460 std::cout <<
"\r[" << std::setw(10) << 100.0 <<
"%]" << std::endl;
1464 template<
class RF,
class PR>
1466 std::string a =
TOCS;
1467 std::cout <<
"all " << rf.options().tree_count_ <<
" trees have been learned in " << a << std::endl;
1470 template<
class RF,
class PR>
1473 std::cout <<
"growing random forest, which will have " << rf.options().tree_count_ <<
" trees" << std::endl;
1521 void save(std::string file, std::string prefix)
1539 template<
class RF,
class PR>
1543 int n = rf.ext_param_.column_count_;
1544 gini_missc.
reshape(Shp(n +1,n+ 1));
1545 corr_noise.
reshape(Shp(n + 1, 10));
1546 corr_l.
reshape(Shp(n +1, 10));
1548 noise.
reshape(Shp(pr.features().shape(0), 10));
1549 noise_l.
reshape(Shp(pr.features().shape(0), 10));
1551 for(
int ii = 0; ii < noise.
size(); ++ii)
1556 bgfunc = ColumnDecisionFunctor( rf.ext_param_);
1557 tmp_labels.
reshape(pr.response().shape());
1559 numChoices.resize(n+1);
1562 template<
class RF,
class PR>
1567 similarity = gini_missc;;
1571 int rC = similarity.
shape(0);
1572 for(
int jj = 0; jj < rC-1; ++jj)
1574 rowVector(similarity, jj) /= numChoices[jj];
1575 rowVector(similarity, jj) -= mean_noise(jj, 0);
1577 for(
int jj = 0; jj < rC; ++jj)
1579 similarity(rC -1, jj) /= numChoices[jj];
1581 rowVector(similarity, rC - 1) -= mean_noise(rC-1, 0);
1582 similarity =
abs(similarity);
1586 for(
int jj = 0; jj < rC; ++jj)
1587 similarity(jj, jj) = minmax.
max;
1589 similarity.
subarray(Shp(0,0), Shp(rC-1, rC-1))
1591 similarity.
subarray(Shp(0,0), Shp(rC-1, rC-1))/= 2;
1593 for(
int jj = 0; jj < rC; ++jj)
1594 similarity(jj, jj) = 0;
1598 for(
int jj = 0; jj < rC; ++jj)
1599 similarity(jj, jj) = minmax2.
max;
1601 distance -= similarity;
1604 template<
class Tree,
class Split,
class Region,
class Feature_t,
class Label_t>
1609 Region & rightChild,
1610 Feature_t & features,
1613 if(split.createNode().typeID() == i_ThresholdNode)
1617 for(
int ii = 0; ii < parent.size(); ++ii)
1619 tmp_labels[parent[ii]]
1620 = (features(parent[ii], split.bestSplitColumn()) < split.bestSplitThreshold());
1621 ++tmp_cc[tmp_labels[parent[ii]]];
1623 double region_gini = bgfunc.loss_of_region(tmp_labels,
1628 int n = split.bestSplitColumn();
1630 ++(*(numChoices.
end()-1));
1632 for(
int k = 0; k < features.shape(1); ++k)
1636 parent.
begin(), parent.end(),
1638 wgini = (region_gini - bgfunc.min_gini_);
1642 for(
int k = 0; k < 10; ++k)
1646 parent.
begin(), parent.end(),
1648 wgini = (region_gini - bgfunc.min_gini_);
1653 for(
int k = 0; k < 10; ++k)
1657 parent.
begin(), parent.end(),
1659 wgini = (region_gini - bgfunc.min_gini_);
1663 bgfunc(labels, tmp_labels, parent.
begin(), parent.end(),tmp_cc);
1664 wgini = (region_gini - bgfunc.min_gini_);
1668 region_gini = split.region_gini_;
1670 Node<i_ThresholdNode> node(split.createNode());
1673 +=split.region_gini_ - split.minGini();
1675 for(
int k = 0; k < 10; ++k)
1679 parent.begin(), parent.end(),
1680 parent.classCounts());
1686 for(
int k = 0; k < tree.ext_param_.actual_mtry_; ++k)
1688 wgini = region_gini - split.min_gini_[k];
1691 split.splitColumns[k])
1695 for(
int k=tree.ext_param_.actual_mtry_; k<features.shape(1); ++k)
1697 split.bgfunc(
columnVector(features, split.splitColumns[k]),
1699 parent.begin(), parent.end(),
1700 parent.classCounts());
1701 wgini = region_gini - split.bgfunc.min_gini_;
1703 split.splitColumns[k]) += wgini;
1711 sorter(features, split.bestSplitColumn(), split.bestSplitThreshold());
1712 std::partition(parent.begin(), parent.end(), sorter);
1723 #endif // RF_VISITORS_HXX #define TIC
Definition: timing.hxx:322
void visit_internal_node(TR &tr, IntT index, TopT node_t, Feat &features)
Definition: rf_visitors.hxx:713
#define USETICTOC
Definition: timing.hxx:321
Definition: rf_nodeproxy.hxx:626
MultiArrayView< 2, T, C > columnVector(MultiArrayView< 2, T, C > const &m, MultiArrayIndex d)
Definition: matrix.hxx:725
MultiArray< 2, double > breiman_per_tree
Definition: rf_visitors.hxx:1039
MultiArray< 2, double > gini_missc
Definition: rf_visitors.hxx:1490
MultiArrayIndex rowCount(const MultiArrayView< 2, T, C > &x)
Definition: matrix.hxx:669
Definition: rf_split.hxx:201
const difference_type & shape() const
Definition: multi_array.hxx:1596
void visit_at_end(RF const &rf, PR const &pr)
Definition: rf_visitors.hxx:171
void visit_after_tree(RF &rf, PR &pr, SM &sm, ST &st, int index)
Definition: rf_visitors.hxx:161
void visit_after_split(Tree &tree, Split &split, Region &, Region &, Region &, Feature_t &, Label_t &)
Definition: rf_visitors.hxx:1276
const_iterator begin() const
Definition: array_vector.hxx:223
double oobError
Definition: rf_visitors.hxx:777
iterator begin()
Definition: multi_array.hxx:1869
MultiArray< 2, double > similarity
Definition: rf_visitors.hxx:1510
void reshape(const difference_type &shape)
Definition: multi_array.hxx:2809
Definition: rf_visitors.hxx:852
void visit_at_end(RF &rf, PR &)
Definition: rf_visitors.hxx:1441
ArrayVector< int > numChoices
Definition: rf_visitors.hxx:1518
Definition: rf_visitors.hxx:1484
Definition: rf_visitors.hxx:1219
Definition: accessor.hxx:43
MultiArrayView< N, T, StridedArrayTag > transpose() const
Definition: multi_array.hxx:1515
double oob_per_tree2
Definition: rf_visitors.hxx:1034
detail::VisitorNode< A > create_visitor(A &a)
Definition: rf_visitors.hxx:334
void reset_tree(int tree_id)
Definition: rf_visitors.hxx:625
double uniform53() const
Definition: random.hxx:515
difference_type_1 size() const
Definition: multi_array.hxx:1589
MultiArray< 4, double > oobroc_per_tree
Definition: rf_visitors.hxx:1056
Definition: multi_fwd.hxx:63
double return_val()
Definition: rf_visitors.hxx:215
void visit_at_end(RF &rf, PR &pr)
Definition: rf_visitors.hxx:825
Definition: rf_visitors.hxx:244
detail::SelectIntegerType< 32, detail::SignedIntTypes >::type Int32
32-bit signed int
Definition: sized_int.hxx:175
MultiArray< 2, double > noise
Definition: rf_visitors.hxx:1494
void init(U const &initial)
Definition: array_vector.hxx:146
Definition: rf_split.hxx:831
MultiArray & init(const U &init)
Definition: multi_array.hxx:2799
Iterator argMax(Iterator first, Iterator last)
Find the maximum element in a sequence.
Definition: algorithm.hxx:96
void visit_after_tree(RF &, PR &, SM &, ST &, int)
Definition: rf_visitors.hxx:636
Find the minimum and maximum pixel value in an image or ROI.
Definition: inspectimage.hxx:1001
Definition: rf_visitors.hxx:1004
Definition: rf_visitors.hxx:573
void visit_internal_node(TR &, IntT, TopT, Feat &)
Definition: rf_visitors.hxx:205
MultiArray< 2, double > oob_per_tree
Definition: rf_visitors.hxx:1014
#define TOCS
Definition: timing.hxx:325
Class for fixed size vectors.This class contains an array of size SIZE of the specified VALUETYPE...
Definition: accessor.hxx:940
void writeHDF5(...)
Store array data in an HDF5 file.
Definition: rf_visitors.hxx:1449
MultiArray< 2, double > distance
Definition: rf_visitors.hxx:1513
MultiArrayView< 2, T, C > rowVector(MultiArrayView< 2, T, C > const &m, MultiArrayIndex d)
Definition: matrix.hxx:695
double oob_std
Definition: rf_visitors.hxx:1020
Definition: rf_visitors.hxx:101
void visit_at_beginning(RF &rf, const PR &)
Definition: rf_visitors.hxx:617
MultiArrayIndex columnCount(const MultiArrayView< 2, T, C > &x)
Definition: matrix.hxx:682
FFTWComplex< R >::NormType abs(const FFTWComplex< R > &a)
absolute value (= magnitude)
Definition: fftw3.hxx:1002
Definition: random.hxx:336
MultiArray< 2, double > variable_importance_
Definition: rf_visitors.hxx:1248
Base class for, and view to, vigra::MultiArray.
Definition: multi_array.hxx:652
double oob_breiman
Definition: rf_visitors.hxx:863
VALUETYPE max
Definition: inspectimage.hxx:1084
const_iterator end() const
Definition: array_vector.hxx:237
const_pointer data() const
Definition: array_vector.hxx:209
size_type size() const
Definition: array_vector.hxx:358
void visit_at_beginning(RF const &rf, PR const &pr)
Definition: rf_visitors.hxx:181
MultiArrayView subarray(difference_type p, difference_type q) const
Definition: multi_array.hxx:1476
void after_tree_ip_impl(RF &rf, PR &pr, SM &sm, ST &, int index)
Definition: rf_visitors.hxx:1311
void inspectMultiArray(...)
Call an analyzing functor at every element of a multi-dimensional array.
void visit_external_node(TR &tr, IntT index, TopT node_t, Feat &features)
Definition: rf_visitors.hxx:197
Definition: rf_visitors.hxx:772
MultiArrayView< N-M, T, StrideTag > bindOuter(const TinyVector< Index, M > &d) const
Definition: multi_array.hxx:2132
Definition: rf_visitors.hxx:224
void visit_after_split(Tree &tree, Split &split, Region &parent, Region &leftChild, Region &rightChild, Feature_t &features, Label_t &labels)
Definition: rf_visitors.hxx:142
double oob_mean
Definition: rf_visitors.hxx:1017
MultiArray< 2, double > corr_noise
Definition: rf_visitors.hxx:1498