Unterschied zwischen np.random.seed () und np.random.RandomState ()

76

Ich weiß, dass ich, um die Zufälligkeit von numpy.random zu säen und sie reproduzieren zu können, Folgendes tun sollte:

import numpy as np
np.random.seed(1234)

aber was macht np.random.RandomState() das

eran
quelle
1
Siehe auch: stackoverflow.com/q/37224116/562769
Martin Thoma
2
Hier ist eine wirklich gute Diskussion: stackoverflow.com/questions/5836335/… Sie müssen wirklich durch die Kommentare stapfen und beachten, dass Robert Kern ein numpy Entwickler ist
JohnE

Antworten:

88

Wenn Sie den Startwert festlegen möchten, zu dem Aufrufe np.random...verwendet werden, verwenden Sie np.random.seed:

np.random.seed(1234)
np.random.uniform(0, 10, 5)
#array([ 1.9151945 ,  6.22108771,  4.37727739,  7.85358584,  7.79975808])
np.random.rand(2,3)
#array([[ 0.27259261,  0.27646426,  0.80187218],
#       [ 0.95813935,  0.87593263,  0.35781727]])

Verwenden Sie die Klasse, um Auswirkungen auf den globalen Numpy-Status zu vermeiden:

r = np.random.RandomState(1234)
r.uniform(0, 10, 5)
#array([ 1.9151945 ,  6.22108771,  4.37727739,  7.85358584,  7.79975808])

Und es hält den Staat wie bisher aufrecht:

r.rand(2,3)
#array([[ 0.27259261,  0.27646426,  0.80187218],
#       [ 0.95813935,  0.87593263,  0.35781727]])

Sie können den Status der Art 'globaler' Klasse mit folgender Adresse anzeigen:

np.random.get_state()

und Ihrer eigenen Klasseninstanz mit:

r.get_state()
askewchan
quelle
2
Ihre Antwort macht Sinn. Aber wie ist die Dokumentation nicht verwirrend? This method is called when RandomState is initialized. It can be called again to re-seed the generator.Es sagt nichts über die Tatsache aus, dass ich beim Aufrufen dieser Methode nur eine globale Instanz (oder was auch immer) und keine der anderen RandomStateInstanzen betroffen habe .
Max
2
Ja, ich stimme zu. In der numpy.randomModuldokumentation sollte klar angegeben sein, dass das Modul effektiv mit einer Instanz von initialisiert wurde RandomState. Aber es gibt überhaupt keine Dokumentation zum Modul selbst, die ich finden kann.
Askewchan
11

np.random.RandomState()erstellt einen Zufallszahlengenerator. Es hat keine Auswirkungen auf die freistehenden Funktionen in np.random, muss aber explizit verwendet werden:

>>> rng = np.random.RandomState(42)
>>> rng.randn(4)
array([ 0.49671415, -0.1382643 ,  0.64768854,  1.52302986])
>>> rng2 = np.random.RandomState(42)
>>> rng2.randn(4)
array([ 0.49671415, -0.1382643 ,  0.64768854,  1.52302986])
Fred Foo
quelle
Wie wirkt es sich auf die freistehenden Funktionen aus? Ich dachte, es würde eine unabhängige Instanz wie in meiner Antwort erstellen.
Askewchan
@askewchan: Tippfehler, ich meinte es nicht nicht irgendeine Wirkung haben.
Fred Foo
8

random.seed ist eine Methode zum Füllen des random.RandomState- Containers.

von numpy docs:

numpy.random.seed(seed=None)

Den Generator aussäen.

Diese Methode wird aufgerufen, wenn RandomState initialisiert wird. Es kann erneut aufgerufen werden, um den Generator neu zu starten. Weitere Informationen finden Sie unter RandomState.

class numpy.random.RandomState

Container für den Pseudozufallszahlengenerator Mersenne Twister.

Bruno Gelb
quelle
1
Wenn ich jedoch RandomState (1234) aufrufe und mit random.uniform () eine Zahl erstelle, sind die Ergebnisse nicht reproduzierbar. Wofür wird ein Container wie RandomState verwendet?
eran
1
@eran Sie wissen, dass Mersenne Twister und Uniform Distribution nicht dasselbe sind? Lesen Sie dies , um mehr darüber zu erfahren, was genau zufällig ist. RandomState , bitte.
Bruno Gelb
1
@eran, eigentlich liegt es daran, dass Sie eine andere Instanz der Klasse erstellen. Sehen Sie meine Antwort, um zu sehen, wie man es benutzt.
Askewchan
1
Vielen Dank! Ich verstehe es jetzt. Ziemlich einfach. Der Dokumentation fehlte nur ein richtiges Beispiel. Oder ich hatte einen Blindspot ...
eran
0

np.random.RandomState () - eine Klasse, die mehrere Methoden basierend auf unterschiedlichen Wahrscheinlichkeitsverteilungen bereitstellt.
np.random.RandomState.seed () - wird aufgerufen, wenn RandomState () initialisiert wird.

Shruti Sharma
quelle
Willkommen bei SO! Vielen Dank für Ihre Zeit bei der Beantwortung dieser Frage. Können Sie bitte weitere Details zu Ihrer Lösung angeben? Warum ist Ihre Lösung beispielsweise besser als die akzeptierte Antwort? Auch die Frage wurde vor 6 Jahren gestellt und beantwortet. Achten Sie bei der Beantwortung auf das Datum der ursprünglichen Frage. Bitte lesen Sie Wie man antwortet .
über_c_level