random_state für Zufallsvariable

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
schuesra
User
Beiträge: 26
Registriert: Donnerstag 4. Oktober 2018, 17:40

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])
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@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]]])
schuesra
User
Beiträge: 26
Registriert: Donnerstag 4. Oktober 2018, 17:40

@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?
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@schuesra: Wenn du dich auf `In[58]` beziehst: Wenn alle Werte verschieden sind, kannst du `q` natürlich nicht mehr per Listenmultiplikation erzeugen.
schuesra
User
Beiträge: 26
Registriert: Donnerstag 4. Oktober 2018, 17:40

@narpfel: Konnte es jetzt richtig nachvollziehen, vielen Dank für deine Hilfe! :)
Antworten