Ejemplo n.º 1
0
        private async Task OnClassifyLogisticRegression()
        {
            try
            {
                var logisticRegression = new LogisticRegression(FirstClass, SecondClass);
                logisticRegression.Train(0.01);
                var stopwatch = new Stopwatch();

                await Task.Run(() =>
                {
                    stopwatch.Start();
                    for (var i = 0; i < 5000; i++)
                    {
                        var randomPointX = random.NextDouble() * (PlotModel.Axes[0].Maximum - PlotModel.Axes[0].Minimum) + PlotModel.Axes[0].Minimum;
                        var randomPointY = random.NextDouble() * (PlotModel.Axes[1].Maximum - PlotModel.Axes[1].Minimum) + PlotModel.Axes[1].Minimum;

                        var logisticRegressionProbabilityResult = logisticRegression.Classify(randomPointX, randomPointY);

                        if (logisticRegressionProbabilityResult > 0.5)
                        {
                            FirstClassScatterSeries.Points.Add(new ScatterPoint(randomPointX, randomPointY, 4, double.NaN, FirstClass.Id));
                        }
                        else
                        {
                            SecondClassScatterSeries.Points.Add(new ScatterPoint(randomPointX, randomPointY, 4, double.NaN, FirstClass.Id));
                        }


                        if (stopwatch.Elapsed > TimeSpan.FromMilliseconds(100))
                        {
                            PlotModel.InvalidatePlot(true);
                            stopwatch.Restart();
                        }
                    }
                });

                PlotModel.InvalidatePlot(true);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
Ejemplo n.º 2
0
        private async Task DrawRoc( )
        {
            CanInteract = false;

            Status = "Training classifier...";

            await Task.Factory.StartNew(() => logistic.Fit(train,
                                                           trainAns.Select(x => isAimClass(x))
                                                           .ToArray( )));

            var series = new LineSeries( )
            {
                Smooth = false, LineStyle = LineStyle.Solid
            };

            Status = "Iterating over thresholds...";

            for (double tr = -10; tr <= 10; tr += 0.005)
            {
                logistic.Threshold = tr;
                var ans = await Task.Factory.StartNew(() => logistic.Classify(test));

                series.Points.Add(new DataPoint(CalcFPR(ans), CalcTPR(ans)));
            }

            var newModel = new PlotModel
            {
                Title = $"ROC for class {CurrentClass}",
            };

            newModel.Series.Add(series);
            newModel.Series.Add(new FunctionSeries(x => x, 0, 1, 0.01));

            Model = newModel;
            NotifyOfPropertyChange(() => Model);

            var plot = series.Points.Distinct( ).OrderBy(x => x.X * 10 + x.Y).ToList( );

            Status      = $"Area under curve: {CalcArea( plot )}";
            CanInteract = true;
        }