int main (int argc, const char * argv[]) { //Create a new gesture recognition pipeline GestureRecognitionPipeline pipeline; //Add an ANBC module pipeline.setClassifier( ANBC() ); //Add a ClassLabelFilter as a post processing module with a minCount of 5 and a buffer size of 10 pipeline.addPostProcessingModule( ClassLabelFilter(5,10) ); //Load some training data to train and test the classifier ClassificationData trainingData; ClassificationData testData; if( !trainingData.loadDatasetFromFile("ClassLabelFilterTrainingData.txt") ){ cout << "Failed to load training data!\n"; return EXIT_FAILURE; } if( !testData.loadDatasetFromFile("ClassLabelFilterTestData.txt") ){ cout << "Failed to load training data!\n"; return EXIT_FAILURE; } //Train the classifier if( !pipeline.train( trainingData ) ){ cout << "Failed to train classifier!\n"; return EXIT_FAILURE; } //Use the test dataset to demonstrate the output of the ClassLabelFilter for(UINT i=0; i<testData.getNumSamples(); i++){ VectorDouble inputVector = testData[i].getSample(); if( !pipeline.predict( inputVector ) ){ cout << "Failed to perform prediction for test sampel: " << i <<"\n"; return EXIT_FAILURE; } //Get the predicted class label (this will be the processed class label) UINT predictedClassLabel = pipeline.getPredictedClassLabel(); //Get the unprocessed class label (i.e. the direct output of the classifier) UINT unprocessedClassLabel = pipeline.getUnProcessedPredictedClassLabel(); //Also print the results to the screen cout << "Processed Class Label: \t" << predictedClassLabel << "\tUnprocessed Class Label: \t" << unprocessedClassLabel << endl; } return EXIT_SUCCESS; }
int main(void){ cout << "ClassificationData Test" << endl; ClassificationData cdata; // load data file that in Nick Gillian Format if(cdata.loadDatasetFromFile("irisNG.txt")){ cout << "error loading csv file" << endl; } cdata.printStats(); cout << "convert dataset to csv" << endl; //convert it to CSV. the first column indicate the class cdata.saveDatasetToCSVFile("irisCSVFromNG.txt"); //obviously we can load the data from CSV that we generated //note that class names are now lost cdata.loadDatasetFromCSVFile("irisCSVFromNG.txt"); cdata.printStats(); //try to load a CSV file that includes strings //cdata.loadDatasetFromCSVFile("irisCSV.txt", 4); //commented out because we get error while loading //load CSV file without strings but the classes are stored is the 5th column cdata.loadDatasetFromCSVFile("irisCSVNoText.txt", 4); cdata.printStats(); cdata.loadDatasetFromCSVFile("TestCSV.txt"); cdata.printStats(); return 0; }
int main (int argc, const char * argv[]) { //Load the example data ClassificationData data; if( !data.loadDatasetFromFile("WiiAccShakeData.txt") ){ cout << "ERROR: Failed to load data from file!\n"; return EXIT_FAILURE; } //The variables used to initialize the zero crossing counter feature extraction UINT searchWindowSize = 20; double deadZoneThreshold = 0.01; UINT numDimensions = data.getNumDimensions(); UINT featureMode = ZeroCrossingCounter::INDEPENDANT_FEATURE_MODE; //This could also be ZeroCrossingCounter::COMBINED_FEATURE_MODE //Create a new instance of the ZeroCrossingCounter feature extraction ZeroCrossingCounter zeroCrossingCounter(searchWindowSize,deadZoneThreshold,numDimensions,featureMode); //Loop over the accelerometer data, at each time sample (i) compute the features using the new sample and then write the results to a file for(UINT i=0; i<data.getNumSamples(); i++){ //Compute the features using this new sample zeroCrossingCounter.computeFeatures( data[i].getSample() ); //Write the data to the file cout << "InputVector: "; for(UINT j=0; j<data.getNumDimensions(); j++){ cout << data[i].getSample()[j] << "\t"; } //Get the latest feature vector VectorDouble featureVector = zeroCrossingCounter.getFeatureVector(); //Write the features to the file cout << "FeatureVector: "; for(UINT j=0; j<featureVector.size(); j++){ cout << featureVector[j]; if( j != featureVector.size()-1 ) cout << "\t"; } cout << endl; } //Save the zero crossing counter settings to a file zeroCrossingCounter.saveModelToFile("ZeroCrossingCounterSettings.txt"); //You can then load the settings again if you need them zeroCrossingCounter.loadModelFromFile("ZeroCrossingCounterSettings.txt"); return EXIT_SUCCESS; }
int main (int argc, const char * argv[]) { GestureRecognitionPipeline pipeline; ANBC anbc; ClassificationData trainingData; trainingData.loadDatasetFromFile("training-data.txt") pipeline.setClassifier(anbc); pipeline.train(trainingData); VectorDouble inputVector(SAMPLE_DIMENSION) = getDataFromSensor(); pipeline.predict(inputVector); UINT predictedClassLabel = pipeline.getPredictedClassLabel(); double maxLikelihood = pipeline.getMaximumLikelihood(); printf("predictedClassLabel : %d , MaximumLikelihood : %f \n", predictedClassLabel, maxLikelihood); return EXIT_SUCCESS; }
int main (int argc, const char * argv[]) { //Create a new Softmax instance Softmax softmax; //Load some training data to train the classifier ClassificationData trainingData; if( !trainingData.loadDatasetFromFile("SoftmaxTrainingData.txt") ){ cout << "Failed to load training data!\n"; return EXIT_FAILURE; } //Use 20% of the training dataset to create a test dataset ClassificationData testData = trainingData.partition( 80 ); //Train the classifier if( !softmax.train( trainingData ) ){ cout << "Failed to train classifier!\n"; return EXIT_FAILURE; } //Save the Softmax model to a file if( !softmax.saveModelToFile("SoftmaxModel.txt") ){ cout << "Failed to save the classifier model!\n"; return EXIT_FAILURE; } //Load the Softmax model from a file if( !softmax.loadModelFromFile("SoftmaxModel.txt") ){ cout << "Failed to load the classifier model!\n"; return EXIT_FAILURE; } //Use the test dataset to test the softmax model double accuracy = 0; for(UINT i=0; i<testData.getNumSamples(); i++){ //Get the i'th test sample UINT classLabel = testData[i].getClassLabel(); vector< double > inputVector = testData[i].getSample(); //Perform a prediction using the classifier if( !softmax.predict( inputVector ) ){ cout << "Failed to perform prediction for test sample: " << i <<"\n"; return EXIT_FAILURE; } //Get the predicted class label UINT predictedClassLabel = softmax.getPredictedClassLabel(); vector< double > classLikelihoods = softmax.getClassLikelihoods(); vector< double > classDistances = softmax.getClassDistances(); //Update the accuracy if( classLabel == predictedClassLabel ) accuracy++; cout << "TestSample: " << i << " ClassLabel: " << classLabel << " PredictedClassLabel: " << predictedClassLabel << endl; } cout << "Test Accuracy: " << accuracy/double(testData.getNumSamples())*100.0 << "%" << endl; return EXIT_SUCCESS; }
void metrics_separate_data(){ // Training and test data ClassificationData trainingData; ClassificationData testData; string file_path = "../../../data/"; if( !trainingData.loadDatasetFromFile(file_path + "train/grt/12345.txt") ){ std::cout <<"Failed to load training data!\n"; } ANBC anbc; anbc.enableScaling(true); anbc.enableNullRejection(true); SVM svm(SVM::RBF_KERNEL); svm.enableScaling(true); svm.enableNullRejection(true); MinDist minDist; minDist.setNumClusters(4); minDist.enableScaling(true); minDist.enableNullRejection(true); ofstream outputFileStream("accuracy-mindist.csv"); outputFileStream << "classLabel,nullRejectionCoeff,accuracy, \n"; for(int class_name = 1; class_name<=5; class_name++){ if( !testData.loadDatasetFromFile(file_path + "test/grt/" + to_string(class_name) + ".txt") ){ std::cout <<"Failed to load training data!\n"; } for(double nullRejectionCoeff = 0; nullRejectionCoeff <= 10; nullRejectionCoeff=nullRejectionCoeff+0.2){ // anbc.setNullRejectionCoeff(nullRejectionCoeff); // svm.setNullRejectionCoeff(nullRejectionCoeff); minDist.setNullRejectionCoeff(nullRejectionCoeff); GestureRecognitionPipeline pipeline; // pipeline.setClassifier(anbc); // pipeline.setClassifier(svm); pipeline.setClassifier(minDist); // Train the pipeline if( !pipeline.train( trainingData ) ){ std::cout << "Failed to train classifier!\n"; } // Evaluation double accuracy = 0; for(UINT i=0; i<testData.getNumSamples(); i++){ UINT actualClassLabel = testData[i].getClassLabel(); vector< double > inputVector = testData[i].getSample(); if( !pipeline.predict( inputVector )){ std::cout << "Failed to perform prediction for test sampel: " << i <<"\n"; } UINT predictedClassLabel = pipeline.getPredictedClassLabel(); if( actualClassLabel == predictedClassLabel) accuracy++; } outputFileStream << class_name << ',' << nullRejectionCoeff << ',' << accuracy/double(testData.getNumSamples())*100.0 << '\n'; cout<< "Done" << endl; } } //---------------------- Null Gesture Test -----------------// int class_name = 0; if( !testData.loadDatasetFromFile(file_path + "test/grt/" + to_string(class_name) + ".txt") ){ std::cout <<"Failed to load training data!\n"; } for(double nullRejectionCoeff = 0; nullRejectionCoeff <= 10; nullRejectionCoeff=nullRejectionCoeff+0.2){ // anbc.setNullRejectionCoeff(nullRejectionCoeff); // svm.setNullRejectionCoeff(nullRejectionCoeff); minDist.setNullRejectionCoeff(nullRejectionCoeff); GestureRecognitionPipeline pipeline; // pipeline.setClassifier(anbc); // pipeline.setClassifier(svm); pipeline.setClassifier(minDist); // Train the pipeline if( !pipeline.train( trainingData ) ){ std::cout << "Failed to train classifier!\n"; } // Evaluation double accuracy = 0; for(UINT i=0; i<testData.getNumSamples(); i++){ vector< double > inputVector = testData[i].getSample(); if( !pipeline.predict( inputVector )){ std::cout << "Failed to perform prediction for test sampel: " << i <<"\n"; } UINT predictedClassLabel = pipeline.getPredictedClassLabel(); if(predictedClassLabel == 0 ) accuracy++; } outputFileStream << class_name << ',' << nullRejectionCoeff << ',' << accuracy/double(testData.getNumSamples())*100.0 << '\n'; cout<< "Done" << endl; } }
void metrics_subset_data(){ ANBC anbc; anbc.enableScaling(true); anbc.enableNullRejection(true); MinDist minDist; minDist.setNumClusters(4); minDist.enableScaling(true); minDist.enableNullRejection(true); // ofstream opRecall("anbc-recall-nr-0-10.csv"); // opRecall <<"nrCoeff,class0,class1,class2,class3,class4,class5\n"; // // ofstream opInstanceRes("anbc-prediction-nr-2.csv"); // opInstanceRes <<"actualClass,predictedClass,maximumLikelihood,lZ,lY,lZ,rZ,rY,rZ\n"; // // ofstream opMetrics("anbc-precision-recall-fmeasure-nr-2.csv"); // opMetrics <<"class1,class2,class3,class4,class5\n"; // // ofstream opConfusion("anbc-confusion-nr-2.csv"); // opConfusion <<"class0,class1,class2,class3,class4,class5\n"; ofstream opRecall("mindist-recall-nr-0-10.csv"); opRecall <<"nrCoeff,class0,class1,class2,class3,class4,class5\n"; ofstream opInstanceRes("mindist-prediction-nr-2.csv"); opInstanceRes <<"actualClass,predictedClass,maximumLikelihood,lZ,lY,lZ,rZ,rY,rZ\n"; ofstream opMetrics("mindist-precision-recall-fmeasure-nr-2.csv"); opMetrics <<"class1,class2,class3,class4,class5\n"; ofstream opConfusion("mindist-confusion-nr-2.csv"); opConfusion <<"class0,class1,class2,class3,class4,class5\n"; // Training and test data ClassificationData trainingData; ClassificationData testData; ClassificationData nullGestureData; string file_path = "../../../data/"; if( !trainingData.loadDatasetFromFile(file_path + "train/grt/hri-training-dataset.txt") ){ std::cout <<"Failed to load training data!\n"; } if( !nullGestureData.loadDatasetFromFile(file_path + "test/grt/0.txt") ){ std::cout <<"Failed to load null gesture data!\n"; } testData = trainingData.partition(90); testData.sortClassLabels(); // testData.saveDatasetToFile("anbc-validation-subset.txt"); testData.saveDatasetToFile("mindist-validation-subset.txt"); for(double nullRejectionCoeff = 0; nullRejectionCoeff <= 10; nullRejectionCoeff=nullRejectionCoeff+0.2){ // anbc.setNullRejectionCoeff(nullRejectionCoeff); // GestureRecognitionPipeline pipeline; // pipeline.setClassifier(anbc); minDist.setNullRejectionCoeff(nullRejectionCoeff); GestureRecognitionPipeline pipeline; pipeline.setClassifier(minDist); pipeline.train(trainingData); pipeline.test(testData); TestResult testRes = pipeline.getTestResults(); opRecall << nullRejectionCoeff << ","; //null rejection prediction double accuracy = 0; for(UINT i=0; i<nullGestureData.getNumSamples(); i++){ vector< double > inputVector = nullGestureData[i].getSample(); if( !pipeline.predict( inputVector )){ std::cout << "Failed to perform prediction for test sampel: " << i <<"\n"; } UINT predictedClassLabel = pipeline.getPredictedClassLabel(); if(predictedClassLabel == 0 ) accuracy++; } opRecall << accuracy/double(nullGestureData.getNumSamples()) << ","; // other classes prediction for(int cl = 0; cl < testRes.recall.size(); cl++ ){ opRecall << testRes.recall[cl]; if(cl < testRes.recall.size() - 1){ opRecall << ","; } } opRecall<< endl; // Calculate instance prediction, precision, recall, fmeasure and confusion matrix for nullRejection 2.0 if(AreDoubleSame(nullRejectionCoeff, 2.0)) { //instance prediction for(UINT i=0; i<testData.getNumSamples(); i++){ UINT actualClassLabel = testData[i].getClassLabel(); vector< double > inputVector = testData[i].getSample(); if( !pipeline.predict( inputVector )){ std::cout << "Failed to perform prediction for test sampel: " << i <<"\n"; } UINT predictedClassLabel = pipeline.getPredictedClassLabel(); double maximumLikelihood = pipeline.getMaximumLikelihood(); opInstanceRes << actualClassLabel << "," << predictedClassLabel << "," << maximumLikelihood << "," << inputVector[0] << "," << inputVector[1] << "," << inputVector[2] << "," << inputVector[3] << "," << inputVector[4] << "," << inputVector[5] << "\n"; } //precision, recall, fmeasure for(int cl = 0; cl < testRes.precision.size(); cl++ ){ opMetrics << testRes.precision[cl]; if(cl < testRes.precision.size() - 1){ opMetrics << ","; } } opMetrics<< endl; for(int cl = 0; cl < testRes.recall.size(); cl++ ){ opMetrics << testRes.recall[cl]; if(cl < testRes.recall.size() - 1){ opMetrics << ","; } } opMetrics<< endl; for(int cl = 0; cl < testRes.fMeasure.size(); cl++ ){ opMetrics << testRes.fMeasure[cl]; if(cl < testRes.fMeasure.size() - 1){ opMetrics << ","; } } opMetrics<< endl; //confusion matrix MatrixDouble matrix = testRes.confusionMatrix; for(UINT i=0; i<matrix.getNumRows(); i++){ for(UINT j=0; j<matrix.getNumCols(); j++){ opConfusion << matrix[i][j]; if(j < matrix.getNumCols() - 1){ opConfusion << ","; } } opConfusion << endl; } opConfusion << endl; } } cout << "Done\n"; }
void prediction_axis_data(){ // Training and test data ClassificationData trainingData; ClassificationData testData; string file_path = "../../../data/"; string class_name = "5"; if( !trainingData.loadDatasetFromFile(file_path + "train/grt/" + class_name + ".txt") ){ std::cout <<"Failed to load training data!\n"; } if( !testData.loadDatasetFromFile(file_path + "test/grt/" + class_name + ".txt") ){ std::cout <<"Failed to load training data!\n"; } // Pipeline setup ANBC anbc; anbc.setNullRejectionCoeff(1); anbc.enableScaling(true); anbc.enableNullRejection(true); GestureRecognitionPipeline pipeline; pipeline.setClassifier(anbc); // Train the pipeline if( !pipeline.train( trainingData ) ){ std::cout << "Failed to train classifier!\n"; } // File stream ofstream outputFileStream(class_name + ".csv"); // Evaluation double accuracy = 0; outputFileStream << "actualClass,predictedClass,maximumLikelihood,lZ,lY,lZ,rZ,rY,rZ \n"; for(UINT i=0; i<testData.getNumSamples(); i++){ UINT actualClassLabel = testData[i].getClassLabel(); vector< double > inputVector = testData[i].getSample(); if( !pipeline.predict( inputVector )){ std::cout << "Failed to perform prediction for test sampel: " << i <<"\n"; } UINT predictedClassLabel = pipeline.getPredictedClassLabel(); double maximumLikelihood = pipeline.getMaximumLikelihood(); outputFileStream << actualClassLabel << "," << predictedClassLabel << "," << maximumLikelihood << "," << inputVector[0] << "," << inputVector[1] << "," << inputVector[2] << "," << inputVector[3] << "," << inputVector[4] << "," << inputVector[5] << "\n"; if( actualClassLabel == predictedClassLabel) accuracy++; } std::cout << "Test Accuracy testHandsUp : " << accuracy/double(testData.getNumSamples())*100.0 << " %\n"; }
int main (int argc, const char * argv[]) { //Load some training data from a file ClassificationData trainingData; if( !trainingData.loadDatasetFromFile("HelloWorldTrainingData.grt") ){ cout << "ERROR: Failed to load training data from file\n"; return EXIT_FAILURE; } cout << "Data Loaded\n"; //Print out some stats about the training data trainingData.printStats(); //Partition the training data into a training dataset and a test dataset. 80 means that 80% //of the data will be used for the training data and 20% will be returned as the test dataset ClassificationData testData = trainingData.partition(80); //Create a new Gesture Recognition Pipeline using an Adaptive Naive Bayes Classifier GestureRecognitionPipeline pipeline; pipeline.setClassifier( ANBC() ); //Train the pipeline using the training data if( !pipeline.train( trainingData ) ){ cout << "ERROR: Failed to train the pipeline!\n"; return EXIT_FAILURE; } //Save the pipeline to a file if( !pipeline.savePipelineToFile( "HelloWorldPipeline.grt" ) ){ cout << "ERROR: Failed to save the pipeline!\n"; return EXIT_FAILURE; } //Load the pipeline from a file if( !pipeline.loadPipelineFromFile( "HelloWorldPipeline.grt" ) ){ cout << "ERROR: Failed to load the pipeline!\n"; return EXIT_FAILURE; } //Test the pipeline using the test data if( !pipeline.test( testData ) ){ cout << "ERROR: Failed to test the pipeline!\n"; return EXIT_FAILURE; } //Print some stats about the testing cout << "Test Accuracy: " << pipeline.getTestAccuracy() << endl; cout << "Precision: "; for(UINT k=0; k<pipeline.getNumClassesInModel(); k++){ UINT classLabel = pipeline.getClassLabels()[k]; cout << "\t" << pipeline.getTestPrecision(classLabel); }cout << endl; cout << "Recall: "; for(UINT k=0; k<pipeline.getNumClassesInModel(); k++){ UINT classLabel = pipeline.getClassLabels()[k]; cout << "\t" << pipeline.getTestRecall(classLabel); }cout << endl; cout << "FMeasure: "; for(UINT k=0; k<pipeline.getNumClassesInModel(); k++){ UINT classLabel = pipeline.getClassLabels()[k]; cout << "\t" << pipeline.getTestFMeasure(classLabel); }cout << endl; MatrixDouble confusionMatrix = pipeline.getTestConfusionMatrix(); cout << "ConfusionMatrix: \n"; for(UINT i=0; i<confusionMatrix.getNumRows(); i++){ for(UINT j=0; j<confusionMatrix.getNumCols(); j++){ cout << confusionMatrix[i][j] << "\t"; }cout << endl; } return EXIT_SUCCESS; }
int main (int argc, const char * argv[]) { //Create a new KNN classifier with a K value of 10 KNN knn(10); knn.setNullRejectionCoeff( 10 ); knn.enableScaling( true ); knn.enableNullRejection( true ); //Train the classifier with some training data ClassificationData trainingData; if( !trainingData.loadDatasetFromFile("KNNTrainingData.grt") ){ cout << "Failed to load training data!\n"; return EXIT_FAILURE; } //Use 20% of the training dataset to create a test dataset ClassificationData testData = trainingData.partition( 80 ); //Train the classifier bool trainSuccess = knn.train( trainingData ); if( !trainSuccess ){ cout << "Failed to train classifier!\n"; return EXIT_FAILURE; } //Save the knn model to a file if( !knn.save("KNNModel.grt") ){ cout << "Failed to save the classifier model!\n"; return EXIT_FAILURE; } //Load the knn model from a file if( !knn.load("KNNModel.grt") ){ cout << "Failed to load the classifier model!\n"; return EXIT_FAILURE; } //Use the test dataset to test the KNN model double accuracy = 0; for(UINT i=0; i<testData.getNumSamples(); i++){ //Get the i'th test sample UINT classLabel = testData[i].getClassLabel(); vector< double > inputVector = testData[i].getSample(); //Perform a prediction using the classifier bool predictSuccess = knn.predict( inputVector ); if( !predictSuccess ){ cout << "Failed to perform prediction for test sampel: " << i <<"\n"; return EXIT_FAILURE; } //Get the predicted class label UINT predictedClassLabel = knn.getPredictedClassLabel(); vector< double > classLikelihoods = knn.getClassLikelihoods(); vector< double > classDistances = knn.getClassDistances(); //Update the accuracy if( classLabel == predictedClassLabel ) accuracy++; cout << "TestSample: " << i << " ClassLabel: " << classLabel << " PredictedClassLabel: " << predictedClassLabel << endl; } cout << "Test Accuracy: " << accuracy/double(testData.getNumSamples())*100.0 << "%" << endl; return EXIT_SUCCESS; }
int main (int argc, const char * argv[]) { //Create a new instance of the ClassificationData ClassificationData trainingData; //Set the dimensionality of the data (you need to do this before you can add any samples) trainingData.setNumDimensions( 3 ); //You can also give the dataset a name (the name should have no spaces) trainingData.setDatasetName("DummyData"); //You can also add some info text about the data trainingData.setInfoText("This data contains some dummy data"); //Here you would grab some data from your sensor and label it with the corresponding gesture it belongs to UINT gestureLabel = 1; VectorDouble sample(3); //For now we will just add some random data Random random; for(UINT i=0; i<100; i++){ sample[0] = random.getRandomNumberUniform(-1.0,1.0); sample[1] = random.getRandomNumberUniform(-1.0,1.0); sample[2] = random.getRandomNumberUniform(-1.0,1.0); //Add the sample to the training data trainingData.addSample( gestureLabel, sample ); } //After recording your training data you can then save it to a file if( !trainingData.saveDatasetToFile( "TrainingData.txt" ) ){ cout << "ERROR: Failed to save dataset to file!\n"; return EXIT_FAILURE; } //This can then be loaded later if( !trainingData.loadDatasetFromFile( "TrainingData.txt" ) ){ cout << "ERROR: Failed to load dataset from file!\n"; return EXIT_FAILURE; } //You can also save and load the training data to a CSV file //Each row will contain a sample, with the first column containing the class label and the remaining columns containing the data if( !trainingData.saveDatasetToCSVFile( "TrainingData.csv" ) ){ cout << "ERROR: Failed to save dataset to csv file!\n"; return EXIT_FAILURE; } if( !trainingData.loadDatasetFromCSVFile( "TrainingData.csv" ) ){ cout << "ERROR: Failed to load dataset from csv file!\n"; return EXIT_FAILURE; } //This is how you can get some stats from the training data string datasetName = trainingData.getDatasetName(); string infoText = trainingData.getInfoText(); UINT numSamples = trainingData.getNumSamples(); UINT numDimensions = trainingData.getNumDimensions(); UINT numClasses = trainingData.getNumClasses(); cout << "Dataset Name: " << datasetName << endl; cout << "InfoText: " << infoText << endl; cout << "NumberOfSamples: " << numSamples << endl; cout << "NumberOfDimensions: " << numDimensions << endl; cout << "NumberOfClasses: " << numClasses << endl; //You can also get the minimum and maximum ranges of the data vector< MinMax > ranges = trainingData.getRanges(); cout << "The ranges of the dataset are: \n"; for(UINT j=0; j<ranges.size(); j++){ cout << "Dimension: " << j << " Min: " << ranges[j].minValue << " Max: " << ranges[j].maxValue << endl; } //If you want to partition the dataset into a training dataset and a test dataset then you can use the partition function //A value of 80 means that 80% of the original data will remain in the training dataset and 20% will be returned as the test dataset ClassificationData testData = trainingData.partition( 80 ); //If you have multiple datasets that you want to merge together then use the merge function if( !trainingData.merge( testData ) ){ cout << "ERROR: Failed to save merge datasets!\n"; return EXIT_FAILURE; } //If you want to run K-Fold cross validation using the dataset then you should first spilt the dataset into K-Folds //A value of 10 splits the dataset into 10 folds and the true parameter signals that stratified sampling should be used if( !trainingData.spiltDataIntoKFolds( 10, true ) ){ cout << "ERROR: Failed to spiltDataIntoKFolds!\n"; return EXIT_FAILURE; } //After you have called the spilt function you can then get the training and test sets for each fold for(UINT foldIndex=0; foldIndex<10; foldIndex++){ ClassificationData foldTrainingData = trainingData.getTrainingFoldData( foldIndex ); ClassificationData foldTestingData = trainingData.getTestFoldData( foldIndex ); } //If need you can clear any training data that you have recorded trainingData.clear(); return EXIT_SUCCESS; }
int main (int argc, const char * argv[]) { //Create a new AdaBoost instance AdaBoost adaBoost; //Set the weak classifier you want to use adaBoost.setWeakClassifier( DecisionStump() ); //Load some training data to train the classifier ClassificationData trainingData; if( !trainingData.loadDatasetFromFile("AdaBoostTrainingData.txt") ){ cout << "Failed to load training data!\n"; return EXIT_FAILURE; } //Use 20% of the training dataset to create a test dataset ClassificationData testData = trainingData.partition( 80 ); //Train the classifier if( !adaBoost.train( trainingData ) ){ cout << "Failed to train classifier!\n"; return EXIT_FAILURE; } //Save the model to a file if( !adaBoost.saveModelToFile("AdaBoostModel.txt") ){ cout << "Failed to save the classifier model!\n"; return EXIT_FAILURE; } //Load the model from a file if( !adaBoost.loadModelFromFile("AdaBoostModel.txt") ){ cout << "Failed to load the classifier model!\n"; return EXIT_FAILURE; } //Use the test dataset to test the AdaBoost model double accuracy = 0; for(UINT i=0; i<testData.getNumSamples(); i++){ //Get the i'th test sample UINT classLabel = testData[i].getClassLabel(); vector< double > inputVector = testData[i].getSample(); //Perform a prediction using the classifier if( !adaBoost.predict( inputVector ) ){ cout << "Failed to perform prediction for test sampel: " << i <<"\n"; return EXIT_FAILURE; } //Get the predicted class label UINT predictedClassLabel = adaBoost.getPredictedClassLabel(); double maximumLikelhood = adaBoost.getMaximumLikelihood(); vector< double > classLikelihoods = adaBoost.getClassLikelihoods(); vector< double > classDistances = adaBoost.getClassDistances(); //Update the accuracy if( classLabel == predictedClassLabel ) accuracy++; cout << "TestSample: " << i << " ClassLabel: " << classLabel; cout << " PredictedClassLabel: " << predictedClassLabel << " Likelihood: " << maximumLikelhood; cout << endl; } cout << "Test Accuracy: " << accuracy/double(testData.getNumSamples())*100.0 << "%" << endl; return EXIT_SUCCESS; }
int main (int argc, const char * argv[]) { //We are going to use the Iris dataset, you can find more about the orginal dataset at: http://en.wikipedia.org/wiki/Iris_flower_data_set //Create a new instance of ClassificationData to hold the training data ClassificationData trainingData; //Load the training dataset from a file, the file should be in the same directory as this program if( !trainingData.loadDatasetFromFile("IrisData.txt") ){ cout << "Failed to load Iris data from file!\n"; return EXIT_FAILURE; } //Print some basic stats about the dataset we have loaded trainingData.printStats(); //Partition the training dataset into a training dataset and test dataset //We will use 60% of the data to train the algorithm and 40% of the data to test it //The true parameter flags that we want to use stratified sampling, which means there //should be an equal class distribution between the training and test datasets ClassificationData testData = trainingData.partition( 60, true ); //Setup the gesture recognition pipeline GestureRecognitionPipeline pipeline; //Add a KNN classification algorithm as the main classifier with a K value of 10 pipeline.setClassifier( KNN(10) ); //Train the KNN algorithm using the training dataset if( !pipeline.train( trainingData ) ){ cout << "Failed to train the pipeline!\n"; return EXIT_FAILURE; } //Test the KNN model using the test dataset if( !pipeline.test( testData ) ){ cout << "Failed to test the pipeline!\n"; return EXIT_FAILURE; } //Print some metrics about how successful the classification was //Print the accuracy cout << "The classification accuracy was: " << pipeline.getTestAccuracy() << "%\n" << endl; //Print the precision for each class for(UINT k=0; k<pipeline.getNumClassesInModel(); k++){ UINT classLabel = pipeline.getClassLabels()[k]; double classPrecision = pipeline.getTestPrecision( classLabel ); cout << "The precision for class " << classLabel << " was " << classPrecision << endl; } cout << endl; //Print the recall for each class for(UINT k=0; k<pipeline.getNumClassesInModel(); k++){ UINT classLabel = pipeline.getClassLabels()[k]; double classRecall = pipeline.getTestRecall( classLabel ); cout << "The recall for class " << classLabel << " was " << classRecall << endl; } cout << endl; //Print the confusion matrix Matrix< double > confusionMatrix = pipeline.getTestConfusionMatrix(); cout << "Confusion Matrix: \n"; for(UINT i=0; i<confusionMatrix.getNumRows(); i++){ for(UINT j=0; j<confusionMatrix.getNumCols(); j++){ cout << confusionMatrix[i][j] << "\t"; } cout << endl; } cout << endl; return EXIT_SUCCESS; }