22 #include "MAClassifier.hpp" 24 #include "MAClassifierPrivate.hpp" 25 #include "MAModel.hpp" 27 #include <3rdparty/archives/portable_iarchive.hpp> 28 #include <3rdparty/archives/portable_oarchive.hpp> 29 #include <MCBinaryData.hpp> 30 #include <MCContainers.hpp> 31 #include <MCDataContainer.hpp> 33 #include <MCSampleStatistics.hpp> 35 #include <opencv/cv.h> 36 #include <opencv2/core/core.hpp> 38 #if __cplusplus >= 201103L && defined(__clang__) 39 #pragma GCC diagnostic push 40 #pragma GCC diagnostic ignored "-Wdeprecated-register" 42 #include <Eigen/Dense> 43 #if __cplusplus >= 201103L && defined(__clang__) 44 #pragma GCC diagnostic pop 46 #include <serialize.h> 55 #include <boost/archive/binary_oarchive.hpp> 56 #include <boost/archive/binary_iarchive.hpp> 57 #include <boost/iostreams/device/back_inserter.hpp> 58 #include <boost/iostreams/stream.hpp> 59 #include <boost/serialization/vector.hpp> 75 cv::theRNG().state =
MCRand(0, 10000000);
79 static InitOpenCVRNG InitOpenCVRNGWrapper;
86 boost::scoped_ptr<libgp::GaussianProcess> GprScPtr;
96 Preprocessing(
MA::FeatureStandardization), Regression(false), Trained(false), FeatureCount(0),
97 LabelCount(1), SvmGamma(0.00001), SvmC(0.1), SvmP(0.01), SvmNu(0.0001), SvmAutoTrain(false),
98 DlibEpsilon(0.00001), RvmSigmoidGamma(0.00001), RvmRbfGamma(0.0002),
99 KrrGamma(1.5), KrrLambda(0.01), MeL1(0.00001), MeL2(0.005), LwprAlpha(0.2), PlsrComponents(0),
100 KrlsTolerance(0.001), KrlsGamma(0.0002), TreeMaxDepth(20), TreeNodeSampleLimit(1),
119 MAClassifier::~MAClassifier()
180 if (
Classifier == MA::NeuralNetworkClassifier)
188 if (
Classifier == MA::KNearestNeighborClassifier)
208 if (
Classifier == MA::ExtremeRandomTreesClassifier)
212 if (
Classifier == MA::GradientBoostedTreesClassifier)
216 if (
Classifier == MA::ExpectationMaximization)
220 if ((
Classifier >= MA::SvmClassifierCLinearEkm &&
Classifier <= MA::SvmClassifierCLinearDlib) ||
234 #if defined(__unix__) 235 if (
Classifier == MA::GaussianProcessRegression)
237 Gpr->GprScPtr.reset(
nullptr);
254 MC_WARNING(
"Custom classifier parameter can't be set after training.");
257 if (method_parameter == MA::SvmGammaParam)
263 if (method_parameter == MA::SvmCParam)
269 if (method_parameter == MA::SvmPParam)
275 if (method_parameter == MA::SvmNuParam)
281 if (method_parameter == MA::SvmAutoTrainParam)
285 if (method_parameter == MA::DlibEpsilonParam)
289 if (method_parameter == MA::RvmSigmoidGammaParam)
293 if (method_parameter == MA::RvmRbfGammaParam)
297 if (method_parameter == MA::KrrRbfGammaParam)
301 if (method_parameter == MA::KrrLambdaParam)
305 if (method_parameter == MA::MeL1Param)
309 if (method_parameter == MA::MeL2Param)
313 if (method_parameter == MA::LwprAlphaParam)
317 if (method_parameter == MA::PlsrComponentsParam)
319 PlsrComponents = (int)value;
320 if (PlsrComponents < 0)
323 if (method_parameter == MA::KrlsToleranceParam)
327 if (method_parameter == MA::KrlsGammaParam)
331 if (method_parameter == MA::TreeMaxDepthParam)
337 if (method_parameter == MA::TreeNodeSampleLimitParam)
339 TreeNodeSampleLimit = (int)value;
340 if (TreeNodeSampleLimit < 0)
341 TreeNodeSampleLimit = 1;
343 if (method_parameter == MA::RtMaxForestSizeParam)
354 if (method_parameter == MA::SvmGammaParam)
357 if (method_parameter == MA::SvmCParam)
360 if (method_parameter == MA::SvmPParam)
363 if (method_parameter == MA::SvmNuParam)
366 if (method_parameter == MA::SvmAutoTrainParam)
369 if (method_parameter == MA::DlibEpsilonParam)
372 if (method_parameter == MA::RvmSigmoidGammaParam)
375 if (method_parameter == MA::RvmRbfGammaParam)
378 if (method_parameter == MA::KrrRbfGammaParam)
381 if (method_parameter == MA::KrrLambdaParam)
384 if (method_parameter == MA::MeL1Param)
387 if (method_parameter == MA::MeL2Param)
390 if (method_parameter == MA::LwprAlphaParam)
393 if (method_parameter == MA::PlsrComponentsParam)
394 return (
float)PlsrComponents;
396 if (method_parameter == MA::KrlsToleranceParam)
399 if (method_parameter == MA::KrlsGammaParam)
402 if (method_parameter == MA::TreeMaxDepthParam)
405 if (method_parameter == MA::TreeNodeSampleLimitParam)
406 return (
float)TreeNodeSampleLimit;
408 if (method_parameter == MA::RtMaxForestSizeParam)
419 MC_WARNING(
"Preprocessing mode can't be changed after training.");
428 if (input_vectors.empty() || input_vectors[0].size() == 0)
430 MC_WARNING(
"No data in the input table for classifier training.");
434 int RowSize = input_vectors[0].size();
436 for (
unsigned int i = 1; i < input_vectors.size(); ++i)
438 if ((
int)input_vectors[i].size() != RowSize)
440 MC_WARNING(
"Row counts are inconsistent in the input table for classifier training.");
445 MC_WARNING(
"Feature count does not match with the expected training vector size (%d != %d).",
450 if (input_vectors.size() != labels.size())
452 MC_WARNING(
"Label counts are inconsistent with the input table size for classifier training.");
464 if ((
Classifier >= MA::SvmClassifierCLinearEkm &&
Classifier <= MA::SvmClassifierCLinearDlib) ||
466 (Classifier >= MA::KrlsLinearRegression && Classifier <= MA::KrlsRbfRegression))
471 if (Classifier == MA::MaxEntropyClassifierL1 || Classifier == MA::MaxEntropyClassifierL2)
476 if (Classifier == MA::LwpRegression)
481 #if defined(__unix__) 482 if (Classifier == MA::GaussianProcessRegression)
484 Gpr->GprScPtr.reset(
nullptr);
488 if (Classifier == MA::PlsRegression)
498 if (input_vectors.empty())
500 MC_WARNING(
"No data in the input table for classifier prediction.");
501 return MC::FloatList();
504 int RowCount = input_vectors[0].size();
508 MC_WARNING(
"No data in the input table for classifier prediction.");
509 return MC::FloatList();
511 for (
unsigned int i = 1; i < input_vectors.size(); ++i)
513 if ((
int)input_vectors[i].size() != RowCount)
515 MC_WARNING(
"Row counts are inconsistent in the input table for classifier prediction.");
516 return MC::FloatList();
521 input_vectors[i].size());
522 return MC::FloatList();
525 MC::FloatList Labels;
527 for (
unsigned int i = 0; i < input_vectors.size(); ++i)
529 Labels.push_back(
Predict(input_vectors[i], confidences));
537 float Label = PredictReal(input_vector, confidence);
550 float CurrentDiff =
MCAbs(label-Label);
552 if (CurrentDiff < Diff)
562 float MAClassifier::PredictReal(
const MC::FloatList& input_vector, MC::FloatList& confidences)
567 MC_WARNING(
"The classifier is not trained yet.");
570 if (input_vector.empty())
572 MC_WARNING(
"No data in the input vector for classifier prediction.");
577 MC_WARNING(
"Feature count does not match with the expected test vector (%d != %d).",
585 MC::FloatList NormalizedInputVector = input_vector;
589 MCStandardizeVector<MC::FloatList, float>(NormalizedInputVector,
PreprocessedData);
593 MCRescaleVectorByMinMax<MC::FloatList, float>(NormalizedInputVector,
PreprocessedData);
597 MCRescaleVectorByLength<MC::FloatList, float>(NormalizedInputVector);
608 DlibSampleDVectorType TestingSample;
610 TestingSample.set_size(NormalizedInputVector.size(), 1);
611 for (
unsigned int i = 0; i < NormalizedInputVector.size(); ++i)
612 TestingSample(i) = NormalizedInputVector[i];
616 DlibSampleFVectorType TestingSample;
618 TestingSample.set_size(NormalizedInputVector.size(), 1);
619 for (
unsigned int i = 0; i < NormalizedInputVector.size(); ++i)
620 TestingSample(i) = NormalizedInputVector[i];
624 DlibSampleDVectorType TestingSample;
626 TestingSample.set_size(NormalizedInputVector.size(), 1);
627 for (
unsigned int i = 0; i < NormalizedInputVector.size(); ++i)
628 TestingSample(i) = NormalizedInputVector[i];
633 return DlibFunctions->LinearRegressionFunction(TestingSample);
637 return DlibFunctions->SigmoidRegressionFunction(TestingSample);
644 ME_Sample TestingSample;
646 for (
unsigned int i1 = 0; i1 < NormalizedInputVector.size(); ++i1)
648 TestingSample.add_feature(
MCToStr(i1), NormalizedInputVector[i1]);
651 return MCStrConvert<float>(TestingSample.label);
655 doubleVec TestingSample(NormalizedInputVector.size());
657 for (
unsigned int i = 0; i < NormalizedInputVector.size(); ++i)
658 TestingSample[i] = (
double)NormalizedInputVector[i];
659 return (
float)
Lwpr->predict(TestingSample)[0];
661 #if defined(__unix__) 662 if (
Classifier == MA::GaussianProcessRegression)
664 double TestingSample[NormalizedInputVector.size()];
666 for (
unsigned int i = 0; i < NormalizedInputVector.size(); ++i)
667 TestingSample[i] = (
double)NormalizedInputVector[i];
668 return (
float)
Gpr->GprScPtr->f(TestingSample);
673 Mat2D TestingSample(1, NormalizedInputVector.size());
675 for (
unsigned int i = 0; i < NormalizedInputVector.size(); ++i)
677 TestingSample(0, i) = NormalizedInputVector[i];
679 Mat2D Result =
Plsr->fitted_values(TestingSample, PlsrComponents);
681 return (
float)Result(0, 0);
684 cv::Mat TestingSample(1, NormalizedInputVector.size(), CV_32FC1, NormalizedInputVector.data());
688 if (
Classifier == MA::NeuralNetworkClassifier)
693 Result = Label.at<
float>(0, 0);
699 if (
Classifier == MA::KNearestNeighborClassifier)
709 Result = (float)
DecisionTree->predict(TestingSample)->value;
717 float Confidence = 0;
719 Result =
RandomTrees->predict_with_confidence(TestingSample, Confidence);
724 if (
Classifier == MA::ExtremeRandomTreesClassifier)
728 if (
Classifier == MA::GradientBoostedTreesClassifier)
732 if (
Classifier == MA::ExpectationMaximization)
736 Response =
EmClassifier->Classifier->predict(TestingSample);
737 Result =
EmClassifier->LabelMapping[(float)Response[1]];
746 void MAClassifier::Train()
758 MCStandardizeTablePerColumns<float, MC::FloatList, MC::FloatTable>(NormalizedSamples,
PreprocessedData);
763 MCRescaleTablePerColumnsByMinMax<float, MC::FloatList, MC::FloatTable>(NormalizedSamples,
PreprocessedData);
767 MCRescaleTablePerRowByRowLength<float, MC::FloatList, MC::FloatTable>(NormalizedSamples);
774 Classifier == MA::KNearestNeighborClassifier ||
781 float* Priors =
nullptr;
789 for (
unsigned int i1 = 0; i1 < UniqueLabels.size(); ++i1)
793 PriorityLabels[i1] = 0.15;
796 Priors = PriorityLabels.data();
798 for (
unsigned int i = 0; i < NormalizedSamples.size(); ++i)
800 cv::Mat Sample(1,
FeatureCount, CV_32FC1, NormalizedSamples[i].data());
802 TrainingSamples.push_back(Sample);
805 InitOpenCVRNGWrapper.Reset();
808 if (Classifier == MA::NeuralNetworkClassifier)
810 cv::Mat Layers(4, 1, CV_32SC1);
815 Layers.row(3) = cv::Scalar(1);
817 NeuralNetwork->train(TrainingSamples, TrainingLabels, cv::Mat());
819 if (Classifier == MA::NaiveBayesClassifier)
821 BayesClassifier->train(TrainingSamples, TrainingLabels, cv::Mat(), cv::Mat(),
false);
823 if (Classifier == MA::KNearestNeighborClassifier)
827 if (Classifier >= MA::SvmClassifierCLinear && Classifier <= MA::SvmClassifierNuRbf)
831 SvmClassifier->train_auto(TrainingSamples, TrainingLabels, cv::Mat(), cv::Mat(),
833 if (Classifier == MA::SvmClassifierCLinear || Classifier == MA::SvmClassifierCRbf)
837 if (Classifier == MA::SvmClassifierNuLinear || Classifier == MA::SvmClassifierNuRbf)
839 if (Classifier == MA::SvmClassifierCRbf || Classifier == MA::SvmClassifierNuRbf)
840 MC_LOG(
"γ (gamma) parameter (SVM autotraining): %1.6f",
SvmClassifier->get_params().gamma);
842 SvmClassifier->train(TrainingSamples, TrainingLabels, cv::Mat(), cv::Mat(),
846 if (Classifier == MA::DecisionTreeClassifier)
860 DtVarType.setTo(cv::Scalar(CV_VAR_NUMERICAL));
864 DtVarType.at<uchar>(
FeatureCount, 0) = CV_VAR_CATEGORICAL;
866 DtVarType.at<uchar>(
FeatureCount, 0) = CV_VAR_NUMERICAL;
867 DecisionTree->train(TrainingSamples, CV_ROW_SAMPLE, TrainingLabels, cv::Mat(), cv::Mat(),
868 DtVarType, cv::Mat(), Params);
870 if (Classifier == MA::RandomTreesClassifier || Classifier == MA::ExtremeRandomTreesClassifier)
873 bool VariableImportance = (Classifier == MA::RandomTreesClassifier ?
true :
false);
874 CvRTParams Params(
TreeMaxDepth, TreeNodeSampleLimit, 0.01, VariableImportance, 1024,
876 CV_TERMCRIT_ITER+CV_TERMCRIT_EPS);
878 RtVarType.setTo(cv::Scalar(CV_VAR_NUMERICAL));
882 RtVarType.at<uchar>(
FeatureCount, 0) = CV_VAR_CATEGORICAL;
884 RtVarType.at<uchar>(
FeatureCount, 0) = CV_VAR_NUMERICAL;
886 if (Classifier == MA::RandomTreesClassifier)
888 RandomTrees->train(TrainingSamples, CV_ROW_SAMPLE, TrainingLabels, cv::Mat(), cv::Mat(),
889 RtVarType, cv::Mat(), Params);
891 ExtremeRandomTrees->train(TrainingSamples, CV_ROW_SAMPLE, TrainingLabels, cv::Mat(), cv::Mat(),
892 RtVarType, cv::Mat(), Params);
895 if (Classifier == MA::GradientBoostedTreesClassifier)
900 GbtVarType.setTo(cv::Scalar(CV_VAR_NUMERICAL));
904 GbtVarType.at<uchar>(
FeatureCount, 0) = CV_VAR_CATEGORICAL;
906 GbtVarType.at<uchar>(
FeatureCount, 0) = CV_VAR_NUMERICAL;
908 GradientBoostedTrees->train(TrainingSamples, CV_ROW_SAMPLE, TrainingLabels, cv::Mat(), cv::Mat(),
909 GbtVarType, cv::Mat(), Params);
911 if (Classifier == MA::ExpectationMaximization)
915 cv::Mat Weights(1, Labels.size(), CV_64FC1, cv::Scalar(0));
916 std::vector<cv::Mat> Covs;
919 Covs.resize(Labels.size());
921 for (
unsigned int i = 0; i < Labels.size(); ++i)
925 EmClassifier->LabelMapping.insert(std::make_pair((
float)i, Labels[i]));
926 for (
unsigned int i1 = 0; i1 < NormalizedSamples.size(); ++i1)
930 const cv::Mat Sample(1,
FeatureCount, CV_32FC1, NormalizedSamples[i1].data());
933 Sample.convertTo(TempSample, CV_64FC1);
934 Samples.push_back(TempSample);
937 cv::calcCovarMatrix(Samples, Covs[i], Means.row(i),
938 CV_COVAR_NORMAL+CV_COVAR_ROWS+CV_COVAR_SCALE, CV_64FC1);
941 Weights.at<
double>(i) = 0.15;
943 Weights.at<
double>(i) = 0.1;
949 EmClassifier->Classifier->trainE(TrainingSamples, Means, Covs, Weights);
952 MC_WARNING(
"Fatal error on OpenCV side while training a classifier!");
961 if ((Classifier == MA::MaxEntropyClassifierL1 || Classifier == MA::MaxEntropyClassifierL2) &&
966 for (
unsigned int i = 0; i < NormalizedSamples.size(); ++i)
970 for (
unsigned int i1 = 0; i1 < NormalizedSamples[0].size(); ++i1)
972 NewSample.add_feature(
MCToStr(i1), NormalizedSamples[i][i1]);
977 if (Classifier == MA::MaxEntropyClassifierL1)
980 if (Classifier == MA::MaxEntropyClassifierL2)
989 if (Classifier == MA::LwpRegression && !
Lwpr.get())
994 printf(
"LWPR_Object FAILED\n");
999 Lwpr->setInitAlpha(250);
1001 std::vector<doubleVec> TrainingSamples;
1002 std::vector<doubleVec> TrainingLabels;
1005 for (
unsigned int i = 0; i < NormalizedSamples.size(); ++i)
1011 TrainingSamples[i][i1] = (double)NormalizedSamples[i][i1];
1013 TrainingLabels.push_back(doubleVec(1));
1017 float Error = 1000.0;
1020 while (Iterations < 1000 && Error > 0.00001)
1024 for (
unsigned int i = 0; i < NormalizedSamples.size(); ++i)
1025 Lwpr->update(TrainingSamples[i], TrainingLabels[i]);
1026 for (
unsigned int i = 0; i < NormalizedSamples.size(); ++i)
1028 float CurrentError = (float)
Lwpr->predict(TrainingSamples[i])[0]-
CachedLabels[i];
1030 Error += CurrentError*CurrentError;
1037 #if defined(__unix__) 1041 if (Classifier == MA::GaussianProcessRegression && !
Gpr->GprScPtr.get())
1043 Gpr->GprScPtr.reset(
new libgp::GaussianProcess(
FeatureCount,
"CovSum ( CovSEiso, CovNoise)"));
1044 Eigen::VectorXd params(
Gpr->GprScPtr->covf().get_param_dim());
1046 params << 0.0, 0.0, -2.0;
1048 Gpr->GprScPtr->covf().set_loghyper(params);
1050 for (
unsigned int i = 0; i < NormalizedSamples.size(); ++i)
1056 TrainingSample[i1] = (double)NormalizedSamples[i][i1];
1067 if (Classifier == MA::PlsRegression && !
Plsr.get())
1069 Plsr.reset(
new PLS_Model);
1070 Mat2D TrainingSamples(NormalizedSamples.size(),
FeatureCount);
1075 for (
unsigned int i = 0; i < NormalizedSamples.size(); ++i)
1079 TrainingSamples(i, i1) = NormalizedSamples[i][i1];
1083 if (PlsrComponents == 0)
1085 int LastComponentCount = -1;
1087 for (
int i = 3; i < 100; i += 5)
1090 Plsr->initialize((
int)TrainingSamples.cols(), (int)TrainingLabels.cols(), i);
1091 Plsr->plsr(TrainingSamples, TrainingLabels, KERNEL_TYPE2);
1092 Rowi Components =
Plsr->loo_optimal_num_components(TrainingSamples, TrainingLabels);
1093 bool Consistent =
true;
1095 for (
int i1 = 1; i1 < Components.size(); ++i1)
1097 if (Components(0) != Components(i1))
1105 if ((LastComponentCount == -1 && Components(0) > 0) ||
1106 (LastComponentCount != -1 && Components(0) != LastComponentCount))
1108 LastComponentCount = Components(0);
1111 if (LastComponentCount != -1 && Components(0) == LastComponentCount)
1114 if (LastComponentCount == -1)
1116 LastComponentCount = 10;
1118 LastComponentCount += 2;
1120 PlsrComponents = LastComponentCount;
1123 Plsr->initialize((
int)TrainingSamples.cols(), (int)TrainingLabels.cols(), PlsrComponents);
1124 Plsr->plsr(TrainingSamples, TrainingLabels, KERNEL_TYPE2);
1134 if (Classifier >= MA::SvmClassifierCLinearEkm && Classifier <= MA::SvmClassifierCLinearDlib)
1137 DlibDSampleTableType TrainingSamples;
1138 MC::DoubleList TrainingLabels;
1140 for (
unsigned int i = 0; i < NormalizedSamples.size(); ++i)
1142 DlibSampleDVectorType List;
1144 List.set_size(NormalizedSamples[0].size(), 1);
1145 for (
unsigned int i1 = 0; i1 < NormalizedSamples[0].size(); ++i1)
1147 List(i1) = NormalizedSamples[i][i1];
1149 TrainingSamples.push_back(List);
1152 DlibDMultiTrainerType MultiTrainer;
1155 if (Classifier == MA::SvmClassifierCLinearEkm)
1157 SvmCLinearEkmTrainerType SvmTrainer;
1160 SvmTrainer.set_c(
SvmC);
1161 SvmTrainer.set_kernel(DlibDLinearKernelType());
1162 MultiTrainer.set_trainer(SvmTrainer);
1164 if (Classifier == MA::SvmClassifierCRbfEkm)
1166 SvmCRbfEkmTrainerType SvmTrainer;
1169 SvmTrainer.set_c(
SvmC);
1170 SvmTrainer.set_kernel(DlibDRbfKernelType(
RvmRbfGamma));
1171 MultiTrainer.set_trainer(SvmTrainer);
1173 if (Classifier == MA::SvmClassifierCLinearDcd)
1175 SvmCLinearDcdTrainerType SvmTrainer;
1178 SvmTrainer.set_c(
SvmC);
1179 MultiTrainer.set_trainer(SvmTrainer);
1181 if (Classifier == MA::SvmClassifierCLinearDlib)
1183 SvmCLinearTrainerType SvmTrainer;
1186 SvmTrainer.set_c(
SvmC);
1187 MultiTrainer.set_trainer(SvmTrainer);
1189 DlibFunctions->ClassifierDFunction = MultiTrainer.train(TrainingSamples, TrainingLabels);
1192 DlibFSampleTableType TrainingSamples;
1193 MC::DoubleList TrainingLabels;
1195 for (
unsigned int i = 0; i < NormalizedSamples.size(); ++i)
1197 DlibSampleFVectorType List;
1199 List.set_size(NormalizedSamples[0].size(), 1);
1200 for (
unsigned int i1 = 0; i1 < NormalizedSamples[0].size(); ++i1)
1202 List(i1) = NormalizedSamples[i][i1];
1204 TrainingSamples.push_back(List);
1207 DlibFMultiTrainerType MultiTrainer;
1210 if (Classifier == MA::RvmClassifierLinear)
1212 RvmLinearTrainerType RvmTrainer;
1215 RvmTrainer.set_kernel(DlibFLinearKernelType());
1216 MultiTrainer.set_trainer(RvmTrainer);
1218 if (Classifier == MA::RvmClassifierSigmoid)
1220 RvmSigmoidTrainerType RvmTrainer;
1224 MultiTrainer.set_trainer(RvmTrainer);
1226 if (Classifier == MA::RvmClassifierRbf)
1228 RvmRbfTrainerType RvmTrainer;
1231 RvmTrainer.set_kernel(DlibFRbfKernelType(
RvmRbfGamma));
1232 MultiTrainer.set_trainer(RvmTrainer);
1234 if (Classifier == MA::KrRegressionLinear)
1236 KrrLinearTrainerType KrrTrainer;
1239 KrrTrainer.set_kernel(DlibFLinearKernelType());
1240 MultiTrainer.set_trainer(KrrTrainer);
1242 if (Classifier == MA::KrRegressionRbf)
1244 KrrRbfTrainerType KrrTrainer;
1247 KrrTrainer.set_kernel(DlibFRbfKernelType(
KrrGamma));
1248 MultiTrainer.set_trainer(KrrTrainer);
1250 DlibFunctions->ClassifierFFunction = MultiTrainer.train(TrainingSamples, TrainingLabels);
1262 DlibDSampleTableType TrainingSamples;
1263 MC::DoubleList TrainingLabels;
1266 if (Classifier != MA::KrlsLinearRegression && Classifier != MA::KrlsRbfRegression)
1268 for (
unsigned int i = 0; i < NormalizedSamples.size(); ++i)
1270 DlibSampleDVectorType List;
1272 List.set_size(NormalizedSamples[0].size(), 1);
1273 for (
unsigned int i1 = 0; i1 < NormalizedSamples[0].size(); ++i1)
1275 List(i1) = NormalizedSamples[i][i1];
1277 TrainingSamples.push_back(List);
1283 if (Classifier == MA::RvmClassifierLinear)
1285 LinearRegressionTrainerType RvmRegressionTrainer;
1288 RvmRegressionTrainer.set_kernel(DlibDLinearKernelType());
1289 DlibFunctions->LinearRegressionFunction = RvmRegressionTrainer.train(TrainingSamples, TrainingLabels);
1291 if (Classifier == MA::RvmClassifierSigmoid)
1293 SigmoidRegressionTrainerType RvmRegressionTrainer;
1296 RvmRegressionTrainer.set_kernel(DlibDSigmoidKernelType(
RvmSigmoidGamma, -1.0));
1297 DlibFunctions->SigmoidRegressionFunction = RvmRegressionTrainer.train(TrainingSamples, TrainingLabels);
1299 if (Classifier == MA::RvmClassifierRbf)
1301 RbfRegressionTrainerType RvmRegressionTrainer;
1304 RvmRegressionTrainer.set_kernel(DlibDRbfKernelType(
RvmRbfGamma));
1305 DlibFunctions->RbfRegressionFunction = RvmRegressionTrainer.train(TrainingSamples, TrainingLabels);
1307 if (Classifier == MA::KrRegressionLinear)
1309 KrrLinearRegressionTrainerType KrrRegressionTrainer;
1311 KrrRegressionTrainer.set_lambda(
KrrLambda);
1312 KrrRegressionTrainer.set_kernel(DlibDLinearKernelType());
1313 DlibFunctions->LinearRegressionFunction = KrrRegressionTrainer.train(TrainingSamples, TrainingLabels);
1315 if (Classifier == MA::KrRegressionRbf)
1317 KrrRbfRegressionTrainerType KrrRegressionTrainer;
1319 KrrRegressionTrainer.set_lambda(
KrrLambda);
1320 KrrRegressionTrainer.set_kernel(DlibDRbfKernelType(
KrrGamma));
1321 DlibFunctions->RbfRegressionFunction = KrrRegressionTrainer.train(TrainingSamples, TrainingLabels);
1323 if (Classifier == MA::KrlsLinearRegression)
1325 KrlsLinearRegressionTrainerType KrlsLinearRegressionTrainer(DlibDLinearKernelType(),
KrlsTolerance);
1327 for (
unsigned int i = 0; i < NormalizedSamples.size(); ++i)
1329 DlibSampleDVectorType List;
1331 List.set_size(NormalizedSamples[0].size(), 1);
1332 for (
unsigned int i1 = 0; i1 < NormalizedSamples[0].size(); ++i1)
1334 List(i1) = NormalizedSamples[i][i1];
1336 KrlsLinearRegressionTrainer.train(List,
CachedLabels[i]);
1338 DlibFunctions->LinearRegressionFunction = KrlsLinearRegressionTrainer.get_decision_function();
1340 if (Classifier == MA::KrlsRbfRegression)
1344 for (
unsigned int i = 0; i < NormalizedSamples.size(); ++i)
1346 DlibSampleDVectorType List;
1348 List.set_size(NormalizedSamples[0].size(), 1);
1349 for (
unsigned int i1 = 0; i1 < NormalizedSamples[0].size(); ++i1)
1351 List(i1) = NormalizedSamples[i][i1];
1355 DlibFunctions->RbfRegressionFunction = KrlsRbfRegressionTrainer.get_decision_function();
1364 float cv_parameter,
const MC::FloatTable& samples,
1365 const MC::FloatList& labels,
1366 const MC::FloatTable& validation_samples,
1367 const MC::FloatList& validation_labels,
1368 float regression_accuracy)
1370 if (cv_type == MA::RandomLabelCrossValidation && cv_parameter < 1)
1372 MC_WARNING(
"At least one sample per label is needed for random label cross-validation (%d < 1)",
1374 return MA::CvResultsType();
1376 if (cv_type == MA::KFoldCrossValidation && cv_parameter < 2)
1378 MC_WARNING(
"At least 2-fold cross-validation can be done (%d < 2)", cv_parameter);
1379 return MA::CvResultsType();
1381 if (cv_type == MA::MonteCarloCrossValidation && (cv_parameter < 1 || cv_parameter > 99))
1383 MC_WARNING(
"Monte-Carlo cross-validation must have the training set size between 1 < %d < 100)",
1385 return MA::CvResultsType();
1387 if (samples.size() != labels.size())
1389 MC_WARNING(
"Label and samples counts are not consistent (%d != %d)", labels.size(), samples.size());
1390 return MA::CvResultsType();
1392 MC::FloatTable* SampleFolds =
new MC::FloatTable[(
unsigned int)cv_parameter];
1393 MC::FloatList* LabelFolds =
new MC::FloatList[(
unsigned int)cv_parameter];
1394 MC::IntList* TrainingSampleIndexFolds =
new MC::IntList[(
unsigned int)cv_parameter];
1395 unsigned int MonteCarloTrainingSetSize = (int)(cv_parameter*samples.size() / 100.0);
1396 const MC::FloatList UniqueTestingLabels = MCUniqueItemsFromContainer<MC::FloatList>(labels);
1397 const MC::FloatList UniqueValidationLabels = MCUniqueItemsFromContainer<MC::FloatList>(validation_labels);
1398 int TestingLabelCount = UniqueTestingLabels.size();
1399 int ValidationLabelCount = UniqueValidationLabels.size();
1400 MA::FloatTableList TestingResultsTableList;
1401 MA::FloatTableList ValidationResultsTableList;
1402 MC::FloatList SampleRanks(samples.size(), 0.0);
1405 for (
int iter = 0; iter < iterations*(cv_type == MA::KFoldCrossValidation ? (int)cv_parameter : 1);
1408 MC::FloatTable TrainingSamples;
1409 MC::FloatList TrainingLabels;
1410 MC::FloatTable TestingSamples;
1411 MC::FloatList TestingLabels;
1412 MC::IntList Gambling;
1413 MC::FloatTable TestingResultsTable;
1414 MC::FloatTable ValidationResultsTable;
1415 MC::IntList TestingLabelSamples(TestingLabelCount, 0);
1416 MC::IntList ValidationLabelSamples(ValidationLabelCount, 0);
1417 MC::IntList TrainingSampleIndexes;
1420 for (
int i = 0; i < TestingLabelCount; ++i)
1421 TestingResultsTable.push_back(MC::FloatList(TestingLabelCount, 0.0));
1423 if (!validation_samples.empty())
1425 for (
int i = 0; i < ValidationLabelCount; ++i)
1426 ValidationResultsTable.push_back(MC::FloatList(ValidationLabelCount, 0.0));
1429 if (cv_type == MA::RandomLabelCrossValidation)
1431 MA::FloatIntMap LabelsMap;
1434 for (
unsigned int i = 0; i < UniqueTestingLabels.size(); ++i)
1436 LabelsMap.insert(std::make_pair(UniqueTestingLabels[i], 0));
1439 for (
unsigned int i = 0; i < samples.size(); ++i)
1441 Gambling.push_back(i);
1443 MCRandomizeContainer<int, MC::IntList>(Gambling);
1444 for (
unsigned int i = 0; i < samples.size(); ++i)
1446 int CurrentIndex = Gambling[i];
1448 if (LabelsMap[labels[CurrentIndex]] < (
int)cv_parameter)
1450 LabelsMap[labels[CurrentIndex]]++;
1451 TrainingLabels.push_back(labels[CurrentIndex]);
1452 TrainingSamples.push_back(samples[CurrentIndex]);
1453 TrainingSampleIndexes.push_back(CurrentIndex);
1455 TestingLabels.push_back(labels[CurrentIndex]);
1456 TestingSamples.push_back(samples[CurrentIndex]);
1461 if (cv_type == MA::KFoldCrossValidation)
1464 if (iter % (
int)cv_parameter == 0)
1466 for (
int i = 0; i < (int)cv_parameter; ++i)
1468 SampleFolds[i].clear();
1469 LabelFolds[i].clear();
1470 TrainingSampleIndexFolds[i].clear();
1472 for (
unsigned int i = 0; i < samples.size(); ++i)
1474 Gambling.push_back(i);
1476 MCRandomizeContainer<int, MC::IntList>(Gambling);
1477 for (
unsigned int i = 0; i < samples.size(); ++i)
1479 SampleFolds[i % (int)cv_parameter].push_back(samples[Gambling[i]]);
1480 LabelFolds[i % (int)cv_parameter].push_back(labels[Gambling[i]]);
1481 TrainingSampleIndexFolds[i % (int)cv_parameter].push_back(Gambling[i]);
1485 for (
int i = 0; i < (int)cv_parameter; ++i)
1487 if (iter % (
int)cv_parameter == i)
1499 if (cv_type == MA::MonteCarloCrossValidation)
1502 for (
unsigned int i = 0; i < samples.size(); ++i)
1504 Gambling.push_back(i);
1506 MCRandomizeContainer<int, MC::IntList>(Gambling);
1507 for (
unsigned int i = 0; i < samples.size(); ++i)
1509 if (i <= MonteCarloTrainingSetSize)
1511 TrainingLabels.push_back(labels[Gambling[i]]);
1512 TrainingSamples.push_back(samples[Gambling[i]]);
1513 TrainingSampleIndexes.push_back(Gambling[i]);
1515 TestingLabels.push_back(labels[Gambling[i]]);
1516 TestingSamples.push_back(samples[Gambling[i]]);
1526 MC::FloatList CurrentResults;
1528 if (!TestingSamples.empty())
1530 MC::FloatList Confidence;
1532 CurrentResults =
Predict(TestingSamples, Confidence);
1533 for (
unsigned int i = 0; i < TestingLabels.size(); ++i)
1540 if (TestingLabelIndex >= 0)
1542 if (PredictedLabelIndex >= 0)
1544 TestingResultsTable[TestingLabelIndex][PredictedLabelIndex]++;
1546 TestingLabelSamples[TestingLabelIndex]++;
1549 if (CurrentResults[i] >= TestingLabels[i]-regression_accuracy &&
1550 CurrentResults[i] <= TestingLabels[i]+regression_accuracy)
1555 if (TestingLabelIndex >= 0)
1557 if (PredictedLabelIndex >= 0)
1559 TestingResultsTable[TestingLabelIndex][PredictedLabelIndex]++;
1561 TestingLabelSamples[TestingLabelIndex]++;
1570 Result = Result / CurrentResults.size()*100;
1572 for (
unsigned int i = 0; i < TrainingSampleIndexes.size(); ++i)
1574 SampleRanks[TrainingSampleIndexes[i]] += Result;
1578 if (!validation_samples.empty())
1580 MC::FloatList Confidence;
1582 CurrentResults =
Predict(validation_samples, Confidence);
1583 for (
unsigned int i = 0; i < validation_labels.size(); ++i)
1590 if (ValidationLabelIndex >= 0)
1592 if (PredictedLabelIndex >= 0)
1594 ValidationResultsTable[ValidationLabelIndex][PredictedLabelIndex]++;
1596 ValidationLabelSamples[ValidationLabelIndex]++;
1599 if (CurrentResults[i] >= validation_labels[i]-regression_accuracy &&
1600 CurrentResults[i] <= validation_labels[i]+regression_accuracy)
1605 if (ValidationLabelIndex >= 0)
1607 if (PredictedLabelIndex >= 0)
1609 ValidationResultsTable[ValidationLabelIndex][PredictedLabelIndex]++;
1611 ValidationLabelSamples[ValidationLabelIndex]++;
1618 if (!TestingSamples.empty())
1620 for (
unsigned int i = 0; i < TestingLabelSamples.size(); ++i)
1622 if (TestingLabelSamples[i] != 0.0)
1625 TestingResultsTableList.push_back(TestingResultsTable);
1627 if (!validation_samples.empty())
1629 for (
unsigned int i = 0; i < ValidationLabelSamples.size(); ++i)
1631 if (ValidationLabelSamples[i] != 0.0)
1632 MCMultiplyTableRow(ValidationResultsTable, i, (
float)100.0 / ValidationLabelSamples[i]);
1634 ValidationResultsTableList.push_back(ValidationResultsTable);
1638 if (cv_type == MA::KFoldCrossValidation)
1640 MA::FloatTableList FinalTestingResults;
1641 MA::FloatTableList FinalValidationResults;
1642 MC::FloatTable CurrentTable;
1643 MC::IntList LabelSampleCounts;
1645 for (
unsigned int i = 0; i < TestingResultsTableList.size(); ++i)
1647 if (i % (
int)cv_parameter == 0)
1649 CurrentTable.clear();
1650 LabelSampleCounts = MC::IntList(TestingResultsTableList[0].size(), 0);
1652 MCSumTables(CurrentTable, TestingResultsTableList[i], (
float)1.0);
1654 for (
unsigned int i1 = 0; i1 < TestingResultsTableList[i].size(); ++i1)
1657 for (
unsigned int i2 = 0; i2 < TestingResultsTableList[i][i1].size(); ++i2)
1659 if (TestingResultsTableList[i][i1][i2] != 0.0)
1666 LabelSampleCounts[i1]++;
1668 if (i % (
int)cv_parameter == (
unsigned int)cv_parameter-1)
1670 for (
unsigned int i1 = 0; i1 < CurrentTable.size(); ++i1)
1672 FinalTestingResults.push_back(CurrentTable);
1675 if (!validation_samples.empty())
1677 for (
unsigned int i = 0; i < ValidationResultsTableList.size(); ++i)
1679 if (i % (
int)cv_parameter == 0)
1681 LabelSampleCounts = MC::IntList(ValidationResultsTableList[0].size(), 0);
1682 CurrentTable.clear();
1684 MCSumTables(CurrentTable, ValidationResultsTableList[i], (
float)1.0);
1686 for (
unsigned int i1 = 0; i1 < ValidationResultsTableList[i].size(); ++i1)
1689 for (
unsigned int i2 = 0; i2 < ValidationResultsTableList[i][i1].size(); ++i2)
1691 if (ValidationResultsTableList[i][i1][i2] != 0.0)
1698 LabelSampleCounts[i1]++;
1700 if (i % (
int)cv_parameter == (
unsigned int)cv_parameter-1)
1702 for (
unsigned int i1 = 0; i1 < CurrentTable.size(); ++i1)
1704 FinalValidationResults.push_back(CurrentTable);
1708 delete [] SampleFolds;
1709 delete [] LabelFolds;
1710 delete [] TrainingSampleIndexFolds;
1711 return MA::CvResultsType(FinalTestingResults, FinalValidationResults, SampleRanks);
1713 delete [] SampleFolds;
1714 delete [] LabelFolds;
1715 delete [] TrainingSampleIndexFolds;
1716 return MA::CvResultsType(TestingResultsTableList, ValidationResultsTableList, SampleRanks);
1724 std::vector<char> TempBuffer;
1726 boost::iostreams::stream<boost::iostreams::back_insert_device<std::vector<char> > > OutStream(TempBuffer);
1728 boost::archive::binary_oarchive OutputArchive(OutStream);
1730 OutputArchive << *
this;
1734 memcpy(BinaryData->
GetData(), &TempBuffer[0], TempBuffer.size());
1744 boost::iostreams::basic_array_source<char> Source((
char*)data.
GetData(),
1745 (std::size_t)(data.
GetSize()));
1746 boost::iostreams::stream<boost::iostreams::basic_array_source<char> > InStream(Source);
1747 boost::archive::binary_iarchive InputArchive(InStream);
1752 MC_WARNING(
"Incompatible classifier encoding");
1761 CvStatModel* Model =
nullptr;
1762 cv::Algorithm* Model2 =
nullptr;
1766 MC_WARNING(
"Can't export a not trained classifier");
1774 if (
Classifier == MA::NeuralNetworkClassifier)
1782 if (
Classifier == MA::KNearestNeighborClassifier)
1786 if (
Classifier == MA::DecisionTreeClassifier)
1794 if (
Classifier == MA::ExtremeRandomTreesClassifier)
1798 if (
Classifier == MA::GradientBoostedTreesClassifier)
1802 if (
Classifier == MA::ExpectationMaximization)
1806 if (Model || Model2)
1808 boost::scoped_ptr<cv::FileStorage> FileStorage;
1810 FileStorage.reset(
new cv::FileStorage(
".xml", cv::FileStorage::WRITE+cv::FileStorage::MEMORY));
1813 Model->write(**FileStorage, MA::CRMethodTypeStrs[(
int)
Classifier].c_str());
1815 cvStartWriteStruct(**FileStorage, MA::CRMethodTypeStrs[(
int)
Classifier].c_str(), CV_NODE_MAP);
1816 Model2->write(*FileStorage);
1817 cvEndWriteStruct(**FileStorage);
1823 if (
Classifier == MA::ExpectationMaximization)
1827 *FileStorage <<
"PreprocessingMode" << MA::FeaturePreprocessingTypeStrs[(int)
Preprocessing];
1829 return new MAModel(FileStorage->releaseAndGetString());
1832 std::ostringstream OutputBuffer;
1834 dlib::serialize(MA::CRMethodTypeStrs[(
int)
Classifier], OutputBuffer);
1835 if (Classifier == MA::SvmClassifierCLinearEkm || Classifier == MA::SvmClassifierCRbfEkm ||
1836 Classifier == MA::SvmClassifierCLinearDcd || Classifier == MA::SvmClassifierCLinearDlib)
1838 DlibDModelSerializeType SaveModel =
DlibFunctions->ClassifierDFunction;
1840 dlib::serialize(SaveModel, OutputBuffer);
1842 if (Classifier == MA::RvmClassifierLinear || Classifier == MA::RvmClassifierSigmoid ||
1843 Classifier == MA::RvmClassifierRbf || Classifier == MA::KrRegressionLinear ||
1844 Classifier == MA::KrRegressionRbf)
1846 DlibFModelSerializeType SaveModel =
DlibFunctions->ClassifierFFunction;
1848 dlib::serialize(SaveModel, OutputBuffer);
1850 MC_WARNING(
"Unsupported classifier for model export (%s)", MA::CRMethodTypeStrs[(
int)Classifier].c_str());
1856 dlib::serialize(UniqueLabels, OutputBuffer);
1857 dlib::serialize(MA::FeaturePreprocessingTypeStrs[(
int)
Preprocessing], OutputBuffer);
1859 return new MAModel(OutputBuffer.str());
1865 if (
Classifier == MA::NeuralNetworkClassifier)
1875 if (
Classifier == MA::KNearestNeighborClassifier)
1909 if (
Classifier == MA::DecisionTreeClassifier)
1919 if (
Classifier == MA::ExtremeRandomTreesClassifier)
1924 if (
Classifier == MA::GradientBoostedTreesClassifier)
1929 if (
Classifier == MA::ExpectationMaximization)
1938 #if defined(__unix__) 1940 if (
Classifier == MA::GaussianProcessRegression)
1943 Gpr.reset(
new GpWrapper);
1949 template<
class Archive>
1950 void MAClassifier::load(Archive& archive,
const unsigned int version)
1977 archive & PlsrComponents;
1981 archive & TreeNodeSampleLimit;
1990 MC::FloatList Labels;
1994 if (
Classifier == MA::ExpectationMaximization)
2004 template<
class Archive>
2005 void MAClassifier::save(Archive& archive,
const unsigned int version)
const 2030 archive & PlsrComponents;
2034 archive & TreeNodeSampleLimit;
2043 if (
Classifier == MA::ExpectationMaximization)
2054 template void MAClassifier::load<boost::archive::binary_iarchive>(boost::archive::binary_iarchive&,
2055 const unsigned int);
2056 template void MAClassifier::save<boost::archive::binary_oarchive>(boost::archive::binary_oarchive&,
2057 const unsigned int)
const;
2058 template void MAClassifier::load<eos::portable_iarchive>(eos::portable_iarchive&,
const unsigned int);
2059 template void MAClassifier::save<eos::portable_oarchive>(eos::portable_oarchive&,
const unsigned int)
const;
bool MCContainerContains(const U &container, const T &value)
Check if a container contains a value.
Arithmetic sum statistic.
float MeL1
L1 regularization parameter (maximum entropy)
float SvmC
C parameter (support vector machine)
boost::scoped_ptr< CvGBTrees > GradientBoostedTrees
Gradient boosted trees classifier.
MAClassifier()
Class constructor.
MC::FloatTable CachedSamples
Cached training samples.
boost::scoped_ptr< CvSVMParams > SvmClassifierParams
Support vector machines classifier.
void SetParameter(MA::CRMethodParamType method_parameter, float value)
Set a method parameter.
boost::scoped_ptr< CvANN_MLP > NeuralNetwork
Neural network classifier.
void Reset()
The method is reset to default state and the training samples are dropped.
MAModel * ExportModel() const
Export an OpenCV classifier model.
void MCMultiplyTableRow(V &table, unsigned int row_index, T multiplier)
Multiple table row by a value.
float SvmGamma
γ parameter (support vector machine)
boost::scoped_ptr< LWPR_Object > Lwpr
Locally weighted projection regression.
boost::scoped_ptr< GpWrapper > Gpr
Gaussian process regression.
boost::scoped_ptr< PLS_Model > Plsr
Partial least squares regression.
std::vector< std::vector< float > > MCCalculateMinMaxForTableColumns(const V &table)
Calculate minimums and maximums for table columns.
bool IsValid() const
Check if some training samples has been already added.
float KrrGamma
Gamma parameter (kernel ridge regression/rbf kernel)
MCBinaryData * Encode() const
Encode the classifier into binary data.
void CreateClassifier()
Create the classifier/regression method internally with the default parameters.
MA::CvResultsType CrossValidate(int iterations, MA::ClassifierCrossValidationType cv_type, float cv_parameter, const MC::FloatTable &samples, const MC::FloatList &labels, const MC::FloatTable &validation_samples=MC::FloatTable(), const MC::FloatList &validation_labels=MC::FloatList(), float regression_accuracy=MCFloatInfinity())
Cross-validate a set of samples.
MA::FeaturePreprocessingType Preprocessing
Preprocessing type.
Classifier model based on OpenCV classifiers.
#define MC_WARNING(...)
Warning macro.
void SetPreprocessingMode(MA::FeaturePreprocessingType preprocessing_mode)
Set the preprocessing mode.
float KrlsGamma
Gamma parameter (kernel recursive least squares/rbf kernel)
std::string MCEncodeToString(const T &data, bool portable=true)
Encode a data into a string.
std::string MCToStr(const T value, bool hex_manipulator=false)
Convert an other type to string with std::stringstream.
T MCAbs(const T &value)
Calculate absolute value.
bool IsRegression() const
Check if regression mode is selected.
int RtMaxForestSize
Maximum number of trees in a forest (random/extremely randomized/gradient boosted trees) ...
boost::scoped_ptr< CvNormalBayesClassifier > BayesClassifier
Naive Bayes classifier.
T MCRand(const T &min, const T &max)
Get a random number generated with standard calls.
void PrioritizeClasses(const MC::FloatList &labels)
Prioritized classes.
float RvmRbfGamma
Gamma parameter (relevance vector machine/rbf kernel)
static MAClassifier * Decode(const MCBinaryData &data)
Decode the classifier from binary data.
unsigned int LabelCount
Label count.
boost::scoped_ptr< CvSVM > SvmClassifier
Support vector machines classifier.
MC::FloatList PrioritizedClasses
Prioritized classes for OpenCV classifiers.
MA::CRMethodType Classifier
Classifier type.
boost::scoped_ptr< ME_Model > MaxEntropy
Maximum entropy classifier.
MC::FloatList & GetLabels()
Get labels.
boost::scoped_ptr< CvERTrees > ExtremeRandomTrees
Extremely randomized trees classifier.
unsigned int FeatureCount
Feature count.
boost::scoped_ptr< CvEmWrapper > EmClassifier
Expectation maximization classifier.
MA::CRMethodType GetMethodType() const
Get classifier/regression method type.
boost::scoped_ptr< CvKNearest > KNearestClassifier
K-nearest neighbor classifier.
bool MCIsFloatInfinity(const float value)
Check a value for float infinity.
#define MC_UNUSED(a)
Helper macro to avoid compiler warning about unused function parameters.
MC::FloatList Predict(const MC::FloatTable &input_vectors, MC::FloatList &confidences)
Predict some samples with labels.
float KrlsTolerance
Tolerance parameter (kernel recursive least squares)
void AddSamples(const MC::FloatTable &input_vectors, const MC::FloatList &labels)
Add samples for a classifier or regression model.
MA::FloatSet CachedUniqueLabels
Cached unique labels.
unsigned int GetFeatureVectorSize() const
Get feature vector size.
float SvmNu
ν parameter (support vector machine)
bool Regression
Whether the instance is a normal classifier or regression is used.
float DlibEpsilon
Epsilon parameter (support/relevance vector machine in dlib)
void MCMergeContainers(U &target, const U &other)
Merge two containers.
MC::FloatTable & GetFeatureVectors()
Get feature vectors.
boost::scoped_ptr< MARandomTrees > RandomTrees
Random trees classifier.
boost::scoped_ptr< DlibWrapper > DlibFunctions
Wrapper for Dlib classifier/regression functions.
boost::scoped_ptr< CvDTree > DecisionTree
Decision tree classifier.
std::vector< int > MCItemIndicesInContainer(const U &container, const T item)
Get item indices in a container.
float SvmP
P parameter (support vector machine)
bool SvmAutoTrain
Auto-train parameter (support vector machine)
unsigned char * GetData() const
Get direct access to the binary data.
float GetParameter(MA::CRMethodParamType method_parameter)
Get a method parameter.
int TreeMaxDepth
Maximum depth (decision/random/extremely randomized/gradient boosted trees)
float MCFloatInfinity()
Get float infinity.
float LwprAlpha
α parameter (locally weighted projection regression)
MC::FloatList GetModelLabels() const
Get the list of unique labels.
MC::FloatList PriorityLabels
Priors for OpenCV classifiers.
MC::FloatTable PreprocessedData
Cached preprocessed data.
std::vector< std::vector< float > > MCCalculateMeanStDevForTableColumns(const V &table)
Calculate standard deviation and arithmetic mean for table columns.
float MeL2
L2 regularization parameter (maximum entropy)
bool Trained
Whether the classifier is already trained.
Common inferface for multiple classifiers and regression algorithms.
float KrrLambda
Lambda parameter (kernel ridge regression)
#define MC_LOG(...)
Debug macro.
float RvmSigmoidGamma
Gamma parameter (relevance vector machine/sigmoid kernel)
MC::FloatList CachedLabels
Cached training labels.
void MCSumTables(V &target_table, const V &second_table, T multiplier)
Summarize tables.
int GetSize() const
Get binary data size.