コード例 #1
0
ファイル: RasterImage.cs プロジェクト: bvg-123/RusLat
        } // 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
コード例 #2
0
ファイル: RasterImage.cs プロジェクト: bvg-123/RusLat
        } // 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
コード例 #3
0
        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}");
        }
コード例 #4
0
        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;
        }