// bpnn Training public void training(int epoch, string path, int Znode, int Ynode, double learningRate, double numberOfClasses) { Console.WriteLine("Training Result :"); bpnn bp = new bpnn(); bp.num = 1; bp.inputNode = 0; bp.totalData = 0; //read data from txt file using (StreamReader myReader = new StreamReader(path)) { string line = " "; string l = ""; while (line != null) { line = myReader.ReadLine(); if (line != null) { l = line; //Split data by comma String[] value = l.Split(null); //to get the number of input node bp.inputNode = value.Length; //to get the number of total iteration/ line of data(150 data) bp.totalData = bp.totalData + 1; } } myReader.Close(); } //Read Input data bp.Inode = bp.inputNode - 1; bp.data = new double[bp.totalData, bp.Inode]; bp.target = new double[bp.totalData]; using (StreamReader myReader = new StreamReader(path)) { string l = ""; int a = 0; string line = myReader.ReadLine(); while (line != null) { l = line; //Split data by space String[] value = l.Split(null); for (int i = 0; i < bp.inputNode; i++) { if (i == bp.inputNode - 1) { bp.target[a] = Convert.ToDouble(value[i]); } else { bp.data[a, i] = Convert.ToDouble(value[i]); // Console.WriteLine(bp.data[a, i]); } } a++; line = myReader.ReadLine(); } myReader.Close(); } bp.Vweight = new double[bp.Inode, Znode]; bp.Wweight = new double[Znode, Ynode]; //Step 0 Initilize random weight initializeWeight(bp.Inode, bp.Wweight, bp.Vweight, bp.inputNode, Znode, Ynode); bp.x = new double[bp.Inode]; bp.deltaKError = new double[Ynode]; bp.Z_in = new double[Znode]; bp.Z = new double[Znode]; bp.Y_in = new double[Ynode]; bp.Y = new double[Ynode]; bp.weightChangeV = new double[bp.Inode, Znode]; bp.weightChangeW = new double[Znode, Ynode]; bp.sum2 = 0.0; double benchmark = (1.0 / numberOfClasses) / 2.0; int[,] confusionMatrix = new int[(int)numberOfClasses, (int)numberOfClasses]; while (bp.num <= epoch) { correctnessIrisSetosa = 0; correctnessIrisVersicolour = 0; correctnessIrisVirginica = 0; incorrectnessIrisSetosa = 0; incorrectnessIrisVersicolour = 0; incorrectnessIrisVirginica = 0; for (int p = 0; p < bp.totalData; p++) { for (int i = 0; i < bp.Inode; i++) { bp.x[i] = bp.data[p, i]; } feedForward(bp.Inode, Znode, Ynode, bp.x, bp.Vweight, bp.Wweight, bp.Z_in, bp.Z, bp.Y_in, bp.Y, bp.target, p, numberOfClasses, benchmark, confusionMatrix); bp.sum2 = bp.sum2 + backpropagationOfError(bp.Inode, Znode, Ynode, bp.deltaKError, bp.Vweight, bp.Wweight, bp.Y, bp.target, p, learningRate, bp.Z, bp.weightChangeW, bp.weightChangeV, bp.x); updateWeight(bp.weightChangeV, bp.weightChangeW, bp.Vweight, bp.Wweight, bp.Inode, Znode, Ynode); } /* if (bp.meanSquareError < 0.1) * { * break; * }*/ bp.num++; } File.Create("C:/Users/Firdaus Samad/Documents/Visual Studio 2015/Projects/backpropagation2/backpropagation2/WeightV.txt").Close(); File.Create("C:/Users/Firdaus Samad/Documents/Visual Studio 2015/Projects/backpropagation2/backpropagation2/WeightW.txt").Close(); WriteTextWeight(bp.Vweight, bp.Inode, Znode, "C:/Users/Firdaus Samad/Documents/Visual Studio 2015/Projects/backpropagation2/backpropagation2/WeightV.txt"); WriteTextWeight(bp.Wweight, Znode, Ynode, "C:/Users/Firdaus Samad/Documents/Visual Studio 2015/Projects/backpropagation2/backpropagation2/WeightW.txt"); Console.WriteLine("==============================================="); Console.WriteLine("Confusion Matrix"); Console.WriteLine("==============================================="); Console.WriteLine("a\tb\tc"); for (int i = 0; i < ((int)numberOfClasses); i++) { for (int y = 0; y < numberOfClasses; y++) { Console.Write(confusionMatrix[i, y] + "\t"); } switch (i) { case 0: Console.WriteLine("a - Iris-Setosa"); break; case 1: Console.WriteLine("b - Iris Versicolour"); break; case 2: Console.WriteLine("c - Iris-Virginica"); break; } } Console.WriteLine(); Console.WriteLine("==============================================="); //for() double correctness = correctnessIrisVirginica + correctnessIrisVersicolour + correctnessIrisSetosa; double CorrectnessPercent = (correctness / bp.totalData) * 100; double NotCorrectnessPercent = 100 - CorrectnessPercent; Console.WriteLine("Correctly Classified Instances\t\t:" + (int)correctness + "\t" + CorrectnessPercent + "%"); Console.WriteLine("Incorrectly Classified Instances\t:" + (bp.totalData - (int)correctness) + "\t" + NotCorrectnessPercent + "%"); // calAccuracy(numberOfClasses, bp.Y, Ynode, bp.target, bp.totalData); bp.meanSquareError = bp.sum2 / epoch; Console.WriteLine("MSE :" + bp.meanSquareError); }
//Testing public void testing(string path, int Znode, int Ynode, double learningRate, double numberOfClasses) { Console.WriteLine("\n\nTesting Result :"); bpnn bp = new bpnn(); bp.num = 1; bp.inputNode = 0; bp.totalData = 0; //read data from txt file using (StreamReader myReader = new StreamReader(path)) { string line = " "; string l = ""; while (line != null) { line = myReader.ReadLine(); if (line != null) { l = line; //Split data by comma String[] value = l.Split(null); //to get the number of input node bp.inputNode = value.Length; //to get the number of total iteration/ line of data(150 data) bp.totalData = bp.totalData + 1; } } myReader.Close(); } //Read Input data bp.Inode = bp.inputNode - 1; bp.data = new double[bp.totalData, bp.Inode]; bp.target = new double[bp.totalData]; using (StreamReader myReader = new StreamReader(path)) { string l = ""; int a = 0; string line = myReader.ReadLine(); while (line != null) { l = line; //Split data by space String[] value = l.Split(null); for (int i = 0; i < bp.inputNode; i++) { if (i == bp.inputNode - 1) { bp.target[a] = Convert.ToDouble(value[i]); } else { bp.data[a, i] = Convert.ToDouble(value[i]); } } a++; line = myReader.ReadLine(); } myReader.Close(); } bp.Vweight = new double[bp.Inode, Znode]; bp.Wweight = new double[Znode, Ynode]; bp.x = new double[bp.Inode]; bp.deltaKError = new double[Ynode]; bp.Z_in = new double[Znode]; bp.Z = new double[Znode]; bp.Y_in = new double[Ynode]; bp.Y = new double[Ynode]; bp.weightChangeV = new double[bp.Inode, Znode]; bp.weightChangeW = new double[Znode, Ynode]; bp.sum2 = 0.0; double benchmark = (1.0 / numberOfClasses) / 2.0; int[,] confusionMatrix = new int[(int)numberOfClasses, (int)numberOfClasses]; readWeight(Znode, bp.Inode, Ynode, bp.Wweight, bp.Vweight); correctnessIrisSetosa = 0; correctnessIrisVersicolour = 0; correctnessIrisVirginica = 0; incorrectnessIrisSetosa = 0; incorrectnessIrisVersicolour = 0; incorrectnessIrisVirginica = 0; for (int p = 0; p < bp.totalData; p++) { for (int i = 0; i < bp.Inode; i++) { bp.x[i] = bp.data[p, i]; } feedForward(bp.Inode, Znode, Ynode, bp.x, bp.Vweight, bp.Wweight, bp.Z_in, bp.Z, bp.Y_in, bp.Y, bp.target, p, numberOfClasses, benchmark, confusionMatrix); } /* if (bp.meanSquareError < 0.1) * { * break; * }*/ bp.num++; Console.WriteLine("==============================================="); Console.WriteLine("Confusion Matrix"); Console.WriteLine("==============================================="); Console.WriteLine("a\tb\tc"); for (int i = 0; i < ((int)numberOfClasses); i++) { for (int y = 0; y < numberOfClasses; y++) { Console.Write(confusionMatrix[i, y] + "\t"); } switch (i) { case 0: Console.WriteLine("a - Iris-Setosa"); break; case 1: Console.WriteLine("b - Iris Versicolour"); break; case 2: Console.WriteLine("c - Iris-Virginica"); break; } } Console.WriteLine(); Console.WriteLine("==============================================="); //for() double correctness = correctnessIrisVirginica + correctnessIrisVersicolour + correctnessIrisSetosa; double CorrectnessPercent = (correctness / bp.totalData) * 100; double NotCorrectnessPercent = 100 - CorrectnessPercent; Console.WriteLine("Correctly Classified Instances\t\t:" + (int)correctness + "\t" + CorrectnessPercent + "%"); Console.WriteLine("Incorrectly Classified Instances\t:" + (bp.totalData - (int)correctness) + "\t" + NotCorrectnessPercent + "%"); }