public override ExpertOpinionSharp.Distributions.IDistribution Fit(string variableName)
        {
            var variable = Variables.Single(x => x.Name == variableName);
            var bounds   = GetBounds(variable);

            var w = new double[Experts.Count() + 1];
            var d = new QuantileDistribution[Experts.Count()];

            w [0]            = 0;
            w [w.Length - 1] = 1;

            var weights = UseOptimalAlpha ? GetOptimalWeights() : GetWeights(_alpha);

            int i = 0;

            foreach (var kv in weights)
            {
                var p = Estimates [kv.Item1, variable];
                var t = new [] { bounds.Item1, p [0], p [1], p [2], bounds.Item2 };
                d [i]     = new QuantileDistribution(QuantileVector, t);
                w [i + 1] = w [i] + kv.Item2;
                i++;
            }

            var dist = new MixtureDistribution(w, d);

            return(dist);
        }
Example #2
0
        public void MixtureGumbelTest1()
        {
            var mixture = new MixtureDistribution(
                new[] { new GumbelDistribution(1, 2), new GumbelDistribution(3, 4), new GumbelDistribution(5, 6) },
                new[] { 0.2, 0.3, 0.5 }
                );

            for (double p = 0; p < 1.0; p += 0.01)
            {
                Assert.Equal(p, mixture.Cdf(mixture.Quantile(p)), Comparer);
            }
        }
Example #3
0
        public void MixtureExponentialTest1()
        {
            var exp     = new ExponentialDistribution();
            var mixture = new MixtureDistribution(exp, new ShiftedDistribution(exp, 10));

            var comparer = new AbsoluteEqualityComparer(1e-4);

            for (double p = 0; p < 1.0; p += 0.01)
            {
                double q = mixture.Quantile(p);
                output.WriteLine($"{p.ToStringInvariant("N2")}: {q.ToStringInvariant()}");
                Assert.Equal(p, mixture.Cdf(q), comparer);
            }
        }
Example #4
0
 void SetupUncertaintySatisfaction()
 {
     foreach (var o in _model.LeafObstacles())
     {
         try {
             var satRates = _model.satisfactionRateRepository
                            .GetObstacleSatisfactionRates(o.Identifier);
             if (satRates != null)
             {
                 var estimates = satRates.Where(x => x.ExpertIdentifier != null);
                 if (estimates.Count() > 0)
                 {
                     var dm = ef.Fit(o.Identifier);
                     if (dm is ExpertOpinionSharp.Distributions.QuantileDistribution quantileD)
                     {
                         var distribution = new QuantileDistribution(quantileD.probabilities, quantileD.quantiles);
                         _model.satisfactionRateRepository.AddObstacleSatisfactionRate(o.Identifier, distribution);
                     }
                     else if (dm is ExpertOpinionSharp.Distributions.MixtureDistribution mixtureD)
                     {
                         var distribution = new MixtureDistribution(mixtureD.cummulativeWeight, mixtureD.distributions.Select(x => new QuantileDistribution(x.probabilities, x.quantiles)).ToArray());
                         _model.satisfactionRateRepository.AddObstacleSatisfactionRate(o.Identifier, distribution);
                     }
                 }
                 else
                 {
                     Console.WriteLine($"Obstacle '{o.Identifier}' not estimated by experts. Using 'probability' value.");
                 }
             }
             else
             {
                 Console.WriteLine($"Obstacle '{o.Identifier}' not estimated. Using 0 as satisfaction rate.");
                 _model.satisfactionRateRepository.AddObstacleSatisfactionRate(o.Identifier, new DoubleSatisfactionRate(0));
             }
         } catch (Exception e) {
             //throw (e);
             Console.WriteLine("Error with " + o.FriendlyName);
             Console.WriteLine(e.Message);
             Console.WriteLine("---");
             Console.WriteLine(e);
             return;
         }
     }
 }
Example #5
0
        public void MixtureDistributionUniformTest1()
        {
            var mixture = new MixtureDistribution(new UniformDistribution(0, 1), new UniformDistribution(1, 2));

            Assert.Equal(1, mixture.Mean, Comparer);
            Assert.Equal(1, mixture.Median, Comparer);
            Assert.Equal(1.0 / 3, mixture.Variance, Comparer);
            Assert.Equal(Math.Sqrt(1.0 / 3), mixture.StandardDeviation, Comparer);

            Assert.Equal(0, mixture.Cdf(0), Comparer);
            Assert.Equal(0.25, mixture.Cdf(0.5), Comparer);
            Assert.Equal(0.5, mixture.Cdf(1), Comparer);
            Assert.Equal(0.75, mixture.Cdf(1.5), Comparer);
            Assert.Equal(1, mixture.Cdf(2), Comparer);

            for (double p = 0; p < 1.0; p += 0.01)
            {
                Assert.Equal(p, mixture.Cdf(mixture.Quantile(p)), Comparer);
            }
        }