} // MeasureOverride protected override void OnRender(DrawingContext dc) { base.OnRender(dc); if (Source != null) { Size clientArea = GetSourceSizeDIPed(); Rect r = new Rect(0, 0, clientArea.Width, clientArea.Height); dc.DrawRectangle(BackgroundBrush, null, r); int y = 0; int x = 0; r.X = Space; r.Y = Space; double szDip = Zoom / DPI.Scale; r.Width = szDip; r.Height = szDip; foreach (Raster.Pixel pixel in Source) { if (x == Source.Width) { x = 0; y++; r.X = Space; r.Y = r.Y + szDip + Space; } dc.DrawRectangle(new SolidColorBrush(Color.FromRgb(pixel.Red, pixel.Green, pixel.Blue)), null, r); if (Correlation != null) { // Обводим отображаемые пиксели цветом, зависящим от степени корреляции. Correlation correlation = Correlation.GetCorrelation(new RasterAffinityDetector.PixelCoordsKey(x, y)); if (correlation.Importance < 0.5) { // Малозначимые блоки никак не выделяем. } else { // Значащие блоки с высокой степень корреляции отмечаем красной точкой, а с низкой степенью корреляции - темно-синей. //Rect rBounds = new Rect(r.X-Space, r.Y-Space, r.Width+2*Space, r.Height+2*Space); Rect rBounds = new Rect(r.X + r.Width / 2, r.Y + r.Height / 2, 0.5, 0.5); Pen pen; if (correlation.Value > 0.5) { pen = new Pen(new SolidColorBrush(Colors.Red), Space); } else { pen = new Pen(new SolidColorBrush(Colors.Blue), Space); } dc.DrawRectangle(null, pen, rBounds); } } r.X = r.X + szDip + Space; x++; } if (Selection != null) { // Выделяем желтой рамкой текущий выбранный пиксель, над которым находится указатель мыши. dc.DrawRectangle(null, SelectionPen, Selection); } } } // OnRender
} // OnRender protected override void OnMouseMove(MouseEventArgs e) { if (Source != null) { Point p = e.GetPosition(this); double szDip = Zoom / DPI.Scale; // размер отображаемой точки растра в DIP-ах int x = (int)Math.Truncate((p.X - Space) / (szDip + Space)); // координата выбранной мышью точки отображаемого растра по горизонтали int y = (int)Math.Truncate((p.Y - Space) / (szDip + Space)); // координата выбранной мышью точки отображаемого растра по вертикали double xDip = x * (szDip + Space) + Space; // начало области отображаемой точки растра в DIP-ах по горизонтали double yDip = y * (szDip + Space) + Space; // начало области отображаемой точки растра в DIP-ах по вертикали Selection = new Rect(xDip, yDip, szDip, szDip); SelectedPixel = Source.Pixels[x, y]; SelectedCoords = new System.Drawing.Point(x, y); if (Correlation != null) { SelectedCorrelation = Correlation.GetCorrelation(new RasterAffinityDetector.PixelCoordsKey(x, y)); } else { SelectedCorrelation = null; } InvalidateVisual(); } } // OnMouseMove
public void Test2([Values(500)] int iterations, [Values(100)] int columns) { var testDir = Path.GetDirectoryName(Path.GetDirectoryName(TestContext.CurrentContext.TestDirectory)); var dataPath = Path.Combine(testDir ?? throw new NullReferenceException(), "..", "Data", "data.csv"); var mapper = new CsvMapper(); var data = mapper.ReadDataFromFile(dataPath, 1); var correlation = Correlation.GetCorrelation(data); data = data.RemoveLeastRelevantColumn(correlation, columns); var dataSet = data.SplitData(1, 2, 0); var trainingData = dataSet[DataType.Training]; var testingData = dataSet[DataType.Testing]; var neuralNetwork = new NeuralNetwork.NeuralNetwork { MinWeight = -5, MaxWeight = 5 }; var activationFunction = new SigmoidFunction(-1); neuralNetwork.ActivationFunction = activationFunction; neuralNetwork.AddLayer(new Layer(10, columns)); neuralNetwork.AddLayer(new Layer(1, 10)); var genetic = new GeneticAlgorithm.GeneticAlgorithm(100, neuralNetwork.GetConnectionCount()) { Selection = new TournamentSelection(100, 10), Crossover = new TwoPointCrossover(0.65, 100), Mutation = new FlipBitMutation(0.05) }; var keepLooping = true; for (var it = 0; it < iterations && keepLooping; it++) { foreach (var chromosome in genetic.Population) { neuralNetwork.SetWeights(chromosome.Genome); Parallel.For(0, trainingData.Attributes.Count, i => { var res = neuralNetwork.GetResult(trainingData.Attributes[i]); lock (chromosome) { chromosome.Fitness += Math.Abs(res[0] - trainingData.ObjectClass[i]); } }); } keepLooping = !genetic.Population.Any(chromosome => chromosome.Fitness < 5.0); Console.WriteLine($@"iteration: {it} | " + $@"best: {genetic.Population.MinBy(chromosome => chromosome.Fitness).First().Fitness}"); if (keepLooping && it < iterations - 1) { genetic.NextGeneration(); } } var best = genetic.Population.MinBy(chromosome => chromosome.Fitness).First(); neuralNetwork.SetWeights(best.Genome); var correct = testingData.Attributes .AsParallel() .Where((t, i) => Math.Abs(neuralNetwork.GetResult(t)[0] - testingData.ObjectClass[i]) < 0.3) .Count(); Console.WriteLine( $@"Population: {100}, iterations: {iterations} - fitness: {best.Fitness:0.0} " + $@"| correctly recognized: {correct}/{testingData.Attributes.Count}"); }
private void ButtonStartAlgorithm_Click(object sender, RoutedEventArgs e) { if (_algorithm != null) { var s = ((ToggleButton)sender).IsChecked; _algorithm.IsPaused = !s ?? !_algorithm.IsPaused; return; } RectangleDataGridTest.Dispatcher?.Invoke(() => RectangleDataGridTest.Visibility = Visibility.Collapsed); DataGridTest.Dispatcher?.Invoke(() => { DataGridTest.Visibility = Visibility.Collapsed; }); AlgorithmErrorValues.Clear(); AlgorithmValidationValues.Clear(); var neuralNetwork = SmartGenAlgorithm.CreateNeuralNetwork(); var geneticAlgorithm = SmartGenAlgorithm.CreateGeneticAlgorithm(neuralNetwork.GetConnectionCount()); if (Settings.Default.InputLayerSize < Data.Attributes.First().Count) { var correlation = Correlation.GetCorrelation(Data); Data = Data.RemoveLeastRelevantColumn(correlation, Settings.Default.InputLayerSize); } var dataSets = Data.SplitData(Settings.Default.TrainingRatio, Settings.Default.TestRatio, Settings.Default.ValidationRatio); _algorithm = new SmartGenAlgorithm(geneticAlgorithm, neuralNetwork) { DataSet = dataSets, ErrorTolerance = Settings.Default.ErrorTolerance, MaxIterations = Settings.Default.MaxGenerationCount }; _algorithm.IterationEvent += (iteration, error, validationError) => { var current = DateTimeOffset.Now.ToUnixTimeMilliseconds(); if (current - _milliseconds < 500) { return; } _milliseconds = current; AlgorithmErrorValues.Add(new ObservablePoint(iteration, error)); AlgorithmValidationValues.Add(new ObservablePoint(iteration, validationError)); if (AlgorithmErrorValues.Count <= 11) { return; } AlgorithmErrorValues.RemoveAt(0); AlgorithmValidationValues.RemoveAt(0); }; _algorithmTask = Task.Run(() => _algorithm.Run()); _algorithmTask.ContinueWith(HandleAlgorithmResult); ButtonStop.IsEnabled = true; }