Array di Dirichlet trasformato con intervallo [-1,1] in numpy
Un vettore casuale campionato dalla distribuzione di Dirichlet contiene valori che cadono nel dominio [0,1] e si sommano a 1 . In numpy può essere programmato in questo modo per una dimensione vettoriale di 5:
x = numpy.random.dirichlet(np.ones(5))
Invece, vorrei un vettore casuale che contenga valori che sono [-1,1] e somma a 1 , che mi è stato detto può essere ottenuto trasformando il xvettore generato da Dirichlet comey = 2x -1
Di seguito è riportato un tentativo di questa trasformazione. Lo script tuttavia non funziona correttamente perché ynon somma a 1 se necessario. Come può essere risolto, o potrebbe essere che y = 2x -1non fa quello che hanno detto?
x = numpy.random.dirichlet(np.ones(5))
y = 2*x -1
print(x, np.sum(x))
print(y, np.sum(y))
quali uscite:
[0.0209344 0.44791586 0.21002354 0.04107336 0.28005284] 1.0
[-0.9581312 -0.10416828 -0.57995291 -0.91785327 -0.43989433] -3.0000000000000004
Risposte
Prova y=1/(dimension/3)-2*x. Ha funzionato per me.
Il fatto è che l'intervallo [0, 1]può avere una e l'unica mappa lineare dell'intervallo [-1, 1]che in realtà è una mappa x -> 2x - 1. Ma non può garantire che la tua somma sia stabile. Una ragione può essere vista in queste osservazioni:
np.sum(x)
0.9999999999999999
np.sum(2*x)
1.9999999999999998
np.sum(2*x-1)
-3.0
Come puoi vedere, l'ultima somma non diminuisce di 1 come previsto. In realtà diminuisce di 5 perché ognuno di 5 elementi è stato ridotto di 1.
Come una delle risposte su stats.stackexchange spiega: c'è solo un modo che è possibile mappare le variabili di una distribuzione di Dirichlet a [-1,1] , mentre mantenendo la somma uguale a 1. Questo è quando la dimensione è 3 e quando usi 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))
che stampa:
[[2.97492728e-01 7.02444212e-01 6.30601451e-05]] 1.0000000000000002
[[0.40501454 -0.40488842 0.99987388]] 0.9999999999999998