public void Run() { var values = new NormalDistribution(mean: 20, stdDev: 2).Random(1).Next(20) .Concat(new NormalDistribution(mean: 40, stdDev: 2).Random(2).Next(20)) .Concat(new NormalDistribution(mean: 60, stdDev: 2).Random(3).Next(20)) .ToArray(); double GetMedian(int count, int halfLife) { double[] weights = ExponentialDecaySequence.CreateFromHalfLife(halfLife).GenerateReverseArray(count); var sample = new Sample(values.Take(count).ToList(), weights); return(HarrellDavisQuantileEstimator.Instance.GetQuantile(sample, 0.5)); } Console.WriteLine("Size WeightedMedian"); Console.WriteLine(" 1 3 5 10 // Half-life"); for (int i = 10; i < values.Length; i++) { double median1 = GetMedian(i, 1); double median3 = GetMedian(i, 3); double median5 = GetMedian(i, 5); double median10 = GetMedian(i, 10); string hint = i % 20 == 0 ? $" // Mean={(i / 20 + 1) * 20}" : ""; Console.WriteLine($"{i} {median1:0.00} {median3:0.00} {median5:0.00} {median10:0.00}{hint}"); } }
public void HarrellDavisQuantileEstimatorWeightedTest1() { var random = new Random(42); var distribution = new BetaDistribution(2, 10); double[] data1 = distribution.Random(random).Next(10); double[] data2 = data1.Select(x => x + 100).ToArray(); double[] data = data1.Concat(data2).ToArray(); var samples = new List <Sample> { new Sample(data1) }; for (int i = 1; i <= 40; i++) { samples.Add(new Sample(data, ExponentialDecaySequence.CreateFromHalfLife(i).GenerateArray(data.Length))); } samples.Add(new Sample(data)); var medians = samples.Select(s => HarrellDavisQuantileEstimator.Instance.GetMedian(s)).ToList(); for (int i = 0; i < medians.Count; i++) { Output.WriteLine($"Median[{i}] = {medians[i]:N9}"); } for (int i = 0; i < medians.Count - 1; i++) { Assert.True(medians[i] < medians[i + 1]); } }
public void WeightedSampleTest() { var random = new Random(42); var values = new GumbelDistribution().Random(random).Next(30).Concat( new GumbelDistribution(10).Random(random).Next(30)).ToList(); double[] weights = ExponentialDecaySequence.CreateFromHalfLife(10).GenerateReverseArray(values.Count); var sample = new Sample(values, weights); var simpleModalityData = detector.DetectModes(values); output.WriteLine("SimpleModalityData.Modes:"); output.WriteLine(Present(simpleModalityData)); output.WriteLine(); output.WriteLine(simpleModalityData.DensityHistogram.Present()); output.WriteLine("------------------------------"); var weightedModalityData = detector.DetectModes(sample); output.WriteLine("WeightedModalityData.Modes:"); output.WriteLine(Present(weightedModalityData)); output.WriteLine(); output.WriteLine(weightedModalityData.DensityHistogram.Present()); Assert.Equal(2, simpleModalityData.Modality); Assert.Equal(1, weightedModalityData.Modality); }
public void ExponentialDecayHalfLifeGetTest(int halfLife, int index, double expectedValue) { var sequence = ExponentialDecaySequence.CreateFromHalfLife(halfLife); double actualValue1 = sequence.GetValue(index); Assert.Equal(expectedValue, actualValue1, equalityComparer); double actualValue2 = sequence.GenerateEnumerable().Skip(index).First(); Assert.Equal(expectedValue, actualValue2, equalityComparer); }