public static Matrix ImportanceSampling(Matrix GoalFunc, int tryn) { Random r = new Random(); int[] sample = new int[tryn]; int point; double[,] sumnum = new double[1, 20]; for (int i = 0; i < 20; i++) { sumnum[0, i] = 0; } for (int i = 0; i < tryn; i++) { point = r.Next(0, 19); sumnum[0, point] = sumnum[0, point] + GoalFunc.body[0, point]; } Matrix getdist = new Matrix(sumnum); getdist.toProbabilty(); return getdist; }
public static Matrix GibbsSampling(Matrix GoalFunc, int tryn) { Random r = new Random(); int[] sample = new int[tryn]; int point = r.Next(0, 19); int newpoint; for (int i = 0; i < tryn; i++) { sample[i] = point; newpoint = JumpPointGibbs(point, r, GoalFunc); double ttt = GoalFunc.get(0, newpoint) / (GoalFunc.get(0, newpoint) + GoalFunc.get(0, point)); point = newpoint; } double[,] sumnum = new double[1, 20]; for (int i = 0; i < 20; i++) { sumnum[0, i] = 0; } for (int i = 0; i < tryn; i++) { if (sample[i] == -1) { } else { sumnum[0, sample[i]]++; } } Matrix getdist = new Matrix(sumnum); getdist.toProbabilty(); return getdist; }
static void Main(string[] args) { Matrix RealMass = new Matrix(new double[,]{{1,2,3,4,5,6,7,8,9,10,10,9,8,7,6,5,4,3,2,1}}); Matrix Realdist = new Matrix(RealMass.body); Realdist.toProbabilty(); int samplingtime = 500000; Matrix RSdist = RejectionSampling(Realdist, samplingtime); Matrix IPdist = ImportanceSampling(Realdist, samplingtime); Matrix MCdist = MCMCSampling(Realdist, samplingtime); Matrix GBdist = GibbsSampling(Realdist, samplingtime); Console.WriteLine(Realdist.toStringSimply()); Console.WriteLine("Sampling Distribution by Rejection Sampling"); Console.WriteLine(RSdist.toStringSimply()); Console.WriteLine("distance between Real and Rejection Sampling"); Console.WriteLine((Realdist - RSdist).toStringSimply()); Console.WriteLine("Sampling Distribution by MCMC Sampling"); Console.WriteLine(MCdist.toStringSimply()); Console.WriteLine("distance between Real and MCMC Sampling"); Console.WriteLine((Realdist - MCdist).toStringSimply()); Console.WriteLine("Sampling Distribution by Gibbs Sampling"); Console.WriteLine(GBdist.toStringSimply()); Console.WriteLine("distance between Real and Rejection Sampling"); Console.WriteLine((Realdist - GBdist).toStringSimply()); Console.WriteLine("Sampling Distribution by Importants Sampling"); Console.WriteLine(IPdist.toStringSimply()); Console.WriteLine("distance between Real and Importants Sampling"); Console.WriteLine((Realdist - IPdist).toStringSimply()); Console.WriteLine("Results of Rejection, MCMC, Gibbs, Importants"); Console.Write((1000*(Realdist - RSdist) * (1000*(Realdist - RSdist)).trans()).toStringSimply()+","); Console.Write((1000 * (Realdist - MCdist) * (1000 * (Realdist - MCdist)).trans()).toStringSimply() + ","); Console.Write((1000 * (Realdist - GBdist) * (1000 * (Realdist - GBdist)).trans()).toStringSimply() + ","); Console.Write((1000 * (Realdist - IPdist) * (1000 * (Realdist - IPdist)).trans()).toStringSimply() + ","); }
public static Matrix RejectionSampling(Matrix GoalFunc, int tryn) { Random r = new Random(); int[] sample = new int[tryn]; double rejectionprob; int point; for (int i = 0; i < tryn; i++) { point = r.Next(0, 19); rejectionprob = r.NextDouble(); if (rejectionprob > GoalFunc.get(0, point)) { sample[i] = -1; } else { sample[i] = point; } } double[,] sumnum = new double[1,20]; for (int i = 0; i < 20; i++) { sumnum[0,i] = 0; } for (int i = 0; i < tryn; i++) { if (sample[i] == -1) { } else { sumnum[0,sample[i]]++; } } Matrix getdist = new Matrix(sumnum); getdist.toProbabilty(); return getdist; }