Seite 1 von 1

random_state für Zufallsvariable

Verfasst: Dienstag 23. Oktober 2018, 16:46
von schuesra
Gerne würde ich in jedem Simulationsdurchlauf die gleichen Bernoulli Zahlen erstellen. Wenn ich alleridngs mit random_state= x als Argument
hinzufüge, wird schon innerhalb einer Simulation die gleiche Zufallszahl erstellt und das will ich nicht. Wie bekomme ich es in meinem Fall hin, dass innerhalb eines Simulationslaufs verschiedene Zufallszahlen erstellt werden und zur Überprüfbarkeit der Ergebnisse alle Simulationsläufe die gleichen Zahlen generieren. Hier der Code:
#Produkte
produkte = np.arange(12)
#Perioden
perioden = np.arange(10)
#number of runs
nRuns = 5
#Array q
q = np.array([ [0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9] ])

s = np.ones((nRuns,len(perioden),len(produkte)),dtype=np.int32)

for c in range(nRuns):
for t in perioden:
for j in produkte:
s[c, t, j] = bernoulli.rvs(q[t,j])

Re: random_state für Zufallsvariable

Verfasst: Dienstag 23. Oktober 2018, 18:33
von narpfel
@schuesra: Wenn du bei jedem `bernoulli.rvs`-Aufruf den selben Seed verwendest, dann ist es doch logisch, dass immer die selbe Zahl generiert wird, oder?

Du darfst den Seed nur einmal auf einen beliebigen Wert setzen.

Deinen Code kann man auch kürzer schreiben, indem man `bernoulli.rvs` gleich die richtige Shape mitgibt, in der die Zahlen generiert werden sollen. Generell gilt bei NumPy, dass selbst geschriebene Schleifen praktisch immer nicht der richtige Weg sind. Und `q` kann auch einfacher generiert werden als alle Zahlen manuell zu schreiben:

Code: Alles auswählen

In [19]: paste
q = np.array([ [0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9] ])

## -- End pasted text --

In [21]: n_runs = 5

In [47]: s1 = bernoulli.rvs(q, size=(n_runs, *q.shape), random_state=42)

In [48]: s2 = bernoulli.rvs(q, size=(n_runs, *q.shape), random_state=42)

In [49]: (s1 == s2).all()
Out[49]: True

In [50]: s1.shape
Out[50]: (5, 10, 12)

In [58]: (q == np.array([[.7, .9] * 6] * 10)).all()
Out[58]: True
Oder möchtest du in `s` fünfmal die selben Zufallszahlen haben? Dann suchst du vielleicht `np.broadcast_to`:

Code: Alles auswählen

In [122]: a
Out[122]:
array([[1, 2],
       [3, 4]])

In [123]: np.broadcast_to(a, (5, *a.shape))
Out[123]:
array([[[1, 2],
        [3, 4]],

       [[1, 2],
        [3, 4]],

       [[1, 2],
        [3, 4]],

       [[1, 2],
        [3, 4]],

       [[1, 2],
        [3, 4]]])

Re: random_state für Zufallsvariable

Verfasst: Dienstag 23. Oktober 2018, 20:34
von schuesra
@narpfel: Das Problem ist, dass das nur für diese spezielle Matrix 'q' funktioniert. Angenommen alle Zahlen in 'q' sind verschieden, dann kann ich das doch so nicht mehr machen? Verstehst du was ich meine?

Re: random_state für Zufallsvariable

Verfasst: Dienstag 23. Oktober 2018, 20:50
von narpfel
@schuesra: Wenn du dich auf `In[58]` beziehst: Wenn alle Werte verschieden sind, kannst du `q` natürlich nicht mehr per Listenmultiplikation erzeugen.

Re: random_state für Zufallsvariable

Verfasst: Mittwoch 24. Oktober 2018, 10:09
von schuesra
@narpfel: Konnte es jetzt richtig nachvollziehen, vielen Dank für deine Hilfe! :)