コード例 #1
0
        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));
            }
        }
コード例 #2
0
        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 }
            }
                );
        }
コード例 #3
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));
        }