From: Andreas on 14 Dec 2008 07:33 I've kept thinking about this and came up with the following. sampleSimplex[sampleSize_, dimensions_] := Module[{sample, sampleOutput}, sample = RandomReal[1, {sampleSize, dimensions}]; sampleOutput = Table[1 / Total[sample[[i, All]]] *sample[[i, All]], {i, 1, sampleSize}]; sampleOutput ] example: sampleSimplex[4, 3] {{0.163972, 0.445817, 0.390211}, {0.470828, 0.291766, 0.237406}, {0.56663, 0.3813, 0.0520696}, {0.182715, 0.600876, 0.216409}} This doesn't draw from an exponential distribution, but would this work? Also, if it does work can I do it a better (faster, more elegant) way?
From: Mark Fisher on 14 Dec 2008 07:37 On Dec 12, 6:55 am, Andreas <aa...(a)ix.netcom.com> wrote: > I need to develop Mathematica code to sample uniformly from a unit n-dime= nsional simplex. > > I came across a description of the problem at:http://geomblog.blogspot.co= m/2005/10/sampling-from-simplex.html > > Specifically, I would like a uniform sample from the set > > X = { (x1, x2, ..., xD) | 0 <= xi <= 1, x1 + x2 + ... + xD = 1}. > > D is the dimension of the simplex. > > So, the coordinates of any point on the simplex would sum to 1 and I need= to sample points on the simplex. > > geomblog's solution suggested: > > Generating IID random samples from an exponential distribution by samplin= g X from [0,1] uniformly, and returning -log(X)). > > Take n samples, then normalize. > > This should result in a list of numbers which is a uniform sample from th= e simplex. > > I've searched extensively for a Mathematica implementation of something l= ike this, to no avail. > > I keep trying different things but haven't made much headway. > > Any suggestions for how to develop this (or an equivelant) in Mathematica= much appreciated > > A Hi. Try this (using Version 6 or 7): ranSimp[d_] := (#/Plus @@ #) &[-Log[RandomReal[1, d]]] ranSimp[d_, n_] := (#/Plus @@ #) & /@ (-Log[RandomReal[1, {n, d}]]) d is the "dimension" of the simplex and n is the number of draws. --Mark
From: Asim on 14 Dec 2008 07:37 On Dec 12, 6:55 am, Andreas <aa...(a)ix.netcom.com> wrote: > I need to develop Mathematica code to sample uniformly from a unit n-dime= nsional simplex. > > I came across a description of the problem at:http://geomblog.blogspot.co= m/2005/10/sampling-from-simplex.html > > Specifically, I would like a uniform sample from the set > > X = { (x1, x2, ..., xD) | 0 <= xi <= 1, x1 + x2 + ... + xD = 1}. > > D is the dimension of the simplex. > > So, the coordinates of any point on the simplex would sum to 1 and I need= to sample points on the simplex. > > geomblog's solution suggested: > > Generating IID random samples from an exponential distribution by samplin= g X from [0,1] uniformly, and returning -log(X)). > > Take n samples, then normalize. > > This should result in a list of numbers which is a uniform sample from th= e simplex. > > I've searched extensively for a Mathematica implementation of something l= ike this, to no avail. > > I keep trying different things but haven't made much headway. > > Any suggestions for how to develop this (or an equivelant) in Mathematica= much appreciated > > A The following is code from Mathematica tutorials for sampling from the Dirichlet distribution. DirichletDistribution /: Random`DistributionVector[ DirichletDistribution[alpha_?(VectorQ[#, Positive] &)], n_Integer, prec_?Positive] := Block[{gammas}, gammas = Map[RandomReal[GammaDistribution[#, 1], n, WorkingPrecision -> prec] &, alpha]; Transpose[gammas]/Total[gammas]] Asim
From: Andreas on 23 Dec 2008 06:53 Great set of solutions. Many thanks to all who contributed. A
|
Pages: 1 Prev: Manipulate question Next: Did I trash Mathematica installation? |