public void TestPredictionWindowSize() { using (StreamWriter sw = new StreamWriter(@"E:\repos\RBFNetwork\windowSize.txt")) { for (int i = 10; i <= 10; i++) { var data = GetTemperatureDataAsync(95, i).Result; int accuracy = 0; var topology = new Topology(data.trainData.ClassesNames?.Count ?? 1, 0.01, data.trainData.ColumnCount); var network = new RBFNeuralNetwork(topology); double error = network.Train(data.trainData, 100, false); double predictError = 0; foreach (Record record in data.testData.Records) { var expected = record.Expected[0]; var output = network.Predict(record.InputData)[0]; var diff = expected - output; predictError += diff * diff; if ((expected * data.inputsSum - output * data.inputsSum) <= 2) { accuracy++; } } predictError = Math.Sqrt(predictError / (data.testData.RowCount - 1)); Trace.WriteLine($"Current accuracy: {accuracy} of {data.testData.Records.Count} = {accuracy * 100 / data.testData.Records.Count}%"); var predicted = accuracy * 100 / data.testData.RowCount; sw.WriteLine($"{i} {predictError} {predicted}"); } } }
// Прогнозирование public List <DataPoint> Predict() { List <DataPoint> result = new List <DataPoint>(); int k = 1; // Для нормализации double inputsSum = testDataset.Records.Sum(r => r.InputData.Sum(x => x * x) + r.Expected.Sum(x => x * x)); inputsSum = Math.Sqrt(inputsSum); // Нормализация testDataset.Normalize(); foreach (Record record in testDataset.Records) { var expected = record.Expected[0]; var output = neuralNetwork.Predict(record.InputData)[0]; // Разница между ожидаемым и выходным var diff = expected - output; // Набор точек на графике // к - точка на графике var dp = new DataPoint(expected * inputsSum, output * inputsSum, diff * diff, k); result.Add(dp); k++; } return(result); }