Matriz de Dirichlet transformada con rango [-1,1] en numpy
Un vector aleatorio muestreado de la distribución de Dirichlet contiene valores que caen en el dominio [0,1] y suman 1 . En numpy se puede programar así para un tamaño de vector de 5:
x = numpy.random.dirichlet(np.ones(5))
En cambio, me gustaría un vector aleatorio que contiene valores que son [-1,1] y suman 1 , que me dijeron que se puede lograr transformando el xvector generado por Dirichlet comoy = 2x -1
A continuación se muestra un intento de esta transformación. Sin embargo, el script no funciona correctamente porque yno suma 1 según sea necesario. ¿Cómo se puede arreglar, o puede ser que y = 2x -1no se haga lo que dijeron?
x = numpy.random.dirichlet(np.ones(5))
y = 2*x -1
print(x, np.sum(x))
print(y, np.sum(y))
que salidas:
[0.0209344 0.44791586 0.21002354 0.04107336 0.28005284] 1.0
[-0.9581312 -0.10416828 -0.57995291 -0.91785327 -0.43989433] -3.0000000000000004
Respuestas
Prueba y=1/(dimension/3)-2*x. Eso funcionó para mí.
La cuestión es que el intervalo [0, 1]puede tener uno y el único mapa lineal al intervalo, [-1, 1]que en realidad es un mapa x -> 2x - 1. Pero no puede garantizar que su suma sea estable. Una razón se puede ver en estas observaciones:
np.sum(x)
0.9999999999999999
np.sum(2*x)
1.9999999999999998
np.sum(2*x-1)
-3.0
Como puede ver, la última suma no disminuye en 1 como se esperaba. En realidad, disminuye en 5 porque cada uno de los 5 elementos se redujo en 1.
Como una de las respuestas en stats.stackexchange explica: sólo hay una forma en que puede asignar las variables de una distribución de Dirichlet a [-1,1] , mientras que mantener la suma igual a 1. Esto es cuando la dimensión es 3 y cuando usas y = 1-2x
import numpy
numpy.random.seed(seed = 1)
x = numpy.random.dirichlet(alpha = numpy.ones(3), size = 1)
y = 1-2*x
print(x, numpy.sum(x))
print(y, numpy.sum(y))
que imprime:
[[2.97492728e-01 7.02444212e-01 6.30601451e-05]] 1.0000000000000002
[[0.40501454 -0.40488842 0.99987388]] 0.9999999999999998