Пример #1
0
        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}");
            }
        }
Пример #2
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        public void ExponentialDecayNormalizationTest(int count, int initialValue, double decayConstant)
        {
            var values = new ExponentialDecaySequence(initialValue, decayConstant).GenerateArray(count, normalize: true);

            Assert.Equal(1.0, values.Sum(), equalityComparer);
        }