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); } }
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; }