Пример #1
0
        public void TestKernel()
        {
            var methodName = MethodBase.GetCurrentMethod().Name;

            TestUtils.ShowStarting(methodName);

            var x = new [] { .2, .3 };
            var y = new [] { .1, .4 };
            var z = new [] { .3, .4 };

            var kernelEstimator = new KernelDensityEstimator();

            //kernelEstimator.AddObservation(x);
            //kernelEstimator.AddObservation(y);
            Console.WriteLine(kernelEstimator.HasObservation());
            var estimation = kernelEstimator.GetDensityEstimation(z, .1, 0);

            if (estimation == null)
            {
                return;
            }
            foreach (var e in estimation)
            {
                Console.WriteLine(e);
            }
        }
        public void SampleCompare()
        {
            var kde = new KernelDensityEstimator(0.02f);

            //DensityEstimationTests.RunSampleTest(kde, x => x);
            DensityEstimationTests.RunSampleTest(kde, x => ColumnVector1D.Create(x.Value));
        }
Пример #3
0
        public void ProbabilityOf_LinearSample()
        {
            var kde = new KernelDensityEstimator();
            var data = Enumerable.Range(1, 100).Select(n => (n).OutOf(100)).AsQueryable();
            var sample = new ContinuousSample<Fraction>(data, kde);

            foreach(var x in Enumerable.Range(1, 100))
            {
                Console.WriteLine("{0}\t{1}", x, sample.DensityOf(x.OutOf(100)).Value);
            }
        }
Пример #4
0
        public void KDETestGaussianKernelBandwidth2()
        {
            var kde = new KernelDensityEstimator(_testData);

            kde.Bandwidth = 2.0d;

            var estimate = kde.EstimateDensity(-3.5);

            AssertHelpers.AlmostEqualRelative(0.046875864115900, estimate, 10);

            estimate = kde.EstimateDensity(0);
            AssertHelpers.AlmostEqualRelative(0.186580447512078, estimate, 10);

            estimate = kde.EstimateDensity(2);
            AssertHelpers.AlmostEqualRelative(0.123339405007761, estimate, 10);
        }
Пример #5
0
        public void KDETestGaussianKernelBandwidth0p5()
        {
            var kde = new KernelDensityEstimator(_testData);

            kde.Bandwidth = 0.5d;

            var estimate = kde.EstimateDensity(-3.5);

            AssertHelpers.AlmostEqualRelative(5.311490430807364e-007, estimate, 10);

            estimate = kde.EstimateDensity(0);
            AssertHelpers.AlmostEqualRelative(0.369994803886827, estimate, 10);

            estimate = kde.EstimateDensity(2);
            AssertHelpers.AlmostEqualRelative(0.032447347007482, estimate, 10);
        }
Пример #6
0
        public void ProbabilityOf_RandomSample()
        {
            var kde = new KernelDensityEstimator();
            var data = Enumerable.Range(1, 50).Select(n => Fraction.Random(100, 1)).AsQueryable();
            var sample = new ContinuousSample<Fraction>(data, kde);

            foreach (var x in Enumerable.Range(1, 100))
            {
                try
                {
                    Console.WriteLine("{0}\t{1}", x, sample.DensityOf(x.OutOf(100)).Value);
                }
                catch (DivideByZeroException)
                {
                    Console.WriteLine("Divide by zero error: {0}", x);
                }
            }
        }
Пример #7
0
        public void KDETestGaussianKernelBandwidth1()
        {
            var kde = new KernelDensityEstimator(_testData);

            Assert.AreEqual(KDEKernelType.Gaussian, kde.KernelType);
            Assert.AreEqual(1.0d, kde.Bandwidth);
            AssertHelpers.AlmostEqualRelative(0.398942280401433, kde.Kernel(0), 10); //Density of standard normal distribution at 0

            var estimate = kde.EstimateDensity(-3.5);

            AssertHelpers.AlmostEqualRelative(0.004115405028907, estimate, 10);

            estimate = kde.EstimateDensity(0);
            AssertHelpers.AlmostEqualRelative(0.310485907659139, estimate, 10);

            estimate = kde.EstimateDensity(2);
            AssertHelpers.AlmostEqualRelative(0.099698581377801, estimate, 10);
        }
Пример #8
0
        public void KDETestTriangularKernelBandwidth1()
        {
            var kde = new KernelDensityEstimator(_testData);

            kde.KernelType = KDEKernelType.Triangular;

            Assert.AreEqual(KDEKernelType.Triangular, kde.KernelType);
            Assert.AreEqual(1.0d, kde.Bandwidth);
            Assert.AreEqual(1.0d, kde.Kernel(0)); //Density of standard normal distribution at 0

            var estimate = kde.EstimateDensity(-3.5);

            AssertHelpers.AlmostEqualRelative(0, estimate, 10);

            estimate = kde.EstimateDensity(0);
            AssertHelpers.AlmostEqualRelative(0.347688490533868, estimate, 10);

            estimate = kde.EstimateDensity(2);
            AssertHelpers.AlmostEqualRelative(0.004216757636608, estimate, 10);
        }
Пример #9
0
        public void KDETestEpanechnikovKernelBandwidth1()
        {
            var kde = new KernelDensityEstimator(_testData);

            kde.KernelType = KDEKernelType.Epanechnikov;

            Assert.AreEqual(KDEKernelType.Epanechnikov, kde.KernelType);
            Assert.AreEqual(1.0d, kde.Bandwidth);
            Assert.AreEqual(0.75d, kde.Kernel(0));

            var estimate = kde.EstimateDensity(-3.5);

            AssertHelpers.AlmostEqualRelative(0, estimate, 10);

            estimate = kde.EstimateDensity(0);
            AssertHelpers.AlmostEqualRelative(0.353803214812608, estimate, 10);

            estimate = kde.EstimateDensity(2);
            AssertHelpers.AlmostEqualRelative(0.006248168996717, estimate, 10);
        }
Пример #10
0
        public void KDETestUniformKernelBandwidth1()
        {
            var kde = new KernelDensityEstimator(_testData);

            kde.KernelType = KDEKernelType.Uniform;

            Assert.AreEqual(KDEKernelType.Uniform, kde.KernelType);
            Assert.AreEqual(1.0d, kde.Bandwidth);
            Assert.AreEqual(0.5d, kde.Kernel(0));

            var estimate = kde.EstimateDensity(-3.5);

            AssertHelpers.AlmostEqualRelative(0, estimate, 10);

            estimate = kde.EstimateDensity(0);
            AssertHelpers.AlmostEqualRelative(0.35, estimate, 10);

            estimate = kde.EstimateDensity(2);
            AssertHelpers.AlmostEqualRelative(0.1, estimate, 10);
        }
Пример #11
0
        public void KDETestCustomKernelBandwidth1()
        {
            var kde = new KernelDensityEstimator(_testData);

            kde.Bandwidth = 1.0d;
            kde.Kernel    = x => 0.5d * Math.Exp(-Math.Abs(x)); //Picard-Kernel

            Assert.AreEqual(KDEKernelType.Custom, kde.KernelType);
            Assert.AreEqual(1.0d, kde.Bandwidth);
            Assert.AreEqual(0.5d, kde.Kernel(0));

            var estimate = kde.EstimateDensity(-3.5);

            AssertHelpers.AlmostEqualRelative(0.018396636706009, estimate, 10);

            estimate = kde.EstimateDensity(0);
            AssertHelpers.AlmostEqualRelative(0.272675897096678, estimate, 10);

            estimate = kde.EstimateDensity(2);
            AssertHelpers.AlmostEqualRelative(0.092580285110347, estimate, 10);
        }
Пример #12
0
        protected void CalculateDensity(Series series, List <double> row, double bandwidth = double.NaN)
        {
            string densitySeriesName = "Density " + series.Name;
            double stepWidth         = series.Points[1].XValue - series.Points[0].XValue;
            var    rowArray          = row.ToArray();

            if (chart.Series.Any(x => x.Name == densitySeriesName))
            {
                var ds = chart.Series.Single(x => x.Name == densitySeriesName);
                chart.Series.Remove(ds);
            }

            if (double.IsNaN(bandwidth))
            {
                bandwidth = KernelDensityEstimator.EstimateBandwidth(rowArray);
                decimal bwDecimal = (decimal)bandwidth;
                if (bwDecimal < bandwidthMin)
                {
                    bwDecimal = bandwidthMin;
                    bandwidth = decimal.ToDouble(bwDecimal);
                }
                suppressUpdate = true;
                bandwidthNumericUpDown.Value = bwDecimal;
            }
            var density = KernelDensityEstimator.Density(rowArray, rowArray.Length, stepWidth, bandwidth);

            Series newSeries = new Series(densitySeriesName);

            newSeries.Color       = series.Color;
            newSeries.ChartType   = SeriesChartType.FastLine;
            newSeries.BorderWidth = 2;
            foreach (var d in density)
            {
                newSeries.Points.Add(new DataPoint(d.Item1, d.Item2));
            }

            // densities should be plotted on the second axis (different scale)
            newSeries.YAxisType = AxisType.Secondary;
            chart.Series.Add(newSeries);
        }
Пример #13
0
        public void Evaluate_NormalSample()
        {
            var sample = Enumerable
                .Range(1, 10)
                .Select(n => new { p = Functions.NormalDistribution(n, 2.87f, 5), n = n })
                .SelectMany(x => Enumerable.Range(1, (int)(x.p * 100)).Select(n => (x.n).OutOf(10)))
                .ToList()
                .AsQueryable();

            var hist = new Histogram(0.02f);
            var kde = new KernelDensityEstimator(0.02f);
            var histF = hist.Evaluate(sample);
            var kdeF = kde.Evaluate(sample);
            var stdDevMu = Functions.MeanStdDev(sample);

            Console.WriteLine("Mean\t{0}", stdDevMu.Item1);
            Console.WriteLine("StdDev\t{0}", stdDevMu.Item2);

            var hRes = Enumerable.Range(1, 10).Select(n => new { n = n, p = histF(n.OutOf(10)) });
            var kRes = Enumerable.Range(1, 10).Select(n => kdeF(n.OutOf(10))).Normalise().ToList();
            int i = 0;

            foreach (var x in hRes)
            {
                var kr = kRes[i++];
                Console.WriteLine("{0}\t{1}\t{2}", x.n, x.p.Value, kr.Value);
                Assert.That(Math.Round(x.p.Value, 4), Is.EqualTo(Math.Round(kr.Value, 4)));
            }
        }