示例#1
0
        public void RunningStat_Stdev_Test2()
        {
            var stat = new RunningStat();

            stat.Push(0);
            stat.Push(0);
            stat.Push(0);

            //Assert.AreEqual()
        }
示例#2
0
 public void RunningStat_Average_Test1()
 {
     foreach (var n in new[] { 1, 2, 3, 10, 100, 1000 })
     {
         var xs   = Randomness.NextRandom().NextSequence(n).Select(x => (double)x).Take(n).ToList();
         var stat = new RunningStat();
         foreach (var x in xs)
         {
             stat.Push(x);
         }
         Assert.AreEqual(xs.Average(), stat.Average, 1d / 1000000);
     }
 }
示例#3
0
 public void RunningStat_Stdev_Test1()
 {
     foreach (var n in new[] { 10, 100, 1000 })
     {
         var xs   = Randomness.NextRandom().NextSequence(n).Select(x => (double)x).Take(n).ToList();
         var stat = new RunningStat();
         foreach (var x in xs)
         {
             stat.Push(x);
         }
         var stdev = xs.Stdev(xs.Average());
         var error = stdev - stat.Stdev;
         Assert.AreEqual(stdev, stat.Stdev, 0.25, $"e={error}");
     }
 }
示例#4
0
        public void TestMeanAndVariacneConsistency()
        {
            const int   numSamples = 100000;
            double      mean, stdev;
            RunningStat rs        = new RunningStat();
            Random      defaultrs = new Random();
            Poisson     poisson   = new Poisson();

            rs.Clear();
            mean           = 2000; stdev = Math.Sqrt(2000);
            poisson.Lambda = 2000;
            for (int i = 0; i < numSamples; ++i)
            {
                rs.Push(poisson.Sample(defaultrs));
            }
            PrintResult.CompareMeanAndVariance("Poisson Discrete", mean, stdev * stdev, rs.Mean(), rs.Variance());
        }
示例#5
0
        public void TestMeanAndVariacneConsistency()
        {
            const int   numSamples = 100000;
            double      mean, stdev;
            RunningStat rs          = new RunningStat();
            Random      defaultrs   = new Random();
            Exponential exponential = new Exponential();

            rs.Clear();
            mean = 2; stdev = 2;
            for (int i = 0; i < numSamples; ++i)
            {
                exponential.StandardDeviation = 2;
                //exponential.Mean = mean;
                rs.Push(exponential.Sample(defaultrs));
            }
            PrintResult.CompareMeanAndVariance("exponential", mean, stdev * stdev, rs.Mean(), rs.Variance());
        }
示例#6
0
        public void TestMeanAndVariacneConsistency()
        {
            const int   numSamples = 100000;
            double      mean, stdev;
            RunningStat rs        = new RunningStat();
            Random      defaultrs = new Random();
            Triangular  tri       = new Triangular();

            rs.Clear();
            var a = tri.LowerBound; var b = tri.UpperBound; var c = tri.Mode;

            mean = (a + b + c) / 3; stdev = Math.Sqrt((a * a + b * b + c * c - a * b - a * c - b * c) / 18);
            for (int i = 0; i < numSamples; ++i)
            {
                rs.Push(tri.Sample(defaultrs));
            }
            PrintResult.CompareMeanAndVariance("Triangular", mean, stdev * stdev, rs.Mean(), rs.Variance());
        }
示例#7
0
        public void TestMeanAndVariacneConsistency()
        {
            const int   numSamples = 100000;
            double      mean, stdev;
            RunningStat rs        = new RunningStat();
            Random      defaultrs = new Random();
            Gamma       gamma     = new Gamma();

            rs.Clear();
            mean = 2; stdev = 5;
            for (int i = 0; i < numSamples; ++i)
            {
                gamma.Mean = mean;
                gamma.StandardDeviation = stdev;
                rs.Push(gamma.Sample(defaultrs));                                                       //yy
            }
            PrintResult.CompareMeanAndVariance("gamma", mean, stdev * stdev, rs.Mean(), rs.Variance()); // TODO: result not consistent need to fix the bug
        }
示例#8
0
        public void TestMeanAndVariacneConsistency_Std()
        {
            const int   numSamples = 100000;
            double      mean, stdev;
            RunningStat rs        = new RunningStat();
            Random      defaultrs = new Random();
            Normal      normal    = new Normal();

            rs.Clear();
            mean = 2; stdev = 5;
            for (int i = 0; i < numSamples; ++i)
            {
                normal.Mean = mean;
                normal.StandardDeviation = stdev;
                rs.Push(normal.Sample(defaultrs));
            }
            PrintResult.CompareMeanAndVariance("normal", mean, stdev * stdev, rs.Mean(), rs.Variance());
        }
示例#9
0
        public void TestMeanAndVariacneConsistency()
        {
            const int   numSamples = 100000;
            double      mean, stdev;
            RunningStat rs        = new RunningStat();
            Random      defaultrs = new Random();
            Uniform     uniform   = new Uniform();

            rs.Clear();
            var a = uniform.UpperBound;
            var b = uniform.LowerBound;

            mean = (a + b) / 2; stdev = Math.Sqrt((b - a) * (b - a) / 12);
            for (int i = 0; i < numSamples; ++i)
            {
                rs.Push(uniform.Sample(defaultrs));
            }
            PrintResult.CompareMeanAndVariance("uniform", mean, stdev * stdev, rs.Mean(), rs.Variance());
        }
示例#10
0
        /// <summary>
        /// Returns null if the test value is below the lower bound of 90% confidence
        /// Otherwise returns an ammended testValue, such as testValue*pValue
        /// </summary>
        protected virtual double?CalculateConfidence(RunningStat statistic, double testValue, double stDevFactor, double stdevMinValue, bool isMacro = true)
        {
            const StaTest.TPTail pTail = TPTail.P0500; /* 95% CI */

            // ciRange is calculated using T value to account for
            double ciRange = StaTest.GetCiRangeFromS(Math.Max(0, (int)Math.Ceiling(Math.Sqrt(statistic.Count))), Math.Max(stdevMinValue, statistic.StandardDeviation) * stDevFactor, pTail);

            if (isMacro)
            {
                if (ciRange > statistic.Mean)
                {
                    // this happens when there are too few items in a cluster and the T value is too high
                    // in that case the constraint is harder on the expected text length or token count
                    ciRange = Math.Min(ciRange, statistic.Mean * (1 - this.Config.MinClusterAffinity) * stDevFactor);
                }
                else
                {
                    // macro statistics shouldn't get too tight, so the minimum range is not allowed to shrink even if statistics tell it to.
                    // the actual minimum range considered depends on the min affinity
                    // Example: for min affinity 0.8, if the cluster has a mean of 100 tokens and StDev is 2, then ciRange might be 4,
                    //          but the forula below will make it 100*0.2*0.8 = 16
                    ciRange = Math.Max(ciRange, statistic.Mean * (1 - this.Config.MinClusterAffinity) * this.Config.MinClusterAffinity);
                }
            }

            // if the test statistic is outside the acceptable range [Mean - ciRange, Mean + ciRange] then this is an outlier and will be rejected
            if (testValue < statistic.Mean - ciRange || testValue > statistic.Mean + ciRange)
            {
                return(null);
            }
            if (testValue > statistic.Mean)
            {
                return(testValue);
            }

            double zTest  = Math.Abs(testValue - statistic.Mean) / (statistic.StandardDeviation * 2);
            double pVal   = StaTest.GetPValueFromZ(zTest);
            double probWt = 2 * (1 - pVal);
            float  result = (float)(testValue * probWt);

            return(result);
        }
示例#11
0
        public void TestMeanAndVariacneConsistency()
        {
            List <int> numList = new List <int>()
            {
                1, 2, 3, 4, 5, 6, 7, 8, 9
            };
            const int     numSamples = 100000;
            double        mean, stdev;
            RunningStat   rs        = new RunningStat();
            Random        defaultrs = new Random();
            Uniform <int> uniform   = new Uniform <int>();

            uniform.Candidates = numList;
            rs.Clear();
            mean = 50; stdev = 0;
            for (int i = 0; i < numSamples; ++i)
            {
                rs.Push(uniform.Sample(defaultrs));
            }
            PrintResult.CompareMeanAndVariance("uniform categorical", mean, stdev * stdev, rs.Mean(), rs.Variance());
        }
示例#12
0
        public void TestMeanAndVariacneConsistency()
        {
            const int   numSamples = 100000;
            double      mean, stdev;
            RunningStat rs        = new RunningStat();
            Random      defaultrs = new Random();
            Uniform     uniform   = new Uniform();

            rs.Clear();
            var a = Convert.ToDouble(uniform.UpperBound);
            var b = Convert.ToDouble(uniform.LowerBound);

            mean = (a + b) / 2; stdev = Math.Sqrt(0.25);
            for (int i = 0; i < numSamples; ++i)
            {
                rs.Push(uniform.Sample(defaultrs));
            }
            PrintResult.CompareMeanAndVariance("uniform", mean, stdev * stdev, rs.Mean(), rs.Variance());
            Assert.IsTrue(Math.Abs(mean - rs.Mean()) < 0.1);
            Assert.IsTrue(Math.Abs(stdev * stdev - rs.Variance()) < 0.1);
        }
示例#13
0
        public void TestMeanAndVariacneConsistency_MuSigma()
        {
            const int   numSamples = 100000;
            double      mean, stdev;
            RunningStat rs        = new RunningStat();
            Random      defaultrs = new Random();
            LogNormal   logNormal = new LogNormal();

            rs.Clear();
            mean = 2; stdev = 5;
            var muTemp    = Math.Log(mean) - 0.5 * Math.Log(1 + stdev * stdev / mean / mean);
            var sigmaTemp = Math.Sqrt(Math.Log(1 + stdev * stdev / mean / mean));

            for (int i = 0; i < numSamples; ++i)
            {
                logNormal.Mu    = muTemp;
                logNormal.Sigma = sigmaTemp;

                rs.Push(logNormal.Sample(defaultrs));
            }
            PrintResult.CompareMeanAndVariance("logNormal", mean, stdev * stdev, rs.Mean(), rs.Variance());
        }
示例#14
0
        public void TestMeanAndVariacneConsistency_Mean()
        {
            const int numSamples = 100000;
            double    mean, variance;

            RunningStat rs        = new RunningStat();
            Random      defaultrs = new Random();
            Beta        beta      = new Beta();

            rs.Clear();
            //double a = 2, b = 70;

            //mean = a / (a + b);
            //variance = mean * (1 - mean) / (a + b + 1);
            mean = 0.1; variance = 0.1 * 0.1;
            for (int i = 0; i < numSamples; ++i)
            {
                beta.Mean = mean;
                beta.StandardDeviation = Math.Sqrt(variance);
                rs.Push(beta.Sample(defaultrs));
            }
            PrintResult.CompareMeanAndVariance("Beta", mean, variance, rs.Mean(), rs.Variance());
        }
示例#15
0
        public void Evaluate(MethodInfo method)
        {
            var action = MakeAction(this, method);

            var measure = new Func<int, RunningStat>(samples =>
            {
                var runningStat = new RunningStat();
                var sw = new Stopwatch();

                while (samples-- > 0)
                {
                    sw.Restart();
                    action();
                    runningStat.Push((decimal)sw.Elapsed.TotalMilliseconds);
                }

                return runningStat;
            });

            var initialTime = measure(1);
            var baseTime = measure(1);

            var warmupSamples = Math.Max(1, (int)Math.Round(this.warmupTargetTime.TotalMilliseconds / (double)baseTime.Mean));
            var warmupTime = measure(warmupSamples);

            var testSamples = Math.Max(30, (int)Math.Round(this.testTargetTime.TotalMilliseconds / (double)warmupTime.Mean));
            var testTime = measure(testSamples);

            PublishResults(initialTime.Mean, baseTime.Mean, warmupSamples, warmupTime.Mean, warmupTime.StandardDeviation, testSamples, testTime.Mean, testTime.StandardDeviation);
        }
示例#16
0
 public RunningRegression()
 {
     x_stats = new RunningStat();
     y_stats = new RunningStat();
     Clear();
 }
        static void Main(string[] args)
        {
            // the demo is based on the work of Dr. James D. McCaffrey
            // example from: "How to Do Naive Bayes with Numeric Data Using C#"
            // https://visualstudiomagazine.com/articles/2019/11/12/naive-bayes-csharp.aspx

            // modification for continuous data
            // the code for running mean and variance from John D. Cook
            // https://www.johndcook.com/blog/standard_deviation/

            Console.WriteLine("\nBegin running numeric naive Bayes demo");
            Console.WriteLine("\nData looks like: ");
            Console.WriteLine("Height  Weight  Foot  Sex");
            Console.WriteLine("=========================");
            Console.WriteLine("6.00,  180,  11,  0");
            Console.WriteLine("5.30,  120,   7,  1");
            Console.WriteLine(" . . .");

            double[][] data = new double[9][];           // modified, better example
            data[0] = new double[] { 6.00, 180, 11, 0 }; // 0 = male
            data[1] = new double[] { 5.90, 190, 9, 0 };  // 0 = male
            data[2] = new double[] { 5.70, 170, 8, 0 };  // 0 = male
            data[3] = new double[] { 5.60, 140, 10, 0 }; // 0 = male

            data[4] = new double[] { 5.80, 120, 9, 1 };  // 1 = female
            data[5] = new double[] { 5.50, 150, 6, 1 };  // 1 = female
            data[6] = new double[] { 5.30, 120, 7, 1 };  // 1 = female
            data[7] = new double[] { 5.00, 100, 5, 1 };  // 1 = female

            data[8] = new double[] { 5.60, 150, 8, -1 }; // -1 = unknown

            Console.WriteLine("\nItem to predict:");
            Console.WriteLine("5.60   150   8");

            int N  = data.Length;                 // 8 items + 1 unknown
            int nx = 3;                           // Number predictor variables
            int nc = 2;                           // Number classes

            int[]    classCts      = new int[nc]; // male, female
            double[] condProbs     = new double[nc * nx];
            double[] classProbs    = new double[nx];
            double[] evidenceTerms = new double[nx];
            double[] predictProbs  = new double[nx];

            RunningStat[] rs = new RunningStat[nx * nc];
            for (int i = 0; i < nc * nx; i++)
            {
                rs[i] = new RunningStat();
            }

            for (int p = 0; p < N - 1; p++)
            {
                // 1. compute class counts and add values
                ++classCts[(int)data[p][nx]];
                for (int j = 0, c = (int)data[p][nx] * nx; j < nx; ++j, c++)  // ht, wt, foot
                {
                    rs[c].Push(data[p][j]);
                }

                // 2. compute evidence terms
                double sumEvidence = 0.0;
                for (int c = 0, k = 0; c < nc; ++c)
                {
                    double evi = Math.Log(classCts[c]); // - MathLog(N); // double evi = (classCts[c] * 1.0) / N;
                    for (int j = 0; j < nx; ++j, k++)   // evi *= ProbDensFunc(rs[k].Mean(), rs[k].Variance(), unk[j]);
                    {
                        evi += Math.Log(ProbDensFunc(rs[k].Mean(), rs[k].Variance(), data[p + 1][j]));
                    }

                    sumEvidence += evidenceTerms[c] = Math.Exp(evi); //sumEvidence += evidenceTerms[c] = evi;
                }

                // 3. compute predicted probabilities
                for (int c = 0; c < nc; ++c)
                {
                    predictProbs[c] = evidenceTerms[c] / (sumEvidence + 1e-8f);
                }
            }

            // display prediction probabilities for last item
            Console.WriteLine("\nPrediction probabilities (male, female):");
            for (int c = 0; c < 2; ++c)
            {
                Console.WriteLine("class: " + c + "   " + predictProbs[c].ToString("F6"));
            }
            Console.WriteLine("\nPrediction class: " + ArgMax(predictProbs));
            Console.WriteLine("\nEnd demo");
            Console.ReadLine();
        }