private void StartTrainButton_Click(object sender, RoutedEventArgs eventArgs) { if (Network == null || TrainingData == null) { MessageBox.Show("You didn't create network or get data points!\n"); } else { try { TrainingParameters p = GetParameters(); StandardTrainingObserver sno = Network.Dimensions == 2 ? new StandardTrainingObserver() : null; Network.Observer = sno; Network.Train(p); IErrorCalculator err = new QuantizationErrorCalculator() { DistanceCalculator = Network.DistanceCalculator }; SomInformation.Text += $"\nSom trained. Quantization error: {err.CalculateError(Network.Neurons, TrainingData):F} "; if (sno != null) { DisplayIfTwoDimensional(sno); } } catch (Exception e) { MessageBox.Show(e.Message); } } }
private void DisplayIfTwoDimensional(StandardTrainingObserver sno) { if (Network.Dimensions == 2) { if (SingleSeriesCheckBox.IsChecked == true) { List <OxyPlot.Wpf.Series> moving = View.Utility.Converter.ConvertToScatterSeries(sno.HistoryOfNeurons); var scattersData = new List <ScatterPoint>(); foreach (var train in TrainingData) { var x = train.At(0); var y = train.At(1); scattersData.Add(new ScatterPoint(x, y)); } var stat = new OxyPlot.Wpf.ScatterSeries { ItemsSource = scattersData, Title = $"Training points", MarkerSize = 2, MarkerFill = Color.FromRgb(140, 131, 130) }; ChartWindow chw1 = new ChartWindow(stat, moving); chw1.Show(); } if (MultipleSeriesCheckbox.IsChecked == true) { List <List <OxyPlot.Wpf.Series> > series = new List <List <Series> >(); List <List <Vector <double> > > history = Network.Observer.HistoryOfNeurons; for (int j = 0; j < history.Count; j++) { var epoch = history[j]; if (j % 4 == 0) { List <OxyPlot.Wpf.Series> group = new List <Series>(); Dictionary <Neuron, List <Vector <double> > > neuronZones = new Dictionary <Neuron, List <Vector <double> > >(); int i = 0; foreach (var neuron in Network.Neurons) { neuronZones.Add(neuron, new List <Vector <double> >()); neuron.CurrentWeights = epoch[i]; i++; } foreach (var data in TrainingData) { neuronZones[Network.GetWinner(data)].Add(data); } foreach (var neuronZone in neuronZones) { var scatterSet = new List <ScatterPoint>(); scatterSet.Add( Converter.ConvertVectorToScatterPoint(neuronZone.Key.CurrentWeights, true)); var points = neuronZone.Value; foreach (var point in points) { scatterSet.Add(Converter.ConvertVectorToScatterPoint(point)); } group.Add(new OxyPlot.Wpf.ScatterSeries { ItemsSource = scatterSet, Title = $"Class", MarkerSize = 3 }); } series.Add(group); } } ChartWindow chw2 = new ChartWindow(series); chw2.Show(); } } }