Changeset 8487 for branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Views/3.4/TimeSeriesPrognosis/TimeSeriesPrognosisSolutionErrorCharacteristicsCurveView.cs
- Timestamp:
- 08/14/12 14:31:44 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Views/3.4/TimeSeriesPrognosis/TimeSeriesPrognosisSolutionErrorCharacteristicsCurveView.cs
r7099 r8487 20 20 #endregion 21 21 22 using System;23 22 using System.Collections.Generic; 24 23 using System.Linq; 25 24 using System.Windows.Forms; 26 using System.Windows.Forms.DataVisualization.Charting;27 25 using HeuristicLab.MainForm; 28 26 using HeuristicLab.MainForm.WindowsForms; … … 30 28 [View("Error Characteristics Curve")] 31 29 [Content(typeof(ITimeSeriesPrognosisSolution))] 32 public partial class TimeSeriesPrognosisSolutionErrorCharacteristicsCurveView : DataAnalysisSolutionEvaluationView { 33 protected const string TrainingSamples = "Training"; 34 protected const string TestSamples = "Test"; 35 protected const string AllSamples = "All Samples"; 30 public partial class TimeSeriesPrognosisSolutionErrorCharacteristicsCurveView : RegressionSolutionErrorCharacteristicsCurveView { 31 36 32 37 33 public TimeSeriesPrognosisSolutionErrorCharacteristicsCurveView() 38 34 : base() { 39 35 InitializeComponent(); 40 41 cmbSamples.Items.Add(TrainingSamples);42 cmbSamples.Items.Add(TestSamples);43 cmbSamples.Items.Add(AllSamples);44 45 cmbSamples.SelectedIndex = 0;46 47 chart.CustomizeAllChartAreas();48 chart.ChartAreas[0].AxisX.Title = "Absolute Error";49 chart.ChartAreas[0].AxisX.Minimum = 0.0;50 chart.ChartAreas[0].AxisX.Maximum = 1.0;51 chart.ChartAreas[0].AxisX.IntervalAutoMode = IntervalAutoMode.VariableCount;52 chart.ChartAreas[0].CursorX.Interval = 0.01;53 54 chart.ChartAreas[0].AxisY.Title = "Number of Samples";55 chart.ChartAreas[0].AxisY.Minimum = 0.0;56 chart.ChartAreas[0].AxisY.Maximum = 1.0;57 chart.ChartAreas[0].AxisY.MajorGrid.Interval = 0.2;58 chart.ChartAreas[0].CursorY.Interval = 0.01;59 36 } 60 37 … … 63 40 set { base.Content = value; } 64 41 } 65 public ITimeSeriesPrognosisProblemData ProblemData {42 public new ITimeSeriesPrognosisProblemData ProblemData { 66 43 get { 67 44 if (Content == null) return null; … … 70 47 } 71 48 72 protected override void RegisterContentEvents() { 73 base.RegisterContentEvents(); 74 Content.ModelChanged += new EventHandler(Content_ModelChanged); 75 Content.ProblemDataChanged += new EventHandler(Content_ProblemDataChanged); 76 } 77 protected override void DeregisterContentEvents() { 78 base.DeregisterContentEvents(); 79 Content.ModelChanged -= new EventHandler(Content_ModelChanged); 80 Content.ProblemDataChanged -= new EventHandler(Content_ProblemDataChanged); 81 } 49 protected override void UpdateChart() { 50 base.UpdateChart(); 51 if (Content == null) return; 52 var movingAverageModel = new TimeSeriesPrognosisMovingAverageModel(10, Content.ProblemData.TargetVariable).CreateTimeSeriesPrognosisSolution(ProblemData); 53 movingAverageModel.Name = "Moving average Model"; 54 AddRegressionSolution(movingAverageModel); 82 55 83 protected virtual void Content_ModelChanged(object sender, EventArgs e) { 84 if (InvokeRequired) Invoke((Action<object, EventArgs>)Content_ModelChanged, sender, e); 85 else UpdateChart(); 86 } 87 protected virtual void Content_ProblemDataChanged(object sender, EventArgs e) { 88 if (InvokeRequired) Invoke((Action<object, EventArgs>)Content_ProblemDataChanged, sender, e); 89 else { 90 UpdateChart(); 91 } 92 } 93 protected override void OnContentChanged() { 94 base.OnContentChanged(); 95 UpdateChart(); 96 } 97 98 protected virtual void UpdateChart() { 99 chart.Series.Clear(); 100 chart.Annotations.Clear(); 101 if (Content == null) return; 102 103 var originalValues = GetOriginalValues(); 104 var meanModelEstimatedValues = GetMeanModelEstimatedValues(originalValues); 105 var meanModelResiduals = GetResiduals(originalValues, meanModelEstimatedValues); 106 107 meanModelResiduals.Sort(); 108 chart.ChartAreas[0].AxisX.Maximum = Math.Ceiling(meanModelResiduals.Last()); 109 chart.ChartAreas[0].CursorX.Interval = meanModelResiduals.First() / 100; 110 111 Series meanModelSeries = new Series("Mean Model"); 112 meanModelSeries.ChartType = SeriesChartType.FastLine; 113 UpdateSeries(meanModelResiduals, meanModelSeries); 114 meanModelSeries.ToolTip = "Area over Curve: " + CalculateAreaOverCurve(meanModelSeries); 115 chart.Series.Add(meanModelSeries); 116 117 AddTimeSeriesPrognosisSolution(Content); 118 } 119 120 protected void AddTimeSeriesPrognosisSolution(ITimeSeriesPrognosisSolution solution) { 121 if (chart.Series.Any(s => s.Name == solution.Name)) return; 122 123 Series solutionSeries = new Series(solution.Name); 124 solutionSeries.Tag = solution; 125 solutionSeries.ChartType = SeriesChartType.FastLine; 126 var estimatedValues = GetResiduals(GetOriginalValues(), GetPrognosedValues(solution)); 127 UpdateSeries(estimatedValues, solutionSeries); 128 solutionSeries.ToolTip = "Area over Curve: " + CalculateAreaOverCurve(solutionSeries); 129 chart.Series.Add(solutionSeries); 130 } 131 132 protected void UpdateSeries(List<double> residuals, Series series) { 133 series.Points.Clear(); 134 residuals.Sort(); 135 136 series.Points.AddXY(0, 0); 137 for (int i = 0; i < residuals.Count; i++) { 138 var point = new DataPoint(); 139 if (residuals[i] > chart.ChartAreas[0].AxisX.Maximum) { 140 point.XValue = chart.ChartAreas[0].AxisX.Maximum; 141 point.YValues[0] = ((double)i) / residuals.Count; 142 point.ToolTip = "Error: " + point.XValue + "\n" + "Samples: " + point.YValues[0]; 143 series.Points.Add(point); 144 break; 145 } 146 147 point.XValue = residuals[i]; 148 point.YValues[0] = ((double)i + 1) / residuals.Count; 149 point.ToolTip = "Error: " + point.XValue + "\n" + "Samples: " + point.YValues[0]; 150 series.Points.Add(point); 151 } 152 153 if (series.Points.Last().XValue < chart.ChartAreas[0].AxisX.Maximum) { 154 var point = new DataPoint(); 155 point.XValue = chart.ChartAreas[0].AxisX.Maximum; 156 point.YValues[0] = 1; 157 point.ToolTip = "Error: " + point.XValue + "\n" + "Samples: " + point.YValues[0]; 158 series.Points.Add(point); 159 } 160 } 161 162 protected IEnumerable<double> GetOriginalValues() { 163 IEnumerable<double> originalValues; 164 switch (cmbSamples.SelectedItem.ToString()) { 165 case TrainingSamples: 166 originalValues = ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TrainingIndizes); 167 break; 168 case TestSamples: 169 originalValues = ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TestIndizes); 170 break; 171 case AllSamples: 172 originalValues = ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable); 173 break; 174 default: 175 throw new NotSupportedException(); 176 } 177 return originalValues; 178 } 179 180 protected IEnumerable<double> GetPrognosedValues(ITimeSeriesPrognosisSolution solution) { 181 IEnumerable<double> prognosedValues; 182 switch (cmbSamples.SelectedItem.ToString()) { 183 case TrainingSamples: 184 prognosedValues = solution.PrognosedTrainingValues; 185 break; 186 case TestSamples: 187 prognosedValues = solution.PrognosedTestValues; 188 break; 189 case AllSamples: 190 prognosedValues = solution.PrognosedValues; 191 break; 192 default: 193 throw new NotSupportedException(); 194 } 195 return prognosedValues; 196 } 197 198 protected IEnumerable<double> GetMeanModelEstimatedValues(IEnumerable<double> originalValues) { 199 double averageTrainingTarget = ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TrainingIndizes).Average(); 200 return Enumerable.Repeat(averageTrainingTarget, originalValues.Count()); 201 } 202 203 protected virtual List<double> GetResiduals(IEnumerable<double> originalValues, IEnumerable<double> estimatedValues) { 204 return originalValues.Zip(estimatedValues, (x, y) => Math.Abs(x - y)).ToList(); 205 } 206 207 private double CalculateAreaOverCurve(Series series) { 208 if (series.Points.Count < 1) throw new ArgumentException("Could not calculate area under curve if less than 1 data points were given."); 209 210 double auc = 0.0; 211 for (int i = 1; i < series.Points.Count; i++) { 212 double width = series.Points[i].XValue - series.Points[i - 1].XValue; 213 double y1 = 1 - series.Points[i - 1].YValues[0]; 214 double y2 = 1 - series.Points[i].YValues[0]; 215 216 auc += (y1 + y2) * width / 2; 217 } 218 219 return auc; 220 } 221 222 protected void cmbSamples_SelectedIndexChanged(object sender, EventArgs e) { 223 if (InvokeRequired) Invoke((Action<object, EventArgs>)cmbSamples_SelectedIndexChanged, sender, e); 224 else UpdateChart(); 56 //AR1 model 57 double alpha, beta; 58 OnlineCalculatorError errorState; 59 IEnumerable<double> trainingStartValues = ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TrainingIndices.Select(r => r - 1).Where(r => r > 0)).ToList(); 60 OnlineLinearScalingParameterCalculator.Calculate(ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TrainingIndices.Where(x => x > 0)), trainingStartValues, out alpha, out beta, out errorState); 61 var AR1model = new TimeSeriesPrognosisAutoRegressiveModel(ProblemData.TargetVariable, new double[] { beta }, alpha).CreateTimeSeriesPrognosisSolution(ProblemData); 62 AR1model.Name = "AR(1) Model"; 63 AddRegressionSolution(AR1model); 225 64 } 226 65 }
Note: See TracChangeset
for help on using the changeset viewer.