Uniformly distributed points over the surface of the standard simplex

716 Views Asked by At

I would like to generate points that are uniformly distributed over the SURFACE of a standard $k$-simplex ($k$ dimensions, $k+1$ vertices).

One way to efficiently generate points that are uniformly distributed over the ENTIRETY of the $k$-simplex is to generate samples of $k$ iid exponential random variables, $E_i$, $i\in \left[1,k\right]$, then normalize, and $\vec{X}=\frac{\left\langle E_1,E_2,\dots,E_k\right\rangle}{\sum_{i=1}^k E_i}$, will be uniformly distributed over the entire $k$-simplex.

My problem is that the probability that one of these points lands on the surface (i.e. at a vertex, or along a hyper-edge, or on hyper-face, etc.) is nearly $0$, so that in practice all of the points end up being in the INTERIOR of the $k$-simplex.

In an attempt to sample the SURFACE of the $k$-simplex I have considered each hyper-edge, hyper-face, etc. separately and generated uniformly distributed samples on each (since they are themselves lower dimensional simplices). However, the problem becomes computationally unfeasible as $k$ increases because the number of hyper-edges, hyper-faces, etc. blows up.

Does anyone know of a method to explicitly generate samples that are uniformly distributed over the SURFACE (or BOUNDARY) of a standard $k$-simplex?

1

There are 1 best solutions below

5
On

Notice that faces of higher codimension than $1$ are negligible (they have measure zero), so to generate your random point you just need to:

  1. Pick a random integer from $0$ to $k.$ That will tell you which (top dimensional) face of the surface of the simplex you are working with.

The top dimensional faces are themselves simplices, so

  1. Use the algorithm you describe to generate a random point on the face you chose.

EDIT For the OP's nonuniform question, the simplest solution is to do what I said before, but if the point is too close to the boundary of the face (so, in three dimensions, you are picking a point from a triangular face, and seeing if it is too close to the edge), go to the closest point of that boundary, and then iterate the process.