Transformiertes Dirichlet-Array mit Bereich [-1,1] in numpy

Sep 15 2020

Ein Zufallsvektor aus der Dirichlet-Verteilung enthält Werte, die in die Domäne [0,1] fallen und sich zu 1 summieren . In numpy kann es so für eine Vektorgröße von 5 programmiert werden:

x = numpy.random.dirichlet(np.ones(5))

Stattdessen würde ich einen Zufallsvektor dergleichen , die Werte enthält, die [-1,1] und die Summe auf 1 , die mir gesagt wurde , kann durch Transformieren der erzeugten Dirichlet erreicht werden , xVektor , wiey = 2x -1

Unten ist ein Versuch dieser Transformation. Das Skript funktioniert jedoch nicht richtig, da yes bei Bedarf nicht 1 ergibt. Wie kann es behoben werden oder könnte es sein, dass y = 2x -1es nicht das tut, was sie gesagt haben?

x = numpy.random.dirichlet(np.ones(5))
y = 2*x -1
print(x, np.sum(x))
print(y, np.sum(y))

welche Ausgänge:

[0.0209344  0.44791586 0.21002354 0.04107336 0.28005284] 1.0
[-0.9581312  -0.10416828 -0.57995291 -0.91785327 -0.43989433] -3.0000000000000004

Antworten

1 Charlie Nov 03 2020 at 04:19

Versuchen Sie es y=1/(dimension/3)-2*x. Das hat bei mir funktioniert.

3 mathfux Sep 15 2020 at 23:11

Die Sache ist, dass das Intervall [0, 1]eine und die einzige lineare Karte zu Intervall haben kann, [-1, 1]die tatsächlich eine Karte ist x -> 2x - 1. Es kann jedoch nicht garantiert werden, dass Ihre Summe stabil bleibt. Ein Grund kann in diesen Beobachtungen gesehen werden:

np.sum(x)
0.9999999999999999
np.sum(2*x)
1.9999999999999998
np.sum(2*x-1)
-3.0

Wie Sie sehen können, verringert sich die letzte Summe nicht wie erwartet um 1. Es verringert sich tatsächlich um 5, da jedes der 5 Elemente um 1 verringert wurde.

1 SextusEmpiricus Sep 16 2020 at 07:09

Wie eine der Antworten auf stats.stackexchange erklärt: Es gibt nur eine Möglichkeit, die Variablen einer Dirichlet-Verteilung auf [-1,1] abzubilden, während die Summe gleich 1 bleibt. Dies ist, wenn die Dimension 3 ist und wann Sie verwenden 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))

welche druckt:

[[2.97492728e-01 7.02444212e-01 6.30601451e-05]] 1.0000000000000002
[[0.40501454 -0.40488842  0.99987388]] 0.9999999999999998