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