it-swarm.com.de

Was macht numpy.random.seed (0)?

Was macht np.random.seed im folgenden Code aus einem Scikit-Learn-Tutorial? Ich bin mit dem Zufallsgenerator von NumPy nicht sehr vertraut, daher würde ich die Erklärung eines Laien wirklich schätzen.

np.random.seed(0)
indices = np.random.permutation(len(iris_X))
139
covariance

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

>>> 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 Startwert (jedes Mal) zurückgesetzt wird, erscheint jedes Mal der Zahlensatz same.

Wenn der Zufallsstartwert nicht zurückgesetzt wird, erscheinen bei jedem Aufruf different - Nummern:

>>> 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 Startwert) beginnen, sie mit einer großen Zahl multiplizieren und dann das Modulo dieses Produkts verwenden. Die resultierende Zahl wird dann als Startwert verwendet, um die nächste "Zufallszahl" zu erzeugen. Wenn Sie den Startzeitpunkt (jedes Mal) festlegen, führt er jedes Mal dasselbe aus und gibt Ihnen die gleichen Zahlen.

Wenn Sie scheinbar zufällige Zahlen haben möchten, setzen Sie den Samen nicht. Wenn Sie über Code verfügen, der Zufallszahlen verwendet, die Sie debuggen möchten, kann es sehr hilfreich sein, den Startwert vor jedem Lauf so festzulegen, dass der Code bei jeder Ausführung dasselbe tut.

Rufen Sie numpy.random.seed() auf, um die meisten Zufallszahlen für jeden Lauf zu erhalten. Dies bewirkt, dass numpy den Startwert auf eine Zufallszahl setzt, die von /dev/urandom oder seinem Windows-Analogon erhalten wird. Wenn keiner von diesen verfügbar ist, wird die Uhr verwendet.

327
John1024

Wenn Sie die np.random.seed(a_fixed_number) jedes Mal einstellen, wenn Sie die andere Zufallsfunktion des numpys aufrufen, wird 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]
16
Zhun Chen

Wie bereits erwähnt, setzt numpy.random.seed (0) den Zufallsstartwert auf 0, sodass die zufälligen Pseudo-Zufallszahlen am selben Punkt beginnen. Dies kann in einigen Fällen für das Debuggen hilfreich sein. Nach einiger Lektüre scheint dies jedoch der falsche Weg zu sein, wenn Sie Threads haben, weil es nicht threadsicher ist. 

von Unterschiede-zwischen-numpy-random und-random-in-python :

Bei numpy.random.seed () besteht die Hauptschwierigkeit darin, dass es nicht .__ ist. threadsicher - das heißt, es ist nicht sicher, es zu verwenden, wenn Sie viele unterschiedliche Threads der Ausführung, weil es nicht garantiert ist, wenn zwei Verschiedene Threads führen die Funktion gleichzeitig aus. Ob Sie verwenden keine Threads und wenn Sie davon ausgehen können, dass Sie Sie müssen Ihr Programm in Zukunft nicht auf diese Weise neu schreiben, numpy.random.seed () sollte für Testzwecke in Ordnung sein. Wenn es gibt Grund zu der Annahme, dass Sie in Zukunft Threads benötigen, ist es auf lange Sicht viel sicherer, als vorgeschlagen zu machen und eine lokale Instanz der Klasse numpy.random.Random. Soweit ich sagen kann, random.random.seed () ist Thread-sicher (oder zumindest habe ich keine gegenteiligen Beweise gefunden ).

beispiel dafür, wie Sie dies tun 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)

kann 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]

Schließlich sei darauf hingewiesen, dass es Fälle geben kann, in denen eine Initialisierung auf 0 (im Gegensatz zu einem Startwert, der nicht alle Bits 0 aufweist) aufgrund der Funktionsweise von xor für einige erste Iterationen zu ungleichmäßigen Verteilungen führen kann. Dies hängt jedoch vom Algorithmus ab und ist jenseits meiner derzeitigen Sorgen und des Umfangs dieser Frage.

14
ntg

Ich habe dies sehr oft in neuronalen Netzwerken verwendet. Es ist bekannt, dass, wenn wir ein neuronales Netzwerk trainieren, die Gewichte zufällig initialisiert werden. Das Modell wird auf diese Gewichte eines bestimmten Datensatzes trainiert. Nach der Anzahl der Epochen erhalten Sie einen trainierten Gewichtssatz. 

Angenommen, Sie möchten erneut von Grund auf trainieren oder das Modell an andere weitergeben, um Ihre Ergebnisse zu reproduzieren, werden die Gewichtungen erneut mit Zufallszahlen initialisiert, die sich meistens von früheren unterscheiden. Die erhaltenen trainierten Gewichte nach der gleichen Anzahl von Epochen (mit den gleichen Daten und anderen Parametern) wie zuvor werden sich unterscheiden. Das Problem ist, dass Ihr Modell nicht mehr reproduzierbar ist. Jedes Mal, wenn Sie Ihr Modell von Grund auf trainieren, erhalten Sie verschiedene Gewichtssätze. Dies liegt daran, dass das Modell jedes Mal mit unterschiedlichen Zufallszahlen initialisiert wird.

Was ist, wenn jedes Mal, wenn Sie mit dem Training von vorne beginnen, das Modell mit dem gleichen Satz zufälliger Initialisierungsgewichte initialisiert wird? In diesem Fall kann Ihr Modell reproduzierbar werden. Dies wird durch numpy.random.seed (0) erreicht. Indem Sie seed () zu einer bestimmten Nummer erwähnen, hängen Sie immer an der gleichen Menge von Zufallszahlen.

1
A Santosh

Alle nach dem Einstellen eines bestimmten Startwerts generierten Zufallszahlen sind auf allen Plattformen/Systemen gleich.

0
Prashant

Ein zufälliger Startwert gibt den Startpunkt an, wenn ein Computer eine Zufallszahlenfolge generiert.

Angenommen, Sie wollten eine Zufallszahl in Excel generieren (Hinweis: In Excel wird ein Grenzwert von 9999 für den Startwert festgelegt). Wenn Sie während des Vorgangs eine Zahl in das Feld Random Seed eingeben, können Sie denselben Satz von Zufallszahlen erneut verwenden. Wenn Sie "77" in das Feld eingegeben haben und "77" eingeben, wenn Sie den Zufallszahlengenerator das nächste Mal ausführen, zeigt Excel dieselbe Gruppe von Zufallszahlen an. Wenn Sie "99" eingeben, erhalten Sie einen völlig anderen Zahlensatz. Wenn Sie jedoch wieder zu einem Ausgangswert von 77 zurückkehren, erhalten Sie den gleichen Satz von Zufallszahlen, mit denen Sie begonnen haben.

Zum Beispiel: "Nehmen Sie eine Zahl x, addieren Sie 900 + x, und ziehen Sie dann 52 ab." Damit der Prozess beginnen kann, müssen Sie eine Startnummer x (den Startwert) angeben. Nehmen wir die Startnummer 77:

Addiere 900 + 77 = 977 Subtrahiere 52 = 925 Nach dem gleichen Algorithmus wäre die zweite "Zufallszahl":

900 + 925 = 1825 Subtraktion 52 = 1773 Dieses einfache Beispiel folgt einem Muster, aber die Algorithmen für die Generierung von Computernummern sind viel komplizierter

0
sunidhi mittal