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