public void BivariateNonlinearFitSimple() { double t0 = 3.0; double s0 = 1.0; ContinuousDistribution xDistribution = new CauchyDistribution(0.0, 2.0); ContinuousDistribution eDistribution = new NormalDistribution(0.0, 0.5); Random rng = new Random(5); List <double> x = TestUtilities.CreateDataSample(rng, xDistribution, 48).ToList(); List <double> y = x.Select(z => Math.Sin(2.0 * Math.PI * z / t0 + s0) + eDistribution.GetRandomValue(rng)).ToList(); Func <IReadOnlyDictionary <string, double>, double, double> fitFunction = (d, z) => { double t = d["Period"]; double s = d["Phase"]; return(Math.Sin(2.0 * Math.PI * z / t + s)); }; Dictionary <string, double> start = new Dictionary <string, double>() { { "Period", 2.5 }, { "Phase", 1.5 } }; NonlinearRegressionResult result = y.NonlinearRegression(x, fitFunction, start); Assert.IsTrue(result.Parameters["Period"].Estimate.ConfidenceInterval(0.99).ClosedContains(t0)); Assert.IsTrue(result.Parameters["Phase"].Estimate.ConfidenceInterval(0.99).ClosedContains(s0)); for (int i = 0; i < x.Count; i++) { double yp = result.Predict(x[i]); Assert.IsTrue(TestUtilities.IsNearlyEqual(result.Residuals[i], y[i] - yp)); } }
public void Bug53() { // User sent data for which non-linear fit failed with Nonconvergence exception. List <double> x = new List <double>(); List <double> y = new List <double>(); using (System.IO.StreamReader reader = System.IO.File.OpenText(@"Bug53.txt")) { reader.ReadLine(); while (!reader.EndOfStream) { string line = reader.ReadLine(); string[] values = line.Split(';'); y.Add(Double.Parse(values[0])); x.Add(Double.Parse(values[1])); } } NonlinearRegressionResult r = y.NonlinearRegression( x, (IReadOnlyDictionary <string, double> p, double u) => { return(p["0"] * (1.0 - Math.Exp(-p["1"] * (u - p["2"])))); }, //new Dictionary<string, double>() { { "0", 100.0 }, { "1", 1.0 }, { "2", 1.0 } } new Dictionary <string, double>() { { "0", 1.0 }, { "1", 1.0 }, { "2", 0.0 } } ); }
public void BivariateNonlinearFitVariances() { // Verify that we can fit a non-linear function, // that the estimated parameters do cluster around the true values, // and that the estimated parameter covariances do reflect the actually observed covariances double a = 2.7; double b = 3.1; ContinuousDistribution xDistribution = new ExponentialDistribution(2.0); ContinuousDistribution eDistribution = new NormalDistribution(0.0, 4.0); FrameTable parameters = new FrameTable(); parameters.AddColumns <double>("a", "b"); MultivariateSample covariances = new MultivariateSample(3); for (int i = 0; i < 64; i++) { BivariateSample sample = new BivariateSample(); Random rng = new Random(i); for (int j = 0; j < 8; j++) { double x = xDistribution.GetRandomValue(rng); double y = a * Math.Pow(x, b) + eDistribution.GetRandomValue(rng); sample.Add(x, y); } NonlinearRegressionResult fit = sample.NonlinearRegression( (IReadOnlyList <double> p, double x) => p[0] * Math.Pow(x, p[1]), new double[] { 1.0, 1.0 } ); parameters.AddRow(fit.Parameters.ValuesVector); covariances.Add(fit.Parameters.CovarianceMatrix[0, 0], fit.Parameters.CovarianceMatrix[1, 1], fit.Parameters.CovarianceMatrix[0, 1]); } Assert.IsTrue(parameters["a"].As <double>().PopulationMean().ConfidenceInterval(0.99).ClosedContains(a)); Assert.IsTrue(parameters["b"].As <double>().PopulationMean().ConfidenceInterval(0.99).ClosedContains(b)); Assert.IsTrue(parameters["a"].As <double>().PopulationVariance().ConfidenceInterval(0.99).ClosedContains(covariances.Column(0).Mean)); Assert.IsTrue(parameters["b"].As <double>().PopulationVariance().ConfidenceInterval(0.99).ClosedContains(covariances.Column(1).Mean)); Assert.IsTrue(parameters["a"].As <double>().PopulationCovariance(parameters["b"].As <double>()).ConfidenceInterval(0.99).ClosedContains(covariances.Column(2).Mean)); Assert.IsTrue(Bivariate.PopulationCovariance(parameters["a"].As <double>(), parameters["b"].As <double>()).ConfidenceInterval(0.99).ClosedContains(covariances.Column(2).Mean)); }