Пример #1
0
        public int[] Generate(NumberOfBins bins, bool cumulative = false)
        {
            BinCount = CalculateBinCount(bins);
            if (bins != NumberOfBins.BinWidth)
            {
                BinWidth = (Distribution.MaxValue - Distribution.MinValue) / BinCount;
            }

            var result = new int[BinCount];

            Array.Clear(result, 0, BinCount);

            foreach (double x in _values)
            {
                int index = (int)Math.Floor((x - Distribution.MinValue) / BinWidth);
                if (index == BinCount)
                {
                    index--;
                }
                result[index]++;
            }

            if (cumulative)
            {
                int sum = 0;
                for (int n = 0; n < BinCount; n++)
                {
                    sum      += result[n];
                    result[n] = sum;
                }
            }

            return(result);
        }
Пример #2
0
        private int CalculateBinCount(NumberOfBins bins)
        {
            int n = _values.Count();

            switch (bins)
            {
            case NumberOfBins.BinWidth:
                return(CalculateBinCount());

            case NumberOfBins.Sturges:
                return((int)Math.Ceiling(Math.Log(n) / Math.Log(2)) + 1);

            case NumberOfBins.RiceRule:
                return((int)Math.Ceiling(2.0 * Math.Pow(n, 1.0 / 3.0)));

            case NumberOfBins.ScottsNormalReferenceRule:
                BinWidth = 3.49 * Distribution.StandardDeviation / Math.Pow(n, 1.0 / 3.0);
                return(CalculateBinCount());

            case NumberOfBins.SquareRoot:
            case NumberOfBins.Default:
            default:
                return((int)Math.Ceiling(Math.Sqrt(n)));
            }
        }
Пример #3
0
        private static void GenerateHistogram(Histogram histogram, NumberOfBins bins, bool cumulative = false)
        {
            var sb = new StringBuilder((cumulative ? "Cumulative " : ""));

            sb.Append(bins).Append(", ");
            sb.Append($"{histogram.Distribution.Count} elements, ");
            sb.Append($"x\u0305 = {histogram.Distribution.Average:N3}, ");
            sb.Append($"\u03C3 = {histogram.Distribution.StandardDeviation:N3}, ");
            sb.Append($"Variance = {histogram.Distribution.Variance:N3}, ");
            sb.AppendLine($"Skewness = {histogram.Distribution.Skewness:N3}");
            sb.Append($"m\u2081 = {histogram.Distribution.FirstMoment:N3}, ");
            sb.Append($"m\u2082 = {histogram.Distribution.SecondMoment:N3}, ");
            sb.Append($"m\u2083 = {histogram.Distribution.ThirdMoment:N3} ");

            Console.WriteLine($"===============================================================");
            Console.WriteLine(sb.ToString());
            Console.WriteLine($"===============================================================");
            Console.WriteLine($"n            bin \u2265        bin \u2264          Count       ");
            Console.WriteLine($"===============================================================");

            var histo = histogram.Generate(bins, cumulative);

            int bin = 0;

            foreach (var value in histo)
            {
                double binFrom = histogram.Distribution.MinValue + bin * histogram.BinWidth;
                double binTo   = histogram.Distribution.MinValue + (bin + 1) * histogram.BinWidth;

                Console.WriteLine($"{bin,-5}   {binFrom,10:N3}   {binTo,10:N3}     {histo[bin],10}");
                bin++;
            }
        }