Tableau de Dirichlet transformé avec la plage [-1,1] dans numpy
Un vecteur aléatoire échantillonné à partir de la distribution de Dirichlet contient des valeurs qui tombent dans le domaine [0,1] et dont la somme est égale à 1 . Dans numpy, il peut être programmé comme ceci pour une taille de vecteur de 5:
x = numpy.random.dirichlet(np.ones(5))
Au lieu de cela, je voudrais un vecteur aléatoire qui contient des valeurs qui sont [-1,1] et somme à 1 , ce qui m'a dit peut être réalisé en transformant le produit Dirichlet xvecteury = 2x -1
Voici une tentative de cette transformation. Cependant, le script ne fonctionne pas correctement car yil ne fait pas la somme de 1 selon les besoins. Comment peut-il être corrigé, ou est-ce que y = 2x -1cela ne fait pas ce qu'ils ont dit?
x = numpy.random.dirichlet(np.ones(5))
y = 2*x -1
print(x, np.sum(x))
print(y, np.sum(y))
qui sort:
[0.0209344 0.44791586 0.21002354 0.04107336 0.28005284] 1.0
[-0.9581312 -0.10416828 -0.57995291 -0.91785327 -0.43989433] -3.0000000000000004
Réponses
Essayez y=1/(dimension/3)-2*x. Cela a fonctionné pour moi.
Le fait est que l'intervalle [0, 1]peut avoir une et la seule carte linéaire d'intervalle [-1, 1]qui est en fait une carte x -> 2x - 1. Mais cela ne peut garantir que votre somme sera stable. Une raison peut être vue dans ces observations:
np.sum(x)
0.9999999999999999
np.sum(2*x)
1.9999999999999998
np.sum(2*x-1)
-3.0
Comme vous pouvez le voir, la dernière somme ne diminue pas de 1 comme prévu. Il diminue en fait de 5 car chacun des 5 éléments a été diminué de 1.
Comme l'explique l'une des réponses sur stats.stackexchange: il n'y a qu'une seule façon de mapper les variables d'une distribution de Dirichlet à [-1,1] tout en gardant la somme égale à 1. C'est quand la dimension est 3 et quand vous utilisez 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))
qui imprime:
[[2.97492728e-01 7.02444212e-01 6.30601451e-05]] 1.0000000000000002
[[0.40501454 -0.40488842 0.99987388]] 0.9999999999999998