495 Stimmen

Was macht numpy.random.seed(0)?

Was macht np.random.seed?

np.random.seed(0)

854voto

John1024 Punkte 110079

np.random.seed(0) macht die Zufallszahlen vorhersagbar

>>> numpy.random.seed(0) ; numpy.random.rand(4)
array([ 0.55,  0.72,  0.6 ,  0.54])
>>> numpy.random.seed(0) ; numpy.random.rand(4)
array([ 0.55,  0.72,  0.6 ,  0.54])

Wenn der Seed jedes Mal zurückgesetzt wird, erscheint jedes Mal die gleiche Reihe von Zahlen.

Wenn der Zufalls-Seed nicht zurückgesetzt wird, erscheinen bei jeder Ausführung verschiedene Zahlen:

>>> numpy.random.rand(4)
array([ 0.42,  0.65,  0.44,  0.89])
>>> numpy.random.rand(4)
array([ 0.96,  0.38,  0.79,  0.53])

(Pseudo-)Zufallszahlen funktionieren, indem sie mit einer Zahl (dem Seed) starten, diese Zahl mit einer großen Zahl multiplizieren, einen Offset hinzufügen und dann den Modulo dieser Summe nehmen. Die resultierende Zahl wird dann als Seed verwendet, um die nächste "zufällige" Zahl zu generieren. Wenn Sie den Seed setzen (jedes Mal), führt er jedes Mal dasselbe aus und gibt Ihnen dieselben Zahlen.

Wenn Sie scheinbar zufällige Zahlen möchten, setzen Sie nicht den Seed. Wenn Sie jedoch Code haben, der Zufallszahlen verwendet, den Sie debuggen möchten, kann es sehr hilfreich sein, den Seed vor jedem Lauf zu setzen, damit der Code jedes Mal dasselbe tut, wenn Sie ihn ausführen.

Um die meisten Zufallszahlen für jeden Lauf zu erhalten, rufen Sie numpy.random.seed() auf. Hier wird numpy veranlassen, den Seed auf eine zufällige Zahl aus /dev/urandom oder seinem Windows-Analogon zu setzen, oder wenn keines von beiden verfügbar ist, wird es die Uhrzeit verwenden.

Weitere Informationen zur Verwendung von Seeds zur Generierung von Pseudo-Zufallszahlen finden Sie unter Wikipedia.

73voto

Zhun Chen Punkte 847

Wenn Sie np.random.seed(a_fixed_number) setzen, wird jedes Mal, wenn Sie eine andere Zufallsfunktion von numpy aufrufen, das Ergebnis dasselbe sein:

>>> import numpy as np
>>> np.random.seed(0) 
>>> perm = np.random.permutation(10) 
>>> print perm 
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0) 
>>> print np.random.permutation(10) 
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0) 
>>> print np.random.permutation(10) 
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0) 
>>> print np.random.permutation(10) 
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0) 
>>> print np.random.rand(4) 
[0.5488135  0.71518937 0.60276338 0.54488318]
>>> np.random.seed(0) 
>>> print np.random.rand(4) 
[0.5488135  0.71518937 0.60276338 0.54488318]

Wenn Sie es jedoch nur einmal aufrufen und verschiedene Zufallsfunktionen verwenden, werden die Ergebnisse immer noch unterschiedlich sein:

>>> import numpy as np
>>> np.random.seed(0) 
>>> perm = np.random.permutation(10)
>>> print perm 
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0) 
>>> print np.random.permutation(10)
[2 8 4 9 1 6 7 3 0 5]
>>> print np.random.permutation(10) 
[3 5 1 2 9 8 0 6 7 4]
>>> print np.random.permutation(10) 
[2 3 8 4 5 1 0 6 9 7]
>>> print np.random.rand(4) 
[0.64817187 0.36824154 0.95715516 0.14035078]
>>> print np.random.rand(4) 
[0.87008726 0.47360805 0.80091075 0.52047748]

23voto

ntg Punkte 10508

Wie bereits erwähnt, setzt numpy.random.seed(0) den Zufallsstartwert auf 0, sodass die Pseudo-Zufallszahlen, die Sie von random erhalten, von demselben Punkt aus starten. Dies kann in einigen Fällen gut für Debugging-Zwecke sein. JEDOCH scheint dies nach einigen Recherchen der falsche Ansatz zu sein, wenn Sie Threads haben, da es nicht thread-sicher ist.

von differences-between-numpy-random-and-random-random-in-python:

Bei numpy.random.seed() liegt die Hauptschwierigkeit darin, dass es nicht threadsicher ist - das heißt, es ist nicht sicher zu verwenden, wenn Sie viele verschiedene Ausführungsstränge haben, weil es nicht garantiert ist, dass es funktioniert, wenn zwei verschiedene Stränge gleichzeitig die Funktion ausführen. Wenn Sie keine Threads verwenden und vernünftigerweise erwarten können, dass Sie Ihr Programm nicht auf diese Weise neu schreiben müssen, sollte numpy.random.seed() für Testzwecke in Ordnung sein. Wenn es einen Grund gibt zu vermuten, dass Sie in Zukunft Threads benötigen könnten, ist es auf lange Sicht viel sicherer, wie vorgeschlagen zu arbeiten und eine lokale Instanz der numpy.random.Random-Klasse zu erstellen. Soweit ich das beurteilen kann, ist random.random.seed() threadsicher (oder zumindest habe ich keinen Gegenbeweis gefunden).

Beispiel, wie Sie dies angehen können:

from numpy.random import RandomState
prng = RandomState()
print prng.permutation(10)
prng = RandomState()
print prng.permutation(10)
prng = RandomState(42)
print prng.permutation(10)
prng = RandomState(42)
print prng.permutation(10)

könnte geben:

[3 0 4 6 8 2 1 9 7 5]

[1 6 9 0 2 7 8 3 5 4]

[8 1 5 0 7 2 9 4 3 6]

[8 1 5 0 7 2 9 4 3 6]

Zuletzt sei darauf hingewiesen, dass es Fälle geben könnte, in denen die Initialisierung auf 0 (im Gegensatz zu einem Startwert, bei dem nicht alle Bits 0 sind) aufgrund der Arbeitsweise von XOR für einige wenige erste Iterationen zu ungleichmäßigen Verteilungen führen kann, aber dies hängt vom Algorithmus ab und geht über meine aktuellen Sorgen und den Rahmen dieser Frage hinaus.

20voto

A Santosh Punkte 839

Ich habe dies sehr oft in neuronalen Netzwerken verwendet. Es ist bekannt, dass wenn wir mit dem Training eines neuronalen Netzwerks beginnen, die Gewichte zufällig initialisiert werden. Das Modell wird auf diesen Gewichten auf einem bestimmten Datensatz trainiert. Nach einer bestimmten Anzahl von Epochen erhält man ein trainiertes Set von Gewichten.

Angenommen, Sie möchten erneut von Grund auf trainieren oder das Modell anderen zur Reproduktion Ihrer Ergebnisse übergeben, dann werden die Gewichte erneut auf zufällige Zahlen initialisiert, die größtenteils von den vorherigen abweichen werden. Die erhaltenen trainierten Gewichte nach derselben Anzahl von Epochen (bei Beibehaltung der gleichen Daten und anderer Parameter) wie zuvor werden sich unterscheiden. Das Problem ist, dass Ihr Modell nicht mehr reproduzierbar ist, das heißt, jedes Mal, wenn Sie Ihr Modell von Grund auf trainieren, erhalten Sie unterschiedliche Gewichtssätze. Dies liegt daran, dass das Modell jedes Mal mit verschiedenen Zufallszahlen initialisiert wird.

Was wäre, wenn das Modell jedes Mal, wenn Sie von Grund auf mit dem Training beginnen, mit demselben Satz zufällig initialisierter Gewichte initialisiert würde? In diesem Fall könnte Ihr Modell reproduzierbar werden. Dies wird durch numpy.random.seed(0) erreicht. Wenn Sie seed() auf eine bestimmte Zahl festlegen, verwenden Sie immer denselben Satz von Zufallszahlen.

14voto

RobotCharlie Punkte 1015

Ich hoffe, eine wirklich kurze Antwort zu geben:

seed macht (die nächste Serie) Zufallszahlen vorhersehbar. Sie können sich jedes Mal, nachdem Sie seed aufgerufen haben, vorstellen, dass es die Seriennummern vordefiniert und numpy random den Iterator davon beibehält, sodass jedes Mal, wenn Sie eine Zufallszahl erhalten, sie einfach die nächste abruft.

z.B.:

np.random.seed(2)
np.random.randn(2) # array([-0.41675785, -0.05626683])
np.random.randn(1) # array([-1.24528809])

np.random.seed(2)
np.random.randn(1) # array([-0.41675785])
np.random.randn(2) # array([-0.05626683, -1.24528809])

Sie können bemerken, dass immer wenn ich denselben Seed setze, egal wie viele Zufallszahlen Sie jedes Mal von numpy anfordern, es immer die gleiche Serie von Zahlen liefert, in diesem Fall array([-0.41675785, -0.05626683, -1.24528809]).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X