MathGroup Archive 2008

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Re: Re: Sample uniformly from a simplex

  • To: mathgroup at smc.vnet.net
  • Subject: [mg94554] Re: [mg94499] Re: [mg94473] Re: Sample uniformly from a simplex
  • From: DrMajorBob <btreat1 at austin.rr.com>
  • Date: Tue, 16 Dec 2008 02:34:19 -0500 (EST)
  • References: <ghtjg8$rb3$1@smc.vnet.net> <200812141238.HAA10275@smc.vnet.net>
  • Reply-to: drmajorbob at longhorns.com

Same idea slightly simpler:

randomSimplex[n_] :=
  Rest@# - Most@# &[Union[{0, 1}, RandomReal[{0, 1}, n - 1]]]

randomSimplex[10]

{0.00288906, 0.00240762, 0.0739569, 0.252289, 0.188723, 0.00997999, \
0.10469, 0.172935, 0.114573, 0.0775569}

Bobby

On Mon, 15 Dec 2008 06:43:14 -0600, J. McKenzie Alexander  
<jalex at lse.ac.uk> wrote:

> Yet another solution would be to use a "stick-breaking" algorithm.
> Generate N-1 random reals in the interval [0,1], then use the length
> of the N subintervals as the values.
>
> randomSimplex[n_] := (#[[2]] - #[[1]]) & /@ (Partition[Union[{0, 1},
> RandomReal[{0, 1}, n - 1]], 2, 1])
>
> You can also use this method to sample points from a convex polytope
> with a little extra work.  See  
> http://cg.scs.carleton.ca/~luc/rnbookindex.html
> , page 568 (theorem 2.1).
>
> Cheers,
>
> Jason
>
> --
> Dr J. McKenzie Alexander
> Department of Philosophy, Logic and Scientific Method
> London School of Economics and Political Science
> Houghton Street, London WC2A 2AE
>
>
> On 14 Dec 2008, at 12:38, Jean-Marc Gulliet wrote:
>
>> Andreas wrote:
>>
>>> I need to develop Mathematica code to sample uniformly from a unit
>>> n-dimensional simplex.
>>>
>>> I came across a description of the problem at:  
>>> http://geomblog.blogspot.com/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
>>> sampling 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 the simplex.
>>>
>>> I've searched extensively for a Mathematica implementation of
>>> something like 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
>>
>> The following example in R^3 should be close to what you are looking
>> for, though I am not a statistician and I may have failed to fully
>> grasp
>> the suggested solution.
>>
>> In[1]:= Module[{x},
>>  Table[x = -Log[RandomReal[1, {3}]]; x/Total[x], {5}]]
>> Total[Transpose[%]]
>>
>> Out[1]= {{0.545974, 0.204439, 0.249587}, {0.36947, 0.0545329,
>>   0.575997}, {0.523704, 0.319784, 0.156512}, {0.490651, 0.398176,
>>   0.111173}, {0.0332044, 0.406806, 0.55999}}
>>
>> Out[2]= {1., 1., 1., 1., 1.}
>>
>> In[3]:= Graphics3D[
>>  Point /@ Module[{x},
>>    Table[x = -Log[RandomReal[1, {3}]]; x/Total[x], {1000}]]]
>>
>> Hope this helps,
>> -- Jean-Marc
>>
>>
>
>
>
>
>
> Please access the attached hyperlink for an important electronic  
> communications disclaimer:  
> http://www.lse.ac.uk/collections/secretariat/legal/disclaimer.htm
>



-- 
DrMajorBob at longhorns.com


  • Prev by Date: Re: Recognising parameters in function
  • Next by Date: Re: Calculate the first time, not each time (?)
  • Previous by thread: Re: Re: Sample uniformly from a simplex
  • Next by thread: Re: Sample uniformly from a simplex