using System;
using System.Collections.Generic;
using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics.Optimization;
namespace NonLinearRegressionExample
{
public class NonlinearRegressionCurveFitting
{
public static (List<double>, List<double>, List<double>) FitCurve(List<double> xData, List<double> yData)
{
// example data
var xDataDense = new DenseVector(xData.ToArray());
var yDataDense = new DenseVector(yData.ToArray());
Vector<double> Model(Vector<double> parameters, Vector<double> x)
{
var y = CreateVector.Dense<double>(x.Count);
for (int i = 0; i < x.Count; i++)
{
y[i] = parameters[0] * Math.Exp(parameters[1] * x[i]);
}
return y;
}
var start = new DenseVector(new double[] { 1.0, 0.1 });
var objective = ObjectiveFunction.NonlinearModel(Model, xDataDense, yDataDense);
var solver = new LevenbergMarquardtMinimizer(maximumIterations: 10000);
var result = solver.FindMinimum(objective, start);
Vector<double> points = result.MinimizedValues;
Vector<double> minimizing = result.MinimizingPoint;
return (xData, new List<double>(points.ToArray()), new List<double>(minimizing.ToArray()));
}
}
}
Programa de motorista:
var fittedCurve = NonlinearRegressionCurveFitting.FitCurve(xData, yData);
List<double> points = fittedCurve.Item2;
List<double> result = fittedCurve.Item3;
///Output the results
if (result.Count == 2)
{
DataPlotter plotter = new DataPlotter();
//plotter.ZoomXaxis(0, 10);
plotter.AddCurve("original",
new List<double>(xData.ToArray()),
new List<double>(yData.ToArray()),
IsSymbolVisible: false, color: Color.Red);
plotter.AddCurve("fitted",
new List<double>(xData.ToArray()),
new List<double>(points.ToArray()),
IsSymbolVisible: false,
color: Color.Green);
plotter.AddPoint("Point", result[0], result[1], Color.BlueViolet);
plotter.ShowDialog();
}
O código-fonte acima se ajusta a uma curva exponencial usando regressão não linear.
No entanto, como posso retornar os melhores A
valores b
desta função C# para a fórmula exponencial
y = A * exp(-x * b)
?
.
Esta função está retornando, MinimizingPoint
o que parece ser o ponto inicial do eixo x.
.
Os valores retornados por
MinimizingPoint
são os parâmetros da função ajustada. No seu casoy = A * exp(b * x)
, o primeiro parâmetro éA = 0.84275567216928349
e o segundo éb = -0.0071155733183345549
.Se você quiser encontrar um valor para qualquer dado
x
, calcule:y = A * exp(b * x)
ou com os parâmetros concretos:
y = 0.84275567216928349 * exp(-0.0071155733183345549 * x)
Não faz sentido representar graficamente esses parâmetros dados como
result[0]
eresult[1]
noFitCurve
método complotter.AddPoint("Point", result[0], result[1], Color.BlueViolet);
uma vez que não representam um ponto no gráfico.