Beispiel #1
0
        /// <summary>
        /// do accept rejection sampling
        /// </summary>
        /// <returns></returns>
        public List<List<PZPoint>> Sample()
        {
            if (GMTargetDistribution == null)
                throw new ApplicationException("GeyerMollerSampler::Sample(), Candidate generating distribution or Instrumental distribution is not delegated.");

            averageAcceptProbability = 0.0;
            sumAcceptProbability = 0.0;
            averagesx = 0.0;
            averagenx = 0.0;
            sumnx = 0.0;
            sumsx = 0.0;

            // initial work space
            long seed = DateTime.Now.Millisecond;
            UniformDistribution U = new UniformDistribution(seed + 10);
            double u;
            UniformDistribution Ux = new UniformDistribution(seed + 20);
            UniformDistribution Uy = new UniformDistribution(seed + 30);
            double ux, uy;
            UniformDistribution Ub = new UniformDistribution(seed + 40);
            UniformDistribution Uremove = new UniformDistribution(seed + 50);
            double acceptProbability;
            double birthProbability;
            double deathProbability;

            // MCMC interation
            int n = 0;
            hits = 0;
            int Nm1 = N - 1;

            // start from empty chain.
            while (n < N)
            {
                List<PZPoint> X = new List<PZPoint>(totalSamples[n]);
                int xLength = X.Count;
                bool death = false;
                bool reject = false;

                // Birth or Death
                birthProbability = Ub.Sample();
                if (xLength > 0)
                    deathProbability = 1 - birthProbability;
                else
                {
                    birthProbability = 1.0;
                    deathProbability = 0.0;
                }

                if (birthProbability> deathProbability)
                // Birth
                {
                    death = false;
                    // creat a new point u in S
                    ux = Ux.Sample() * width;
                    uy = Uy.Sample() * height;
                    PZPoint pointU = new PZPoint(ux, uy);

                    // propose Y
                    List<PZPoint> Y = new List<PZPoint>(X);
                    Y.Add(pointU);

                    // accept probability
                    acceptProbability = BirthAcceptProbability(X, Y);
                    sumAcceptProbability += acceptProbability;
                    u = U.Sample();
                    if (u <= acceptProbability)
                    // accept Y
                    {
                        reject = false;
                        hits++;
                        if (n < Nm1)
                            // add Y to totalSample;
                            totalSamples.Add(Y);

                        if (n >= n0)
                            // add Y to targetSample
                            targetSamples.Add(Y);
                    }
                    else
                    // reject Y
                    {
                        reject = true;
                        if (n < Nm1)
                            totalSamples.Add(X);
                        if (n >= n0)
                            targetSamples.Add(X);
                    }
                }
                else
                // Death
                {
                    death = true;
                    // uniformly remove v from X
                    int removeIndex = Convert.ToInt32(Uremove.Sample() * xLength) - 1;
                    removeIndex = removeIndex > 0 ? removeIndex : 0;
                    // propose Y
                    List<PZPoint> Y = new List<PZPoint>(X);
                    Y.RemoveAt(removeIndex);

                    // accept probability
                    acceptProbability = DeathAcceptProbability(X, Y);
                    sumAcceptProbability += acceptProbability;
                    u = U.Sample();
                    if (u <= acceptProbability)
                    // accept Y
                    {
                        reject = false;
                        hits++;
                        if (n < Nm1)
                            // add Y to totalSample;
                            totalSamples.Add(Y);

                        if (n >= n0)
                            // add Y to targetSample
                            targetSamples.Add(Y);
                    }
                    else
                    // reject Y
                    {
                        reject = true;
                        if (n < Nm1)
                            totalSamples.Add(X);
                        if (n >= n0)
                            targetSamples.Add(X);
                    }
                }
                n++;

                // debug output
                averageAcceptProbability = sumAcceptProbability / (double) n;
                double r = 0.3;
                int nx = totalSamples[n - 1].Count;
                int sx = Convert.ToInt32(Sx(totalSamples[n - 1], r));
                sumsx += sx;
                sumnx += nx;
                double hx = GMTargetDistribution.Evaluate(totalSamples[n - 1]);

                Console.Write("n = " + n);
                if (death)
                    Console.Write(" Death");
                else
                    Console.Write(" Birth");
                if (reject)
                    Console.Write(" Reject");
                else
                    Console.Write(" Accept");
                Console.Write(" n(x) = " + nx);
                Console.Write(" s(x) = " + sx);
                Console.Write(" h(x) = " + String.Format("{0:f}", hx));
                Console.Write(" accept rate = " + String.Format("{0:f}", acceptProbability));
                Console.WriteLine(" average accept rate " + String.Format("{0:f}", averageAcceptProbability));
            }
            averageAcceptProbability = sumAcceptProbability / (double) N;
            averagesx = sumsx / (double)N;
            averagenx = sumnx / (double)N;
            return targetSamples;
        }
        /// <summary>
        /// uniform distribution example
        /// </summary>
        public static void ExampleSample()
        {
            string folderName = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop) + "\\";
            string fileName1 = "uniform distibution.txt";
            double lowerBound = -0.7;
            double upperBound = 0.7;

            FileStream fs1 = new FileStream(fileName1, FileMode.Create, FileAccess.Write);
            StreamWriter w1 = new StreamWriter(fs1);

            UniformDistribution random = new UniformDistribution(lowerBound, upperBound);

            for (int i = 0; i < 10000; i++)
                w1.WriteLine(random.Sample());

            w1.Close();
            fs1.Close();
        }
        /// <summary>
        /// do accept rejection sampling
        /// </summary>
        /// <returns></returns>
        public List<double[]> Sample()
        {
            if (ARSInstrumentalDistribution == null
                || ARSTargetDistribution == null)
                throw new ApplicationException("AcceptRrejectionSampling::Sample(), Target distribution or Instrumental distribution is not delegated.");

            totalIteration = 0;
            averageAcceptProbability = 0;
            // initial work space
            UniformDistribution U = new UniformDistribution();
            double u;
            double[] Z;
            double acceptProbability;

            // MC interation
            bool continueIterate = true;
            int hits = 0;
            while (continueIterate)
            {
                totalIteration++;

                // sample Z from instrumental distribution
                Z = ARSInstrumentalDistribution.Sample();

                // sample u from U(0, 1)
                u = U.Sample();

                // accept probability
                double targetValue =ARSTargetDistribution.Evaluate(Z);
                double instrumentalValue = ARSInstrumentalDistribution.Evaluate(Z);
                acceptProbability = targetValue / c / instrumentalValue;

                averageAcceptProbability += acceptProbability;

                if (u <= acceptProbability)
                {
                    hits++;
                    if (hits > n0)
                        targetSamples.Add(Z);
                    if (targetSamples.Count >= N)
                        continueIterate = false;
                }
            }
            averageAcceptProbability /= (double)totalIteration;
            return targetSamples;
        }
Beispiel #4
0
        /// <summary>
        /// do accept rejection sampling
        /// </summary>
        /// <returns></returns>
        public List<LineSegmentConfiguration> Sample()
        {
            if (_GMTargetDistribution == null)
                throw new ApplicationException("GVFThinningSampler::Sample(), Candidate generating distribution or Instrumental distribution is not delegated.");

            // initial work space
            long seed = DateTime.Now.Millisecond;
            UniformDistribution randomSample = new UniformDistribution(seed + 10);  // sample for accept/reject
            double uSample;
            UniformDistribution randomPool = new UniformDistribution(seed + 30); // sample for birth from pool
            double uPool;
            UniformDistribution randomBirth = new UniformDistribution(seed + 40); // birth/death probability
            double uBirth;
            double uDeath;
            UniformDistribution randomRemove = new UniformDistribution(seed + 50);  // sample for remove line segment
            double uRemove;
            double acceptProbability;

            // MCMC interation
            int n = 0;
            _hits = 0;
            int Nm1 = _n - 1;
            double hMax = Double.MinValue;
            while (n < _n)
            {
                // get current coinfiguration
                LineSegmentConfiguration X = new LineSegmentConfiguration(_totalSamples[n]);

                int xLength = X.N;
                bool death = false;
                bool reject = false;
                // count hits of line segments
                int sourceLength = _sourceLineSegmentList.N;
                for (int s = 0; s < xLength; s++)
                {
                    int lineSegmentIndex = X.Configure[s].Index;
                    _sourceLineSegmentList.Configure[lineSegmentIndex].Hit++;
                    //for (int si = 0; si < sourceLength; si++)
                    //{
                    //    if (_sourceLineSegmentList.Configure[si].Index == lineSegmentIndex)
                    //    {
                    //        _sourceLineSegmentList.Configure[si].Hit++;
                    //        continue;
                    //    }
                    //}
                }

                /// Birth or Death ?
                #region Birth or Death ?
                uBirth = randomBirth.Sample();
                if (xLength > 0 && xLength < _totalLineSegment)
                    uDeath = 1 - uBirth;
                else if (xLength == 0)
                // only birth
                {
                    uBirth = 1.0;
                    uDeath = 0.0;
                }
                else
                // only death
                {
                    uDeath = 1.0;
                    uBirth = 0.0;
                }
                #endregion

                if (uBirth > uDeath)
                // Birth
                #region Birth
                {
                    death = false;
                    // sample a new line segment from pool
                    uPool = System.Math.Floor(randomPool.Sample() * _lineSegmentPool.N);
                    LineSegment addedLineSegment = _lineSegmentPool.Configure[(int)uPool];

                    // propose Y
                    LineSegmentConfiguration Y = new LineSegmentConfiguration(X);
                    Y.Add(addedLineSegment);

                    // debug
                    #region debug
                    //double temphy = _GMTargetDistribution.Evaluate(Y);
                    //double temphx = _GMTargetDistribution.Evaluate(X);
                    //temphy = _GMTargetDistribution.Evaluate(Y);
                    //temphx = _GMTargetDistribution.Evaluate(X);
                    #endregion

                    // accept probability
                    acceptProbability = BirthAcceptProbability(X, Y);
                    _sumAcceptProbability += acceptProbability;
                    uSample = randomSample.Sample();
                    if (uSample <= acceptProbability)
                    // accept Y
                    {
                        reject = false;
                        _hits++;
                        if (n < Nm1)
                            // add Y to totalSample;
                            _totalSamples.Add(Y);
                        if (n >= _n0)
                            // add Y to targetSample
                            _targetSamples.Add(Y);
                        // remove l from pool
                        _lineSegmentPool.RemoveAt((int)uPool);
                        //_totalLineSegment--;
                    }
                    else
                    // reject Y
                    {
                        reject = true;
                        if (n < Nm1)
                            _totalSamples.Add(X);
                        if (n >= _n0)
                            _targetSamples.Add(X);
                    }
                }
                #endregion
                else
                // Death
                #region Death
                {
                    death = true;
                    // uniformly remove v from X
                    uRemove = (int)System.Math.Floor(randomRemove.Sample() * xLength);
                    // propose Y
                    LineSegmentConfiguration Y = new LineSegmentConfiguration(X);
                    LineSegment removedLineSegment = Y.Configure[(int)uRemove];
                    Y.RemoveAt((int)uRemove);

                    // accept probability
                    acceptProbability = DeathAcceptProbability(X, Y);
                    _sumAcceptProbability += acceptProbability;
                    uSample = randomSample.Sample();
                    if (uSample <= acceptProbability)
                    // accept Y
                    {
                        reject = false;
                        _hits++;
                        if (n < Nm1)
                            // add Y to totalSample;
                            _totalSamples.Add(Y);
                        if (n >= _n0)
                            // add Y to targetSample
                            _targetSamples.Add(Y);
                        // add l back to pool
                        _lineSegmentPool.Add(removedLineSegment);
                        //_totalLineSegment++;
                    }
                    else
                    // reject Y
                    {
                        reject = true;
                        if (n < Nm1)
                            _totalSamples.Add(X);
                        if (n >= _n0)
                            _targetSamples.Add(X);
                    }
                }
                #endregion

                n++;

                // debug output
                #region debug
                _averageAcceptProbability = _sumAcceptProbability / (double)n;
                double h = _GMTargetDistribution.Evaluate(_totalSamples[n - 1]);
                if (h > hMax)
                {
                    hMax = h;
                    _indexMax = n - 1;
                }
                Console.Write("n = " + (n - 1));
                if (death)
                    Console.Write(" Death");
                else
                    Console.Write(" Birth");
                if (reject)
                    Console.Write(" Reject");
                else
                    Console.Write(" Accept");
                Console.Write(" # = " + _totalSamples[n - 1].N);
                Console.Write(" h(x) = " + String.Format("{0:0.0000e+00}", h));
                Console.Write(" accept rate = " + String.Format("{0:0.0000e+00}", acceptProbability));
                Console.WriteLine(" average accept rate " + String.Format("{0:f}", _averageAcceptProbability));
                #endregion
            } // end of while

            #region debug
            Console.Write("hx max = " + String.Format("{0:0.0000}", hMax) + " index = " + _indexMax);
            _averageAcceptProbability = _sumAcceptProbability / (double)_n;
            #endregion

            return _targetSamples;
        }
        /// <summary>
        /// do accept rejection sampling
        /// </summary>
        /// <returns></returns>
        public List<double[]> Sample()
        {
            if (MHTargetDistribution == null
                || MHCandidateGeneratingDistribution == null)
                throw new ApplicationException("MetropolisHastingsSampling::Sample(), Candidate generating distribution or Instrumental distribution is not delegated.");

            averageAcceptProbability = 0;

            // initial work space
            UniformDistribution U = new UniformDistribution();
            double u;
            double acceptProbability;

            // MCMC interation
            int n = 0;
            hits = 0;
            int Nm1 = N - 1;

            double[] mu = {1, 2};
            while (n < N)
            {
                // sample Y from candidate generating distribution
                // random walk sample
                double[] Y = MHCandidateGeneratingDistribution.RandomWalkSample(totalSamples[n]);
                // 1st order autogressive sample
                //double[] Y = MHCandidateGeneratingDistribution.FirstOrderAutoGressiveSample(totalSamples[n], mu);

                // sample u from U(0, 1)
                u = U.Sample();

                // accept probability
                acceptProbability = AcceptProbability(totalSamples[n], Y);
                averageAcceptProbability += acceptProbability;

                if (u <= acceptProbability)
                {
                    hits++;
                    if (n < Nm1)
                        for (int i = 0; i < dimension; i++)
                            totalSamples[n + 1][i] = Y[i];

                    if (n >= n0)
                        targetSamples.Add(Y);
                }
                else
                {
                    if (n < Nm1)
                        for (int i = 0; i < dimension; i ++)
                            totalSamples[n + 1][i] = totalSamples[n][i];
                    if (n >= n0)
                        targetSamples.Add(totalSamples[n]);
                }
                n++;
            }
            averageAcceptProbability /= (double)N;
            return targetSamples;
        }