Campionamento uniforme da un simplex


29

Sto cercando un algoritmo per generare un array di N numeri casuali, in modo tale che la somma degli N numeri sia 1 e tutti i numeri siano compresi tra 0 e 1. Ad esempio, N = 3, il punto casuale (x, y, z) dovrebbe trovarsi all'interno del triangolo:

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

Idealmente, voglio che ogni punto all'interno dell'area abbia la stessa probabilità. Se è troppo difficile, posso eliminare il requisito. Grazie.


Qual è la distribuzione target? Che cosa hai provato?
Raffaello

3
Si noti che esiste sempre un campionamento del rifiuto : campionare numeri uniformi e rifiutare se i numeri non si sommano a 1 . Qui, il numero previsto di iterazioni è scomodo, quindi dovresti fare qualcos'altro. n1
Raffaello

Risposte:


28

Supponiamo innanzitutto che tu voglia campionare all'interno

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

Ciò non fa alcuna differenza, dal momento che il punto di campionamento si troverà ancora nell'area richiesta con alta probabilità.

Ora ti resta il campionamento di un punto da un simplex . Nell'esempio 3d si ottiene un simplex 2d (triangolo) realizzato in 3d.

Come scegliere un punto uniformemente a caso è stato discusso in questo post del blog (vedere i commenti).

Per il tuo problema significherebbe che prendi n1 numeri casuali dall'intervallo , quindi aggiungi 0 e 1 per ottenere un elenco di n + 1 numeri. Si ordina l'elenco e quindi si registrano le differenze tra due elementi consecutivi. Questo ti dà un elenco di n numeri che somma fino a 1 . Inoltre questo campionamento è uniforme. Questa idea può essere trovata in Donald B. Rubin, il bootstrap bayesiano Ann. Statist. 9, 1981, 130-134.(0,1)01n+1n1

Ad esempio ( ) hai i tre numeri casuali, quindi ottieni la sequenza ordinata e questo dà le differenze , e per costruzione questi quattro numeri si sommano a 1.n=40.4 0.2 0.10 0.1 0.2 0.4 10.1 0.1 0.2 0.6

Un altro approccio è il seguente: primo campione dall'ipercubo (ovvero che ti dimentichi x+y+z=1) e poi normalizza il punto di campionamento. La normalizzazione è una proiezione dal -percubo al d - 1 -implex. Dovrebbe essere intuitivamente chiaro che i punti al centro del simplex hanno più "punti pre-immagine" che all'esternodd1. Quindi, se campionate uniformemente dall'ipercubo, questo non vi darà un campionamento uniforme nel simplex. Tuttavia, se si campiona dall'ipercubo con una distribuzione esponenziale appropriata, questo effetto annulla. La figura ti dà un'idea di come verranno campionati entrambi i metodi. Tuttavia, preferisco il metodo di "ordinamento" per la sua forma semplice. È anche più facile da implementare.

Esempio dei 2 metodi di campionamento


Immagino che l'idea ingenua - disegnare numeri da ( 0 , 1 ) e normalizzare - sia difettosa, quindi. n(0,1)
Raffaello

Ho risposto alla tua domanda nella risposta estesa.
A. Schulz,

1
Esiste una semplice prova che mostra che l'ordinamento fornisce una distribuzione uniforme? Ho solo uno sfondo elementare in probabilità, quindi il foglio è sopra la mia testa.
Chao Xu,

5
@ChaoXu osserva solo che esiste una corrispondenza 1 a 1 tra numeri nel simplex e partizioni dell'intervallo ( 0 , 1 ) in n sottointervalli. l'algoritmo di campionamento corrisponde al "lancio" di n - 1 "intervalli di intervallo" casualin(0,1)nn1(0,1)

1
@Oriente: ti preghiamo di porre domande in un post separato e di non abusare dei commenti per questo.
A.Schulz,

8

Questo da aggiungere alle risposte esistenti.

Devroye è un riferimento eccellente per domande di questo tipo. Il capitolo 7 fornisce gli algoritmi necessari per generare statistiche di ordine uniformi, a cui l'OP sta cercando.

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

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

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


Se seguo la risposta qui: stackoverflow.com/questions/2106503/… Quindi la generazione di un numero casuale dalla distribuzione esponenziale comporta la valutazione del logaritmo, che può essere un po 'lento.
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]

Qui, uniform(0,1)restituisce un numero reale distribuito in modo indipendente e uniforme tra 0 e 1.


5
Questa è la risposta di A. Schulz in codice senza la spiegazione, giusto?
Raffaello

1

Vedi questo documento : Smith, N. e Tromble, R., campionando uniformemente dall'unità simplex .


2
Per favore formatta la tua risposta in modo leggibile: stai scrivendo per gli esseri umani, non per il compilatore bibtex. Inoltre, se il documento è disponibile online, è molto più efficiente fornire un collegamento.
David Richerby,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.