Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
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;
         }
     }
 }
Ejemplo n.º 3
0
        public override IDistribution Fit(string variableName)
        {
            /* **** */

            orderedExpertNames = new string[Experts.Count()];
            int j = 0;

            foreach (var e in Experts)
            {
                orderedExpertNames [j] = e.Name;
                j++;
            }

            /* ---- */

            Buildz();
            BuildZ();
            BuildS();
            BuildPr();

            /* **** */

            var variable = Variables.Single(x => x.Name == variableName);

            var bounds = GetBounds(variable);
            var min    = bounds.Item1;
            var max    = bounds.Item2;

            var xx = Estimates.Get(variable);
            // var xx = expertEstimates.SelectMany(t => t);

            var xlist = new List <double> (xx);

            xlist.Add(min);
            xlist.Add(max);
            xlist.Sort();

            var probabilities = new double[xlist.Count - 1];

            for (int i = 0; i < xlist.Count - 1; i++)
            {
                var v = xlist[i];
                probabilities[i] = 1;
                var h = 0;

                // for getting the correct h, we need to compute it in the opposite
                // direction; as h = ((...) * (m + 1) + j ) * (m + 1) + k for [...,j,k]
                for (int l = Experts.Count() - 1; l >= 0; l--)
                {
                    var currentExpert = Experts.Single(x => x.Name == orderedExpertNames [l]);
                    var ll            = Estimates [currentExpert, variable].ToList();
                    // expertEstimates[l].ToList();
                    var index = ll.FindIndex(y => y > v);
                    if (index < 0)
                    {
                        index = NbQuantiles;
                    }

                    h = (h * (NbQuantiles + 1)) + index;
                }
                probabilities[i] *= Pr[h];
            }

            var sum = probabilities.Sum();

            probabilities = probabilities.Select(t => t / sum).ToArray();
            var stops = xlist.ToArray();

            var quantiles = new double [probabilities.Length + 1];

            quantiles [0] = 0;
            int ij;

            for (ij = 1; ij < probabilities.Length; ij++)
            {
                quantiles [ij] = quantiles[ij - 1] + probabilities[ij - 1];
            }

            quantiles [ij] = 1;

            var dist = new QuantileDistribution(quantiles, stops);

            return(dist);
        }