Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Problems.GaussianProcessTuning/GaussianProcessDemo/Form1.cs @ 9338

Last change on this file since 9338 was 9338, checked in by gkronber, 12 years ago

#1967: minor adaptations necessary for the EuroCAST presentation

File size: 4.7 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Linq;
7using System.Text;
8using System.Threading.Tasks;
9using System.Windows.Forms;
10using HeuristicLab.Algorithms.DataAnalysis;
11using HeuristicLab.Core;
12using HeuristicLab.Data;
13using HeuristicLab.Problems.DataAnalysis;
14using HeuristicLab.Problems.Instances.DataAnalysis;
15using HeuristicLab.Random;
16
17namespace GaussianProcessDemo {
18  public partial class Form1 : Form {
19    private IRandom random;
20    private ICovarianceFunction covFunction;
21    private List<List<double>> data;
22    private double[] alpha;
23
24
25    public Form1() {
26      InitializeComponent();
27      this.random = new MersenneTwister();
28
29      var sum = new CovarianceSum();
30      var t = new CovarianceSquaredExponentialIso();
31      t.InverseLengthParameter.Value = new DoubleValue(1.0 / Math.Exp(-2));
32      sum.Terms.Add(t);
33      sum.Terms.Add(new CovarianceNoise());
34      this.covFunction = sum;
35      UpdateSliders();
36
37      InitData();
38      UpdateChart();
39    }
40
41    private void UpdateSliders() {
42      flowLayoutPanel1.Controls.Clear();
43      flowLayoutPanel1.Controls.Add(dataButton);
44      for (int i = 0; i < covFunction.GetNumberOfParameters(1); i++) {
45        var sliderControl = new TrackBar();
46        sliderControl.Minimum = -50;
47        sliderControl.Maximum = 50;
48        sliderControl.Value = 0;
49        sliderControl.ValueChanged += (sender, args) => UpdateChart();
50        flowLayoutPanel1.Controls.Add(sliderControl);
51      }
52    }
53
54    private void InitData() {
55      int n = 200;
56      data = new List<List<double>>();
57      data.Add(ValueGenerator.GenerateSteps(0, 1, 1.0 / n).ToList());
58
59      // sample from GP
60      var normalRand = new NormalDistributedRandom(random, 0, 1);
61      alpha = (from i in Enumerable.Range(0, n + 1)
62               select normalRand.NextDouble()).ToArray();
63    }
64
65    private void UpdateChart() {
66      var hyp = GetSliderValues();
67      var cov = covFunction.GetParameterizedCovarianceFunction(hyp, null);
68      var y = Util.SampleGaussianProcess(random, cov, data, alpha);
69
70      chart1.Series[0].Points.Clear();
71      foreach (var p in y.Zip(data[0], (t, x) => new { t, x })) {
72        chart1.Series[0].Points.AddXY(p.x, p.t);
73      }
74
75      var trainingData = new List<List<double>>();
76      var trainingIndices = RandomEnumerable.SampleRandomWithoutRepetition(Enumerable.Range(0, y.Count), random, 10);
77      var trainingY = trainingIndices.Select(i => y[i]).ToList();
78      var trainingX = trainingIndices.Select(i => data[0][i]).ToList();
79      trainingData.Add(trainingY);
80      trainingData.Add(trainingX);
81     
82      //chart1.Series[2].Points.Clear();
83      //foreach (var p in trainingY.Zip(trainingX, (t, x) => new { t, x })) {
84      //  chart1.Series[2].Points.AddXY(p.x, p.t);
85      //}
86
87      var allData = new List<List<double>>();
88      allData.Add(y);
89      allData.Add(data[0]);
90      var variableNames = new string[] { "y", "x" };
91      var fullDataSet = new Dataset(variableNames, allData);
92      var trainingDataSet = new Dataset(variableNames, trainingData);
93      var trainingRows = Enumerable.Range(0, trainingIndices.Count());
94      var fullRows = Enumerable.Range(0, data[0].Count);
95      var correctModel = new GaussianProcessModel(fullDataSet, variableNames.First(), variableNames.Skip(1), fullRows, hyp, new MeanZero(),
96                                                (ICovarianceFunction)covFunction.Clone());
97      var yPred = correctModel.GetEstimatedValues(fullDataSet, fullRows);
98      chart1.Series[1].Points.Clear();
99      foreach (var p in yPred.Zip(data[0], (t, x) => new { t, x })) {
100        chart1.Series[1].Points.AddXY(p.x, p.t);
101      }
102    }
103
104    private double[] GetSliderValues() {
105      var hyp = new List<double>();
106      foreach (var slider in flowLayoutPanel1.Controls.OfType<TrackBar>()) {
107        Console.Write(slider.Value / 10.0 + " ");
108        hyp.Add(slider.Value / 10.0);
109      }
110      Console.WriteLine();
111
112      return hyp.ToArray();
113    }
114
115    private void dataButton_Click(object sender, EventArgs e) {
116      var dataForm = new Form();
117      var dataTextField = new TextBox();
118      dataTextField.Multiline = true;
119      dataTextField.Text = DataToText();
120      dataTextField.Dock = DockStyle.Fill;
121      dataForm.Controls.Add(dataTextField);
122      dataForm.ShowDialog();
123    }
124
125    private string DataToText() {
126      var str = new StringBuilder();
127      foreach (var p in chart1.Series[1].Points) {
128        str.AppendLine(p.XValue + "\t" + p.YValues.First());
129      }
130      return str.ToString();
131    }
132  }
133}
Note: See TracBrowser for help on using the repository browser.