#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "TImage.h" #include "TCanvas.h" #include "TArrayD.h" #include "TROOT.h" #include "TColor.h" #include "TAttImage.h" #include "TEnv.h" #include "TVirtualFFT.h" #include "TRandom.h" #include "TTree.h" #include #include "TMultiLayerPerceptron.h" #include "TMLPAnalyzer.h" #include "TAxis" #include #include #include #include #include #include #include "FinalNeuralNet.h" using namespace std; const double PI = 3.141592653589793238463; float RandMax = 32767; int FirstNN(Int_t ntrain = 500) { //srand(time(0)); // to get different values each time srand(time(0)); int const size = 10000; TTree *simu = new TTree("simulation", "simulated data"); float pX, pY; float type; // define our tree simu->Branch("pX", &pX, "pX/F"); simu->Branch("pY", &pY, "pY/F"); simu->Branch("type", &type, "type/F"); //yellow type = 0; for (int i = 0; i < size; i++) { long double rayon = ((rand()) / RandMax) * 5; //random radius < 10 long double angulaire = ((rand() )/ RandMax) * 2 * PI; //fmod function for modulo instead of % because float //it gives a random anle in radians between 0 and 2*PI //both x and y coordinate oscillate in a circle of center (0,0) and radius 10 double Bx_coordinate = cos(angulaire)*rayon-17; double By_coordinate = sin(angulaire)*rayon+10; pX = Bx_coordinate; pY = By_coordinate; simu->Fill(); } //Cyan type = 1; for (int i = 0; i < size; i++) { long double rayon = ((rand()) / RandMax) * 5; //random radius < 10 long double angulaire = ((rand()) / RandMax) * 2 * PI; //fmod function for modulo instead of % because float //it gives a random anle in radians between 0 and 2*PI double Rx_coordinate = cos(angulaire)*rayon - 9; //between 8 and 28 centered at 18 double Ry_coordinate = sin(angulaire)*rayon + 4; //between 10 and -10, same radius as Blue Array pX = Rx_coordinate; pY = Ry_coordinate; simu->Fill(); } //green type = 2; for (int i = 0; i < size; i++) { long double rayon = ((rand()) / RandMax) * 5; //random radius < 10 long double angulaire = ((rand()) / RandMax) * 2 * PI; //fmod function for modulo instead of % because float //it gives a random anle in radians between 0 and 2*PI //both x and y coordinate oscillate in a circle of center (0,0) and radius 10 pX = cos(angulaire)*rayon; pY = sin(angulaire)*rayon; simu->Fill(); } //blue type = 3; for (int i = 0; i < size; i++) { long double rayon = ((rand()) / RandMax) * 5; //random radius < 10 long double angulaire = ((rand()) / RandMax) * 2 * PI; //fmod function for modulo instead of % because float //it gives a random anle in radians between 0 and 2*PI double Rx_coordinate = cos(angulaire)*rayon +9; //between 8 and 28 centered at 18 double Ry_coordinate = sin(angulaire)*rayon +4; //between 10 and -10, same radius as Blue Array pX = Rx_coordinate; pY = Ry_coordinate; simu->Fill(); } //red type = 4; for (int i = 0; i < size; i++) { long double rayon = ((rand()) / RandMax) * 5; //random radius < 10 long double angulaire = ((rand()) / RandMax) * 2 * PI; //fmod function for modulo instead of % because float //it gives a random anle in radians between 0 and 2*PI double Rx_coordinate = cos(angulaire)*rayon+17; //between 8 and 28 centered at 18 double Ry_coordinate = sin(angulaire)*rayon +10; //between 10 and -10, same radius as Blue Array pX = Rx_coordinate; pY = Ry_coordinate; simu->Fill(); } simu->Print(); if (!gROOT->GetClass("TMultiLayerPerceptron")) { gSystem->Load("libMLP"); } //TMultiLayerPerceptron::SetLearningMethod(kStochastic); TMultiLayerPerceptron *mlp = new TMultiLayerPerceptron("pX,pY:5:5:type", simu, "Entry$%2", "(Entry$+1)%2"); mlp->Train(20, "text,graph,update=5"); //Use TMLPAnalyzer to see what it looks for TCanvas* mlpa_canvas = new TCanvas("mlpa_canvas", "Network analysis"); mlpa_canvas->Divide(2, 3); TMLPAnalyzer ana(mlp); // Initialisation ana.GatherInformations(); // output to the console ana.CheckNetwork(); mlpa_canvas->cd(1); // shows how each variable influences the network ana.DrawDInputs(); mlpa_canvas->cd(2); // shows the network structure mlp->Draw(); mlpa_canvas->cd(3); //draws the resulting network /*ana.DrawNetwork(0, "type==0", "type==-1"); mlpa_canvas->cd(4); ana.DrawNetwork(0, "type==2", "type==4"); mlpa_canvas->cd(5); ana.DrawNetwork(0, "type==0", "type==4"); mlpa_canvas->cd(6); */ mlp->Export("FinalNeuralNet", "C++"); FinalNeuralNet *f = new FinalNeuralNet; //Declare FinalNeuralNet cout << "\n\n\n"; cout << "X COORDINATE \t\t" << "Y COORDINDATE \t\t" << "GROUND TRUTH" << " \t\t" << "NEURALNET OUTPUT \t\t" << "INTERPRETATION " << "\n"; cout << "-------------------------------------------------------------------------------------------------------------\n\n"; int index = 0; // check if outside circle or not float score = 0; float NumOfIt = 0; for (double X= -23; X <= 23; X = X + 0.01) { int y = rand() % 20; // generate random value between 0 and 20 int j = rand() % 2; //generate random index between 0 and 1 int Y = y ^ (-j); // generate random Y coordinate between -10 and 10 double b = f->Value(0, X, Y); //Call function from class if (b < 0) b = b*-1; string GT; int indice1, indice2; // to compare strings if ((X < -12) && (X < -22) && (Y < 15) && (Y > 5)) { GT = "Yellow"; index = 1; indice1 = 0; } else if ((X < -4) && (X > -14) && (Y < 9) && (Y > -1)) { GT = "Cyan"; index = 1; indice1 = 1; } else if ((X > -5) && (X < -5) && (Y < 5) && (Y > -5)) { GT = "Green"; index = 1; indice1 = 2; } else if ((X > 4) && (X < 14) && (Y < 9) && (Y > -1)) { GT = "Blue"; index = 1; indice1 = 3; } else if ((X > 12) && (X < 22) && (Y < 15) && (Y > 5)) { GT = "Red"; index = 1; indice1 = 4; } else { GT = "Outside"; index = 0; } string Guess; if (b < 0.2) { Guess = "Yellow"; indice2 = 0; } else if ((b > 0.8) && (b < 1.2)) { Guess = "Cyan"; indice2 = 1; } else if ((b > 1.8) && (b < 2.2)) { Guess = "Green"; indice2 = 2; } else if ((b > 2.8) && (b < 3.2)) { Guess = "Blue"; indice2 = 3; } else if ((b > 3.8) && (b < 4.2)) { Guess = "Red"; indice2 = 4; } else Guess = "Cannot tell"; if (Guess.compare(GT) == 0) // check if guess and ground truth are the same ++score; if (index == 1) { cout << std::setprecision(3) << i << "\t\t\t" << std::setprecision(3) << Y << "\t\t\t" << GT << "\t\t\t" << std::setprecision(3) << b << "\t\t\t" << Guess << "\n"; ++NumOfIt; } } float percentage = (score / NumOfIt) * 100; cout << "Here is your percentage of success: " << percentage << "\n\n"; }