Échantillonnage uniforme à partir d'un simplex

29

Je recherche un algorithme pour générer un tableau de N nombres aléatoires, tel que la somme des N nombres soit 1, et tous les nombres se situent entre 0 et 1. Par exemple, N = 3, le point aléatoire (x, y, z) doit se trouver dans le triangle:

x + y + z = 1
0 < x < 1
0 < y < 1
0 < z < 1

Idéalement, je veux que chaque point dans la zone ait une probabilité égale. Si c'est trop difficile, je peux supprimer l'exigence. Merci.

Ruofeng
la source
Quelle est la distribution cible? Qu'as-tu essayé?
Raphael
3
Notez qu'il y a toujours un échantillonnage de rejet : échantillonnez nombres uniformes et rejetez si les nombres ne totalisent pas 1 . Ici, le nombre d'itérations attendu est inconfortablement élevé, vous devez donc faire autre chose. n1
Raphael

Réponses:

28

Supposons d'abord que vous souhaitez échantillonner dans

x + y + z = 1
0 ≤ x ≤ 1
0 ≤ y ≤ 1
0 ≤ z ≤ 1

Cela ne fait pas une grande différence, car le point d'échantillonnage se trouvera toujours dans votre zone demandée avec une forte probabilité.

Il vous reste maintenant à échantillonner un point d'un simplexe . Dans l'exemple 3D, vous obtenez un simplexe 2D (triangle) réalisé en 3D.

Comment choisir un point uniformément au hasard a été discuté dans ce billet de blog (voir les commentaires).

Pour votre problème, cela signifierait que vous prenez nombres aléatoires de l'intervalle ( 0 , 1 ) , puis vous ajoutez un 0 et 1 pour obtenir une liste de n + 1 nombres. Vous triez la liste, puis vous enregistrez les différences entre deux éléments consécutifs. Cela vous donne une liste de n nombres qui totalisera 1 . De plus, cet échantillonnage est uniforme. Cette idée peut être trouvée dans Donald B. Rubin, The Bayesian bootstrap Ann. Statist. 9, 1981, 130-134.n1(0,1)01n+1n1

Par exemple ( ) vous avez les trois nombres aléatoires puis vous obtenez la séquence triée et cela donne les différences , et par construction ces quatre nombres résument à 1.n=40.4 0.2 0.10 0.1 0.2 0.4 10.1 0.1 0.2 0.6

Une autre approche est la suivante: premier échantillon de l'hypercube (c'est-à-dire que vous oubliez x+y+z=1), puis normaliser le point d'échantillonnage. La normalisation est une projection du hypercube au d - 1- simplex. Il devrait être intuitivement clair que les points au centre du simplex ont plus de "points de pré-image" qu'à l' extérieurdd1. Par conséquent, si vous échantillonnez uniformément à partir de l'hypercube, cela ne vous donnera pas un échantillonnage uniforme dans le simplex. Cependant, si vous échantillonnez à partir de l'hypercube avec une distribution exponentielle appropriée, cet effet s'annule. La figure vous donne une idée de la façon dont les deux méthodes seront échantillonnées. Cependant, je préfère la méthode de "tri" en raison de sa forme simple. Il est également plus facile à mettre en œuvre.

Exemple des 2 méthodes d'échantillonnage

A.Schulz
la source
n(0,1)
J'ai répondu à votre question dans la réponse détaillée.
A.Schulz
1
Existe-t-il une preuve simple qui montre que le tri donne une distribution uniforme? Je n'ai qu'une formation élémentaire en probabilité donc le papier est au-dessus de ma tête.
Chao Xu
5
n(0,1)nn1(0,1)
1
@Orient: Veuillez vous poser des questions dans un article séparé et ne pas abuser des commentaires pour cela.
A.Schulz
8

Il s'agit d'ajouter aux réponses existantes.

Devroye est une excellente référence pour des questions de ce genre. Le chapitre 7 donne les algorithmes nécessaires pour générer des statistiques d'ordre uniforme, que l'OP recherche.

n[0,1]O(nlogn)nx1,,xnExp(1)

(yi)1in=1ixj1nxj
O(n)

[0,1]2x+3y+z=5

PKG
la source
Si je suis la réponse ici: stackoverflow.com/questions/2106503/… Ensuite, générer un nombre aléatoire à partir d'une distribution exponentielle implique d'évaluer le logarithme, qui peut être un peu lent.
R zu
3
X[0] = 0
for i = 1 to N-1
    X[i] = uniform(0,1)
X[n] = 1
sort X[0..N]
for i = 1 to N
    Z[i] = X[i] - X[i-1]
return Z[1..N]

Ici, uniform(0,1)renvoie un nombre réel indépendamment et uniformément réparti entre 0 et 1.

JeffE
la source
5
C'est la réponse d'A. Schulz dans le code sans l'explication, non?
Raphael
1

Voir cet article : Smith, N. et Tromble, R., échantillonnage uniforme à partir de l'unité simplex .

Alec
la source
2
Veuillez formater votre réponse de manière lisible: vous écrivez pour les êtres humains, pas pour le compilateur bibtex. De plus, si le document est disponible en ligne, il est beaucoup plus efficace de fournir un lien.
David Richerby