/// <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; }
/// <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; }