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); }
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; } } }
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); }