Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2971_named_intervals/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/TimeSeriesPrognosis/TimeSeriesPrognosisResults.cs @ 16628

Last change on this file since 16628 was 16628, checked in by gkronber, 5 years ago

#2971: made branch compile with current version of trunk

File size: 30.7 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Linq;
25using HeuristicLab.Common;
26using HeuristicLab.Core;
27using HeuristicLab.Data;
28using HeuristicLab.Optimization;
29using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
30using HEAL.Attic;
31
32namespace HeuristicLab.Problems.DataAnalysis {
33  [StorableType("D0D59DAD-81C2-42C4-B9B7-A8CFFB1CDD58")]
34  [Item("Prognosis Results", "Represents a collection of time series prognosis results.")]
35  public class TimeSeriesPrognosisResults : ResultCollection {
36    #region result names
37    protected const string PrognosisTrainingMeanSquaredErrorResultName = "Mean squared error (training)";
38    protected const string PrognosisTestMeanSquaredErrorResultName = "Mean squared error (test)";
39    protected const string PrognosisTrainingMeanAbsoluteErrorResultName = "Mean absolute error (training)";
40    protected const string PrognosisTestMeanAbsoluteErrorResultName = "Mean absolute error (test)";
41    protected const string PrognosisTrainingSquaredCorrelationResultName = "Pearson's R² (training)";
42    protected const string PrognosisTestSquaredCorrelationResultName = "Pearson's R² (test)";
43    protected const string PrognosisTrainingRelativeErrorResultName = "Average relative error (training)";
44    protected const string PrognosisTestRelativeErrorResultName = "Average relative error (test)";
45    protected const string PrognosisTrainingNormalizedMeanSquaredErrorResultName = "Normalized mean squared error (training)";
46    protected const string PrognosisTestNormalizedMeanSquaredErrorResultName = "Normalized mean squared error (test)";
47    protected const string PrognosisTrainingMeanErrorResultName = "Mean error (training)";
48    protected const string PrognosisTestMeanErrorResultName = "Mean error (test)";
49
50    protected const string PrognosisTrainingDirectionalSymmetryResultName = "Average directional symmetry (training)";
51    protected const string PrognosisTestDirectionalSymmetryResultName = "Average directional symmetry (test)";
52    protected const string PrognosisTrainingWeightedDirectionalSymmetryResultName = "Average weighted directional symmetry (training)";
53    protected const string PrognosisTestWeightedDirectionalSymmetryResultName = "Average weighted directional symmetry (test)";
54    protected const string PrognosisTrainingTheilsUStatisticAR1ResultName = "Theil's U2 (AR1) (training)";
55    protected const string PrognosisTestTheilsUStatisticAR1ResultName = "Theil's U2 (AR1) (test)";
56    protected const string PrognosisTrainingTheilsUStatisticMeanResultName = "Theil's U2 (mean) (training)";
57    protected const string PrognosisTestTheilsUStatisticMeanResultName = "Theil's U2 (mean) (test)";
58    #endregion
59
60    #region result descriptions
61    protected const string PrognosisTrainingMeanSquaredErrorResultDescription = "Mean of squared errors of the model on the training partition";
62    protected const string PrognosisTestMeanSquaredErrorResultDescription = "Mean of squared errors of the model on the test partition";
63    protected const string PrognosisTrainingMeanAbsoluteErrorResultDescription = "Mean of absolute errors of the model on the training partition";
64    protected const string PrognosisTestMeanAbsoluteErrorResultDescription = "Mean of absolute errors of the model on the test partition";
65    protected const string PrognosisTrainingSquaredCorrelationResultDescription = "Squared Pearson's correlation coefficient of the model output and the actual values on the training partition";
66    protected const string PrognosisTestSquaredCorrelationResultDescription = "Squared Pearson's correlation coefficient of the model output and the actual values on the test partition";
67    protected const string PrognosisTrainingRelativeErrorResultDescription = "Average of the relative errors of the model output and the actual values on the training partition";
68    protected const string PrognosisTestRelativeErrorResultDescription = "Average of the relative errors of the model output and the actual values on the test partition";
69    protected const string PrognosisTrainingNormalizedMeanSquaredErrorResultDescription = "Normalized mean of squared errors of the model on the training partition";
70    protected const string PrognosisTestNormalizedMeanSquaredErrorResultDescription = "Normalized mean of squared errors of the model on the test partition";
71    protected const string PrognosisTrainingMeanErrorResultDescription = "Mean of errors of the model on the training partition";
72    protected const string PrognosisTestMeanErrorResultDescription = "Mean of errors of the model on the test partition";
73
74    protected const string PrognosisTrainingDirectionalSymmetryResultDescription = "The average directional symmetry of the forecasts of the model on the training partition";
75    protected const string PrognosisTestDirectionalSymmetryResultDescription = "The average directional symmetry of the forecasts of the model on the test partition";
76    protected const string PrognosisTrainingWeightedDirectionalSymmetryResultDescription = "The average weighted directional symmetry of the forecasts of the model on the training partition";
77    protected const string PrognosisTestWeightedDirectionalSymmetryResultDescription = "The average weighted directional symmetry of the forecasts of the model on the test partition";
78    protected const string PrognosisTrainingTheilsUStatisticAR1ResultDescription = "The Theil's U statistic (reference: AR1 model) of the forecasts of the model on the training partition";
79    protected const string PrognosisTestTheilsUStatisticAR1ResultDescription = "The Theil's U statistic (reference: AR1 model) of the forecasts of the model on the test partition";
80    protected const string PrognosisTrainingTheilsUStatisticMeanResultDescription = "The Theil's U statistic (reference: mean model) of the forecasts of the model on the training partition";
81    protected const string PrognosisTestTheilsUStatisticMeanResultDescription = "The Theil's U statistic (reference: mean value) of the forecasts of the model on the test partition";
82    #endregion
83
84    #region result properties
85    //prognosis results for different horizons
86    public double PrognosisTrainingMeanSquaredError {
87      get {
88        if (!ContainsKey(PrognosisTrainingMeanSquaredErrorResultName)) return double.NaN;
89        return ((DoubleValue)this[PrognosisTrainingMeanSquaredErrorResultName].Value).Value;
90      }
91      private set {
92        if (!ContainsKey(PrognosisTrainingMeanSquaredErrorResultName)) Add(new Result(PrognosisTrainingMeanSquaredErrorResultName, PrognosisTrainingMeanSquaredErrorResultDescription, new DoubleValue()));
93        ((DoubleValue)this[PrognosisTrainingMeanSquaredErrorResultName].Value).Value = value;
94      }
95    }
96
97    public double PrognosisTestMeanSquaredError {
98      get {
99        if (!ContainsKey(PrognosisTestMeanSquaredErrorResultName)) return double.NaN;
100        return ((DoubleValue)this[PrognosisTestMeanSquaredErrorResultName].Value).Value;
101      }
102      private set {
103        if (!ContainsKey(PrognosisTestMeanSquaredErrorResultName)) Add(new Result(PrognosisTestMeanSquaredErrorResultName, PrognosisTestMeanSquaredErrorResultDescription, new DoubleValue()));
104        ((DoubleValue)this[PrognosisTestMeanSquaredErrorResultName].Value).Value = value;
105      }
106    }
107
108    public double PrognosisTrainingMeanAbsoluteError {
109      get {
110        if (!ContainsKey(PrognosisTrainingMeanAbsoluteErrorResultName)) return double.NaN;
111        return ((DoubleValue)this[PrognosisTrainingMeanAbsoluteErrorResultName].Value).Value;
112      }
113      private set {
114        if (!ContainsKey(PrognosisTrainingMeanAbsoluteErrorResultName)) Add(new Result(PrognosisTrainingMeanAbsoluteErrorResultName, PrognosisTrainingMeanAbsoluteErrorResultDescription, new DoubleValue()));
115        ((DoubleValue)this[PrognosisTrainingMeanAbsoluteErrorResultName].Value).Value = value;
116      }
117    }
118
119    public double PrognosisTestMeanAbsoluteError {
120      get {
121        if (!ContainsKey(PrognosisTestMeanAbsoluteErrorResultName)) return double.NaN;
122        return ((DoubleValue)this[PrognosisTestMeanAbsoluteErrorResultName].Value).Value;
123      }
124      private set {
125        if (!ContainsKey(PrognosisTestMeanAbsoluteErrorResultName)) Add(new Result(PrognosisTestMeanAbsoluteErrorResultName, PrognosisTestMeanAbsoluteErrorResultDescription, new DoubleValue()));
126        ((DoubleValue)this[PrognosisTestMeanAbsoluteErrorResultName].Value).Value = value;
127      }
128    }
129
130    public double PrognosisTrainingRSquared {
131      get {
132        if (!ContainsKey(PrognosisTrainingSquaredCorrelationResultName)) return double.NaN;
133        return ((DoubleValue)this[PrognosisTrainingSquaredCorrelationResultName].Value).Value;
134      }
135      private set {
136        if (!ContainsKey(PrognosisTrainingSquaredCorrelationResultName)) Add(new Result(PrognosisTrainingSquaredCorrelationResultName, PrognosisTrainingSquaredCorrelationResultDescription, new DoubleValue()));
137        ((DoubleValue)this[PrognosisTrainingSquaredCorrelationResultName].Value).Value = value;
138      }
139    }
140
141    public double PrognosisTestRSquared {
142      get {
143        if (!ContainsKey(PrognosisTestSquaredCorrelationResultName)) return double.NaN;
144        return ((DoubleValue)this[PrognosisTestSquaredCorrelationResultName].Value).Value;
145      }
146      private set {
147        if (!ContainsKey(PrognosisTestSquaredCorrelationResultName)) Add(new Result(PrognosisTestSquaredCorrelationResultName, PrognosisTestSquaredCorrelationResultDescription, new DoubleValue()));
148        ((DoubleValue)this[PrognosisTestSquaredCorrelationResultName].Value).Value = value;
149      }
150    }
151
152    public double PrognosisTrainingRelativeError {
153      get {
154        if (!ContainsKey(PrognosisTrainingRelativeErrorResultName)) return double.NaN;
155        return ((DoubleValue)this[PrognosisTrainingRelativeErrorResultName].Value).Value;
156      }
157      private set {
158        if (!ContainsKey(PrognosisTrainingRelativeErrorResultName)) Add(new Result(PrognosisTrainingRelativeErrorResultName, PrognosisTrainingRelativeErrorResultDescription, new DoubleValue()));
159        ((DoubleValue)this[PrognosisTrainingRelativeErrorResultName].Value).Value = value;
160      }
161    }
162
163    public double PrognosisTestRelativeError {
164      get {
165        if (!ContainsKey(PrognosisTestRelativeErrorResultName)) return double.NaN;
166        return ((DoubleValue)this[PrognosisTestRelativeErrorResultName].Value).Value;
167      }
168      private set {
169        if (!ContainsKey(PrognosisTestRelativeErrorResultName)) Add(new Result(PrognosisTestRelativeErrorResultName, PrognosisTestRelativeErrorResultDescription, new DoubleValue()));
170        ((DoubleValue)this[PrognosisTestRelativeErrorResultName].Value).Value = value;
171      }
172    }
173
174    public double PrognosisTrainingNormalizedMeanSquaredError {
175      get {
176        if (!ContainsKey(PrognosisTrainingNormalizedMeanSquaredErrorResultName)) return double.NaN;
177        return ((DoubleValue)this[PrognosisTrainingNormalizedMeanSquaredErrorResultName].Value).Value;
178      }
179      private set {
180        if (!ContainsKey(PrognosisTrainingNormalizedMeanSquaredErrorResultName)) Add(new Result(PrognosisTrainingNormalizedMeanSquaredErrorResultName, PrognosisTrainingNormalizedMeanSquaredErrorResultDescription, new DoubleValue()));
181        ((DoubleValue)this[PrognosisTrainingNormalizedMeanSquaredErrorResultName].Value).Value = value;
182      }
183    }
184
185    public double PrognosisTestNormalizedMeanSquaredError {
186      get {
187        if (!ContainsKey(PrognosisTestNormalizedMeanSquaredErrorResultName)) return double.NaN;
188        return ((DoubleValue)this[PrognosisTestNormalizedMeanSquaredErrorResultName].Value).Value;
189      }
190      private set {
191        if (!ContainsKey(PrognosisTestNormalizedMeanSquaredErrorResultName)) Add(new Result(PrognosisTestNormalizedMeanSquaredErrorResultName, PrognosisTestNormalizedMeanSquaredErrorResultDescription, new DoubleValue()));
192        ((DoubleValue)this[PrognosisTestNormalizedMeanSquaredErrorResultName].Value).Value = value;
193      }
194    }
195
196    public double PrognosisTrainingMeanError {
197      get {
198        if (!ContainsKey(PrognosisTrainingMeanErrorResultName)) return double.NaN;
199        return ((DoubleValue)this[PrognosisTrainingMeanErrorResultName].Value).Value;
200      }
201      private set {
202        if (!ContainsKey(PrognosisTrainingMeanErrorResultName)) Add(new Result(PrognosisTrainingMeanErrorResultName, PrognosisTrainingMeanErrorResultDescription, new DoubleValue()));
203        ((DoubleValue)this[PrognosisTrainingMeanErrorResultName].Value).Value = value;
204      }
205    }
206
207    public double PrognosisTestMeanError {
208      get {
209        if (!ContainsKey(PrognosisTestMeanErrorResultName)) return double.NaN;
210        return ((DoubleValue)this[PrognosisTestMeanErrorResultName].Value).Value;
211      }
212      private set {
213        if (!ContainsKey(PrognosisTestMeanErrorResultName)) Add(new Result(PrognosisTestMeanErrorResultName, PrognosisTestMeanErrorResultDescription, new DoubleValue()));
214        ((DoubleValue)this[PrognosisTestMeanErrorResultName].Value).Value = value;
215      }
216    }
217
218
219    public double PrognosisTrainingDirectionalSymmetry {
220      get {
221        if (!ContainsKey(PrognosisTrainingDirectionalSymmetryResultName)) return double.NaN;
222        return ((DoubleValue)this[PrognosisTrainingDirectionalSymmetryResultName].Value).Value;
223      }
224      private set {
225        if (!ContainsKey(PrognosisTrainingDirectionalSymmetryResultName)) Add(new Result(PrognosisTrainingDirectionalSymmetryResultName, PrognosisTrainingDirectionalSymmetryResultDescription, new DoubleValue()));
226        ((DoubleValue)this[PrognosisTrainingDirectionalSymmetryResultName].Value).Value = value;
227      }
228    }
229    public double PrognosisTestDirectionalSymmetry {
230      get {
231        if (!ContainsKey(PrognosisTestDirectionalSymmetryResultName)) return double.NaN;
232        return ((DoubleValue)this[PrognosisTestDirectionalSymmetryResultName].Value).Value;
233      }
234      private set {
235        if (!ContainsKey(PrognosisTestDirectionalSymmetryResultName)) Add(new Result(PrognosisTestDirectionalSymmetryResultName, PrognosisTestDirectionalSymmetryResultDescription, new DoubleValue()));
236        ((DoubleValue)this[PrognosisTestDirectionalSymmetryResultName].Value).Value = value;
237      }
238    }
239    public double PrognosisTrainingWeightedDirectionalSymmetry {
240      get {
241        if (!ContainsKey(PrognosisTrainingWeightedDirectionalSymmetryResultName)) return double.NaN;
242        return ((DoubleValue)this[PrognosisTrainingWeightedDirectionalSymmetryResultName].Value).Value;
243      }
244      private set {
245        if (!ContainsKey(PrognosisTrainingWeightedDirectionalSymmetryResultName)) Add(new Result(PrognosisTrainingWeightedDirectionalSymmetryResultName, PrognosisTrainingWeightedDirectionalSymmetryResultDescription, new DoubleValue()));
246        ((DoubleValue)this[PrognosisTrainingWeightedDirectionalSymmetryResultName].Value).Value = value;
247      }
248    }
249    public double PrognosisTestWeightedDirectionalSymmetry {
250      get {
251        if (!ContainsKey(PrognosisTestWeightedDirectionalSymmetryResultName)) return double.NaN;
252        return ((DoubleValue)this[PrognosisTestWeightedDirectionalSymmetryResultName].Value).Value;
253      }
254      private set {
255        if (!ContainsKey(PrognosisTestWeightedDirectionalSymmetryResultName)) Add(new Result(PrognosisTestWeightedDirectionalSymmetryResultName, PrognosisTestWeightedDirectionalSymmetryResultDescription, new DoubleValue()));
256        ((DoubleValue)this[PrognosisTestWeightedDirectionalSymmetryResultName].Value).Value = value;
257      }
258    }
259    public double PrognosisTrainingTheilsUStatisticAR1 {
260      get {
261        if (!ContainsKey(PrognosisTrainingTheilsUStatisticAR1ResultName)) return double.NaN;
262        return ((DoubleValue)this[PrognosisTrainingTheilsUStatisticAR1ResultName].Value).Value;
263      }
264      private set {
265        if (!ContainsKey(PrognosisTrainingTheilsUStatisticAR1ResultName)) Add(new Result(PrognosisTrainingTheilsUStatisticAR1ResultName, PrognosisTrainingTheilsUStatisticAR1ResultDescription, new DoubleValue()));
266        ((DoubleValue)this[PrognosisTrainingTheilsUStatisticAR1ResultName].Value).Value = value;
267      }
268    }
269    public double PrognosisTestTheilsUStatisticAR1 {
270      get {
271        if (!ContainsKey(PrognosisTestTheilsUStatisticAR1ResultName)) return double.NaN;
272        return ((DoubleValue)this[PrognosisTestTheilsUStatisticAR1ResultName].Value).Value;
273      }
274      private set {
275        if (!ContainsKey(PrognosisTestTheilsUStatisticAR1ResultName)) Add(new Result(PrognosisTestTheilsUStatisticAR1ResultName, PrognosisTestTheilsUStatisticAR1ResultDescription, new DoubleValue()));
276        ((DoubleValue)this[PrognosisTestTheilsUStatisticAR1ResultName].Value).Value = value;
277      }
278    }
279    public double PrognosisTrainingTheilsUStatisticMean {
280      get {
281        if (!ContainsKey(PrognosisTrainingTheilsUStatisticMeanResultName)) return double.NaN;
282        return ((DoubleValue)this[PrognosisTrainingTheilsUStatisticMeanResultName].Value).Value;
283      }
284      private set {
285        if (!ContainsKey(PrognosisTrainingTheilsUStatisticMeanResultName)) Add(new Result(PrognosisTrainingTheilsUStatisticMeanResultName, PrognosisTrainingTheilsUStatisticMeanResultDescription, new DoubleValue()));
286        ((DoubleValue)this[PrognosisTrainingTheilsUStatisticMeanResultName].Value).Value = value;
287      }
288    }
289    public double PrognosisTestTheilsUStatisticMean {
290      get {
291        if (!ContainsKey(PrognosisTestTheilsUStatisticMeanResultName)) return double.NaN;
292        return ((DoubleValue)this[PrognosisTestTheilsUStatisticMeanResultName].Value).Value;
293      }
294      private set {
295        if (!ContainsKey(PrognosisTestTheilsUStatisticMeanResultName)) Add(new Result(PrognosisTestTheilsUStatisticMeanResultName, PrognosisTestTheilsUStatisticMeanResultDescription, new DoubleValue()));
296        ((DoubleValue)this[PrognosisTestTheilsUStatisticMeanResultName].Value).Value = value;
297      }
298    }
299    #endregion
300
301    [Storable]
302    private int trainingHorizon;
303    public int TrainingHorizon {
304      get { return trainingHorizon; }
305      set {
306        if (trainingHorizon != value) {
307          trainingHorizon = value;
308          OnTrainingHorizonChanged();
309        }
310      }
311    }
312
313    [Storable]
314    private int testHorizon;
315    public int TestHorizon {
316      get { return testHorizon; }
317      set {
318        if (testHorizon != value) {
319          testHorizon = value;
320          OnTestHorizonChanged();
321        }
322      }
323    }
324
325    private ITimeSeriesPrognosisSolution solution;
326    [Storable]
327    public ITimeSeriesPrognosisSolution Solution {
328      get { return solution; }
329      private set { solution = value; } //necessary for persistence
330    }
331
332    [StorableConstructor]
333    public TimeSeriesPrognosisResults(StorableConstructorFlag _) : base(_) { }
334    protected TimeSeriesPrognosisResults(TimeSeriesPrognosisResults original, Cloner cloner)
335      : base(original, cloner) {
336      this.trainingHorizon = original.trainingHorizon;
337      this.testHorizon = original.testHorizon;
338      this.solution = cloner.Clone(original.solution);
339    }
340    public override IDeepCloneable Clone(Cloner cloner) {
341      return new TimeSeriesPrognosisResults(this, cloner);
342    }
343
344    public TimeSeriesPrognosisResults(int trainingHorizon, int testHorizon, ITimeSeriesPrognosisSolution solution)
345      : base() {
346      this.trainingHorizon = trainingHorizon;
347      this.testHorizon = testHorizon;
348      this.solution = solution;
349      CalculateTrainingPrognosisResults();
350      CalculateTestPrognosisResults();
351    }
352
353    #region events
354    public event EventHandler TrainingHorizonChanged;
355    protected virtual void OnTrainingHorizonChanged() {
356      CalculateTrainingPrognosisResults();
357      var handler = TrainingHorizonChanged;
358      if (handler != null) handler(this, EventArgs.Empty);
359    }
360
361    public event EventHandler TestHorizonChanged;
362    protected virtual void OnTestHorizonChanged() {
363      CalculateTestPrognosisResults();
364      var handler = TestHorizonChanged;
365      if (handler != null) handler(this, EventArgs.Empty);
366    }
367    #endregion
368
369    private void CalculateTrainingPrognosisResults() {
370      OnlineCalculatorError errorState;
371      var problemData = Solution.ProblemData;
372      if (!problemData.TrainingIndices.Any()) return;
373      var model = Solution.Model;
374      //mean model
375      double trainingMean = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, problemData.TrainingIndices).Average();
376      var meanModel = new ConstantModel(trainingMean, problemData.TargetVariable);
377
378      //AR1 model
379      double alpha, beta;
380      IEnumerable<double> trainingStartValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, problemData.TrainingIndices.Select(r => r - 1).Where(r => r > 0)).ToList();
381      OnlineLinearScalingParameterCalculator.Calculate(problemData.Dataset.GetDoubleValues(problemData.TargetVariable, problemData.TrainingIndices.Where(x => x > 0)), trainingStartValues, out alpha, out beta, out errorState);
382      var AR1model = new TimeSeriesPrognosisAutoRegressiveModel(problemData.TargetVariable, new double[] { beta }, alpha);
383
384      var trainingHorizions = problemData.TrainingIndices.Select(r => Math.Min(trainingHorizon, problemData.TrainingPartition.End - r)).ToList();
385      IEnumerable<IEnumerable<double>> trainingTargetValues = problemData.TrainingIndices.Zip(trainingHorizions, Enumerable.Range).Select(r => problemData.Dataset.GetDoubleValues(problemData.TargetVariable, r)).ToList();
386      IEnumerable<IEnumerable<double>> trainingEstimatedValues = model.GetPrognosedValues(problemData.Dataset, problemData.TrainingIndices, trainingHorizions).ToList();
387      IEnumerable<IEnumerable<double>> trainingMeanModelPredictions = meanModel.GetPrognosedValues(problemData.Dataset, problemData.TrainingIndices, trainingHorizions).ToList();
388      IEnumerable<IEnumerable<double>> trainingAR1ModelPredictions = AR1model.GetPrognosedValues(problemData.Dataset, problemData.TrainingIndices, trainingHorizions).ToList();
389
390      IEnumerable<double> originalTrainingValues = trainingTargetValues.SelectMany(x => x).ToList();
391      IEnumerable<double> estimatedTrainingValues = trainingEstimatedValues.SelectMany(x => x).ToList();
392
393      double trainingMSE = OnlineMeanSquaredErrorCalculator.Calculate(originalTrainingValues, estimatedTrainingValues, out errorState);
394      PrognosisTrainingMeanSquaredError = errorState == OnlineCalculatorError.None ? trainingMSE : double.NaN;
395      double trainingMAE = OnlineMeanAbsoluteErrorCalculator.Calculate(originalTrainingValues, estimatedTrainingValues, out errorState);
396      PrognosisTrainingMeanAbsoluteError = errorState == OnlineCalculatorError.None ? trainingMAE : double.NaN;
397      double trainingR = OnlinePearsonsRCalculator.Calculate(originalTrainingValues, estimatedTrainingValues, out errorState);
398      PrognosisTrainingRSquared = errorState == OnlineCalculatorError.None ? trainingR * trainingR : double.NaN;
399      double trainingRelError = OnlineMeanAbsolutePercentageErrorCalculator.Calculate(originalTrainingValues, estimatedTrainingValues, out errorState);
400      PrognosisTrainingRelativeError = errorState == OnlineCalculatorError.None ? trainingRelError : double.NaN;
401      double trainingNMSE = OnlineNormalizedMeanSquaredErrorCalculator.Calculate(originalTrainingValues, estimatedTrainingValues, out errorState);
402      PrognosisTrainingNormalizedMeanSquaredError = errorState == OnlineCalculatorError.None ? trainingNMSE : double.NaN;
403      double trainingME = OnlineMeanErrorCalculator.Calculate(originalTrainingValues, estimatedTrainingValues, out errorState);
404      PrognosisTrainingMeanError = errorState == OnlineCalculatorError.None ? trainingME : double.NaN;
405
406      PrognosisTrainingDirectionalSymmetry = OnlineDirectionalSymmetryCalculator.Calculate(trainingStartValues, trainingTargetValues, trainingEstimatedValues, out errorState);
407      PrognosisTrainingDirectionalSymmetry = errorState == OnlineCalculatorError.None ? PrognosisTrainingDirectionalSymmetry : 0.0;
408      PrognosisTrainingWeightedDirectionalSymmetry = OnlineWeightedDirectionalSymmetryCalculator.Calculate(trainingStartValues, trainingTargetValues, trainingEstimatedValues, out errorState);
409      PrognosisTrainingWeightedDirectionalSymmetry = errorState == OnlineCalculatorError.None ? PrognosisTrainingWeightedDirectionalSymmetry : 0.0;
410      PrognosisTrainingTheilsUStatisticAR1 = OnlineTheilsUStatisticCalculator.Calculate(trainingStartValues, trainingTargetValues, trainingAR1ModelPredictions, trainingEstimatedValues, out errorState);
411      PrognosisTrainingTheilsUStatisticAR1 = errorState == OnlineCalculatorError.None ? PrognosisTrainingTheilsUStatisticAR1 : double.PositiveInfinity;
412      PrognosisTrainingTheilsUStatisticMean = OnlineTheilsUStatisticCalculator.Calculate(trainingStartValues, trainingTargetValues, trainingMeanModelPredictions, trainingEstimatedValues, out errorState);
413      PrognosisTrainingTheilsUStatisticMean = errorState == OnlineCalculatorError.None ? PrognosisTrainingTheilsUStatisticMean : double.PositiveInfinity;
414    }
415
416    private void CalculateTestPrognosisResults() {
417      OnlineCalculatorError errorState;
418      var problemData = Solution.ProblemData;
419      if (!problemData.TestIndices.Any()) return;
420      var model = Solution.Model;
421      var testHorizions = problemData.TestIndices.Select(r => Math.Min(testHorizon, problemData.TestPartition.End - r)).ToList();
422      IEnumerable<IEnumerable<double>> testTargetValues = problemData.TestIndices.Zip(testHorizions, Enumerable.Range).Select(r => problemData.Dataset.GetDoubleValues(problemData.TargetVariable, r)).ToList();
423      IEnumerable<IEnumerable<double>> testEstimatedValues = model.GetPrognosedValues(problemData.Dataset, problemData.TestIndices, testHorizions).ToList();
424      IEnumerable<double> testStartValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, problemData.TestIndices.Select(r => r - 1).Where(r => r > 0)).ToList();
425
426      IEnumerable<double> originalTestValues = testTargetValues.SelectMany(x => x).ToList();
427      IEnumerable<double> estimatedTestValues = testEstimatedValues.SelectMany(x => x).ToList();
428
429      double testMSE = OnlineMeanSquaredErrorCalculator.Calculate(originalTestValues, estimatedTestValues, out errorState);
430      PrognosisTestMeanSquaredError = errorState == OnlineCalculatorError.None ? testMSE : double.NaN;
431      double testMAE = OnlineMeanAbsoluteErrorCalculator.Calculate(originalTestValues, estimatedTestValues, out errorState);
432      PrognosisTestMeanAbsoluteError = errorState == OnlineCalculatorError.None ? testMAE : double.NaN;
433      double testR = OnlinePearsonsRCalculator.Calculate(originalTestValues, estimatedTestValues, out errorState);
434      PrognosisTestRSquared = errorState == OnlineCalculatorError.None ? testR * testR : double.NaN;
435      double testRelError = OnlineMeanAbsolutePercentageErrorCalculator.Calculate(originalTestValues, estimatedTestValues, out errorState);
436      PrognosisTestRelativeError = errorState == OnlineCalculatorError.None ? testRelError : double.NaN;
437      double testNMSE = OnlineNormalizedMeanSquaredErrorCalculator.Calculate(originalTestValues, estimatedTestValues, out errorState);
438      PrognosisTestNormalizedMeanSquaredError = errorState == OnlineCalculatorError.None ? testNMSE : double.NaN;
439      double testME = OnlineMeanErrorCalculator.Calculate(originalTestValues, estimatedTestValues, out errorState);
440      PrognosisTestMeanError = errorState == OnlineCalculatorError.None ? testME : double.NaN;
441
442      PrognosisTestDirectionalSymmetry = OnlineDirectionalSymmetryCalculator.Calculate(testStartValues, testTargetValues, testEstimatedValues, out errorState);
443      PrognosisTestDirectionalSymmetry = errorState == OnlineCalculatorError.None ? PrognosisTestDirectionalSymmetry : 0.0;
444      PrognosisTestWeightedDirectionalSymmetry = OnlineWeightedDirectionalSymmetryCalculator.Calculate(testStartValues, testTargetValues, testEstimatedValues, out errorState);
445      PrognosisTestWeightedDirectionalSymmetry = errorState == OnlineCalculatorError.None ? PrognosisTestWeightedDirectionalSymmetry : 0.0;
446
447
448      if (problemData.TrainingIndices.Any()) {
449        //mean model
450        double trainingMean = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, problemData.TrainingIndices).Average();
451        var meanModel = new ConstantModel(trainingMean, problemData.TargetVariable);
452
453        //AR1 model
454        double alpha, beta;
455        IEnumerable<double> trainingStartValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, problemData.TrainingIndices.Select(r => r - 1).Where(r => r > 0)).ToList();
456        OnlineLinearScalingParameterCalculator.Calculate(problemData.Dataset.GetDoubleValues(problemData.TargetVariable, problemData.TrainingIndices.Where(x => x > 0)), trainingStartValues, out alpha, out beta, out errorState);
457        var AR1model = new TimeSeriesPrognosisAutoRegressiveModel(problemData.TargetVariable, new double[] { beta }, alpha);
458
459        IEnumerable<IEnumerable<double>> testMeanModelPredictions = meanModel.GetPrognosedValues(problemData.Dataset, problemData.TestIndices, testHorizions).ToList();
460        IEnumerable<IEnumerable<double>> testAR1ModelPredictions = AR1model.GetPrognosedValues(problemData.Dataset, problemData.TestIndices, testHorizions).ToList();
461
462        PrognosisTestTheilsUStatisticAR1 = OnlineTheilsUStatisticCalculator.Calculate(testStartValues, testTargetValues, testAR1ModelPredictions, testEstimatedValues, out errorState);
463        PrognosisTestTheilsUStatisticAR1 = errorState == OnlineCalculatorError.None ? PrognosisTestTheilsUStatisticAR1 : double.PositiveInfinity;
464        PrognosisTestTheilsUStatisticMean = OnlineTheilsUStatisticCalculator.Calculate(testStartValues, testTargetValues, testMeanModelPredictions, testEstimatedValues, out errorState);
465        PrognosisTestTheilsUStatisticMean = errorState == OnlineCalculatorError.None ? PrognosisTestTheilsUStatisticMean : double.PositiveInfinity;
466      }
467    }
468  }
469}
Note: See TracBrowser for help on using the repository browser.