19 votos

¿Generar pesos distribuidos uniformemente que sumen a la unidad?

Es común utilizar pesos en aplicaciones como el modelado de mezclas y combinar linealmente funciones de base. Los pesos $w_i$ a menudo deben obedecer $w_i \geq 0$ y $\sum_{i} w_i = 1$. Me gustaría elegir al azar un vector de pesos $\mathbf{w} = (w_1, w_2, …)$ de una distribución uniforme de tales vectores.

Puede ser tentador usar $w_i = \frac{\omega_i}{\sum_{j} \omega_j}$ donde $\omega_i \sim$ U(0, 1), sin embargo, como se discute en los comentarios a continuación, la distribución de $\mathbf{w}$ no es uniforme.

Sin embargo, dado el constraint $\sum_{i} w_i=1$, parece que la dimensionalidad subyacente del problema es $n-1$, y debería ser posible elegir un $\mathbf{w}$ eligiendo $n-1$ parámetros según alguna distribución y luego calculando el $\mathbf{w}$ correspondiente a partir de esos parámetros (porque una vez que se especifican $n-1$ de los pesos, el peso restante está completamente determinado).

El problema parece ser similar al problema de selección de puntos en una esfera (pero, en lugar de elegir vectores tridimensionales cuya norma $_2$ sea unidad, quiero elegir vectores $n$-dimensionales cuya norma $_1$ sea unidad).

¡Gracias!

3 votos

Tu método no genera un vector uniformemente distribuido en el simplex. Para hacer lo que deseas de manera correcta, la forma más directa es generar $n$ variables aleatorias independientes e idénticamente distribuidas $\mathrm{Exp}(1)$ y luego normalizarlas por su suma. Podrías intentar hacerlo encontrando algún otro método para generar solo $n-1$ variables directamente, pero tengo mis dudas sobre el compromiso de eficiencia ya que las variables $\mathrm{Exp}(1)$ pueden generarse muy eficientemente a partir de variables $U(0,1)$.

0 votos

Una cosa interesante a tener en cuenta es que si uno está buscando generar pesos "sesgados" también, la distribución uniforme no funcionará. Desde el espacio $[0, 1]^n$, la probabilidad de obtener un peso sesgado disminuye rápidamente a 0 a medida que $n$ aumenta.

24voto

jldugger Puntos 7490

Elige $\mathbf{x} \in [0,1]^{n-1}$ de manera uniforme (mediante $n-1$ números reales uniformes en el intervalo $[0,1]$). Ordena los coeficientes de manera que $0 \le x_1 \le \cdots \le x_{n-1}$. Define

$$\mathbf{w} = (x_1, x_2-x_1, x_3 - x_2, \ldots, x_{n-1} - x_{n-2}, 1 - x_{n-1}).$$

Ya que podemos recuperar los $x_i$ ordenados mediante las sumas parciales de los $w_i$, la transformación $\mathbf{x} \to \mathbf{w}$ es de $(n-1)!$ a 1; en particular, su imagen es el símplice $n-1$ en $\mathbb{R}^n$. Debido a que (a) cada intercambio en una ordenación es una transformación lineal, (b) la fórmula anterior es lineal y (c) las transformaciones lineales preservan la uniformidad de las distribuciones, la uniformidad de $\mathbf{x}$ implica la uniformidad de $\mathbf{w}$ en el símplice $n-1$. En particular, hay que tener en cuenta que los márgenes de $\mathbf{w}$ no son necesariamente independientes.

Gráfico de puntos 3D

Este gráfico de puntos 3D muestra los resultados de 2000 iteraciones de este algoritmo para $n=3$. Los puntos están confinados al símplice y están distribuidos de manera aproximadamente uniforme sobre él.


Dado que el tiempo de ejecución de este algoritmo es de $O(n \log(n)) \gg O(n)$, es ineficiente para valores grandes de $n$. ¡Pero esto responde la pregunta! Una mejor manera (en general) de generar valores distribuidos de manera uniforme en el símplice $n-1$ es elegir $n$ números reales uniformes $(x_1, \ldots, x_n)$ en el intervalo $[0,1]$, y computar

$$y_i = -\log(x_i)$$

(lo cual hace que cada $y_i$ sea positivo con probabilidad $1$, por lo tanto su suma es casi seguramente distinta de cero) y definir

$$\mathbf w = (y_1, y_2, \ldots, y_n) / (y_1 + y_2 + \cdots + y_n).$$

Esto funciona porque cada $y_i$ tiene una distribución $\Gamma(1)$, lo que implica que $\mathbf w$ tiene una distribución Dirichlet$(1,1,1)$ - y eso es uniforme.

[Gráfico de puntos 3D 2]

0 votos

¿Es este un algoritmo para muestrear de Dir(1)?

1 votos

@Chris Si por "Dir(1)" te refieres a la distribución de Dirichlet con parámetros $(\alpha_1, \ldots, \alpha_n) = (1,1,\ldots,1)$, entonces la respuesta es sí.

1 votos

(+1) Un comentario menor: la intuición es excelente. Puede ser necesario tener cuidado al interpretar el a, ya que parece que la "transformación lineal" en esa parte es una aleatoria. Sin embargo, esto se puede solucionar fácilmente a expensas de mayor formalidad utilizando la intercambiabilidad del proceso generador y una cierta propiedad de invarianza.

1voto

StasK Puntos 19497
    zz <- c(0, log(-log(runif(n-1))))
    ezz <- exp(zz)
    w <- ezz/sum(ezz)

La primera entrada se pone a cero para identificación; verías que se hace en modelos logísticos multinomiales. Por supuesto, en modelos multinomiales, también tendrías covariables bajo los exponentes, en lugar de solo los zz aleatorios. La distribución de los zz es la distribución de valores extremos; necesitarías esto para garantizar que los pesos resultantes sean i.i.d. Inicialmente puse números aleatorios del tipo rnorm allí, pero luego tuve un presentimiento de que esto no iba a funcionar.

0 votos

Eso no funciona. ¿Has intentado mirar un histograma?

0 votos

Entonces, ¿qué deberíamos esperar ver en un histograma? No lo sé, francamente. La distribución de pesos no puede ser U[0,1]. hist(w) es una distribución sesgada, pero eso es inevitable con transformaciones no lineales de i.i.ds.

0 votos

Has editado tu respuesta desde que hice ese comentario.

0voto

tehwalris Puntos 85

La solución es obvia. El siguiente código de MathLab proporciona la respuesta para 3 pesos.

function [  ] = TESTGEN( )
SZ  = 1000;
V  = zeros (1, 3);
VS = zeros (SZ, 3);
for NIT=1:SZ   
   V(1) = rand (1,1);     % generación uniforme en el rango 0..1
   V(2) = rand (1,1) * (1 - V(1));
   V(3) = 1 - V(1) - V(2);  
   PERM = randperm (3);    % permutación aleatoria de los valores 1,2,3
   for NID=1:3
         VS (NIT, NID) = V (PERM(NID));
    end
end 
figure;
scatter3 (VS(:, 1), VS(:,2), VS (:,3));
end

introduce la descripción de la imagen aquí

1 votos

Tus marginales no tienen la distribución correcta. A juzgar por el artículo de Wikipedia sobre la distribución de Dirichlet (sección de generación de números aleatorios, que tiene el algoritmo que has codificado), deberías estar usando una distribución beta(1,2) para V(1), no una distribución uniforme[0,1].

1 votos

Parece que la densidad aumenta en las esquinas de este triángulo inclinado. No obstante, proporciona una bonita representación geométrica del problema.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X