Amostragem uniforme de um simplex


29

Estou procurando um algoritmo para gerar uma matriz de N números aleatórios, de modo que a soma dos N números seja 1 e todos os números estejam entre 0 e 1. Por exemplo, N = 3, o ponto aleatório (x, y, z) deve estar dentro do triângulo:

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

Idealmente, quero que cada ponto dentro da área tenha igual probabilidade. Se for muito difícil, posso cancelar o requisito. Obrigado.


Qual é a distribuição de destino? O que você tentou?
Raphael

3
Observe que sempre há uma amostra de rejeição : faça uma amostra de números uniformes e rejeite se os números não somarem 1 . Aqui, o número esperado de iterações é desconfortavelmente alto, portanto, você deve fazer outra coisa. n1
Raphael

Respostas:


28

Vamos primeiro assumir que você deseja provar dentro de

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

Isso não faz muita diferença, pois o ponto de amostra ainda estará na área solicitada com alta probabilidade.

Agora você fica com a amostragem de um ponto a partir de um simplex . No exemplo 3d, você obtém um 2d simplex (triângulo) realizado em 3d.

Como escolher um ponto uniformemente aleatoriamente foi discutido neste post do blog (veja os comentários).

n1(0,1)01n+1n1

n=40.4 0.2 0.10 0.1 0.2 0.4 10.1 0.1 0.2 0.6

x+y+z=1dd1. Portanto, se você fizer uma amostragem uniforme do hipercubo, isso não fornecerá uma amostra uniforme no simplex. No entanto, se você fizer uma amostra do hipercubo com uma distribuição exponencial apropriada, esse efeito será cancelado. A Figura fornece uma idéia de como os dois métodos serão amostrados. No entanto, prefiro o método de "classificação" devido à sua forma simples. Também é mais fácil de implementar.

Exemplo dos 2 métodos de amostragem


n(0,1)

Abordei sua pergunta na resposta estendida.
A.Schulz

11
Existe uma prova simples que mostre que a classificação dá uma distribuição uniforme? Eu tenho apenas antecedentes elementares em probabilidade, portanto o papel está acima da minha cabeça.
Chao Xu

5
n(0,1)nn1(0,1)

11
@Orient: Por favor, faça perguntas em um post separado e não abuse dos comentários.
A.Schulz

8

Isso é para adicionar às respostas existentes.

Devroye é uma excelente referência para perguntas desse tipo. A Cap.7 fornece os algoritmos necessários para gerar estatísticas uniformes de ordem, das quais o OP está atrás.

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

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

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


Se eu seguir a resposta aqui: stackoverflow.com/questions/2106503/… A geração de números aleatórios a partir da distribuição exponencial envolve a avaliação do logaritmo, que pode ser um pouco 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]

Aqui, uniform(0,1)retorna um número real independentemente e uniformemente distribuído entre 0 e 1.


5
Esta é a resposta de A. Schulz em código sem a explicação, certo?
Raphael

1

Veja este artigo : Smith, N. e Tromble, R., Amostragem uniformemente a partir da unidade simplex .


2
Formate sua resposta de forma legível: você está escrevendo para seres humanos, não para o compilador bibtex. Além disso, se o documento estiver disponível online, é muito mais eficiente fornecer um link.
David Richerby
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.