Wat doet Numpy.Random.seed (0)?

Wat doet np.random.seedDOEN IN DE HIERONDER CODE VAN EEN SCIKIT-LEUREN TUTORIAL? Ik ben niet erg bekend met Numpy’s Willekeurige State Generator-spul, dus ik zou de voorwaarden van een leek op prijs stellen.

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

Antwoord 1, Autoriteit 100%

np.random.seed(0)Maakt de willekeurige nummers voorspelbaar

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

Met de zaadreset (elke keer) verschijnt het hetzelfde set van cijfers elke keer.

Als het willekeurige zaad niet wordt gereset, verschijnen verschillende met elke aanroep:

>>> 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-) Willekeurige nummers werken door te beginnen met een nummer (het zaad), vermenigvuldig het met een groot aantal, het toevoegen van een offset en het nemen van modulo van die som. Het resulterende aantal wordt vervolgens gebruikt als het zaad om het volgende “willekeurige” nummer te genereren. Wanneer je het zaad (elke keer) instelt, doet het elke keer hetzelfde, waardoor je dezelfde nummers hebt.

Als u schijnbaar willekeurige getallen wilt, stel het zaad niet in. Als u een code hebt die willekeurige getallen gebruikt die u wilt debuggen, kunt u echter zeer nuttig zijn om het zaad voor elke run in te stellen, zodat de code hetzelfde doet elke keer dat u het uitvoert.

Om de meeste willekeurige getallen voor elke run te krijgen, belt u numpy.random.seed(). Ditzorgt ervoor dat numpy stel de seed in op een willekeurig getal verkregen van /dev/urandomof zijn Windows-analoog of, als geen van beide beschikbaar is, zal het de klok gebruiken.

Zie wikipediavoor meer informatie over het gebruik van zaden om pseudo-willekeurige getallen te genereren.


Antwoord 2, autoriteit 8%

Als je de np.random.seed(a_fixed_number)instelt elke keer dat je de andere willekeurige functie van de numpy aanroept, zal het resultaat hetzelfde zijn:

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

Als je het echter maar één keer aanroept en verschillende willekeurige functies gebruikt, zullen de resultaten nog steeds anders zijn:

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

Antwoord 3, autoriteit 3%

Zoals opgemerkt, stelt numpy.random.seed(0) de willekeurige seed in op 0, dus de pseudo-willekeurige getallen die je van random krijgt, beginnen vanaf hetzelfde punt. Dit kan in sommige gevallen goed zijn voor debuggen. ECHTER, na wat lezen, lijkt dit de verkeerde manier om het te doen, als je threads hebt omdat het niet thread-safe is.

van verschillen-tussen-numpy-random-and- willekeurig-willekeurig-in-python:

Voor numpy.random.seed(), is de grootste moeilijkheid dat dit niet het geval is
thread-safe – dat wil zeggen, het is niet veilig om te gebruiken als je veel verschillende hebt
uitvoeringsdraden, omdat het niet gegarandeerd werkt als twee
verschillende threads voeren de functie tegelijkertijd uit. Indien
je gebruikt geen threads, en als je redelijkerwijs kunt verwachten dat je
in de toekomst uw programma niet meer op deze manier hoeft te herschrijven,
numpy.random.seed() zou goed moeten zijn voor testdoeleinden. Als er is
enige reden om te vermoeden dat je in de toekomst threads nodig hebt, het is
veel veiliger op de lange termijn om te doen zoals voorgesteld, en om een lokale
instantie van de klasse numpy.random.Random. Voor zover ik kan zeggen,
random.random.seed() is thread-safe (of tenminste, ik heb er geen gevonden
bewijs van het tegendeel).

voorbeeld van hoe u dit kunt doen:

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)

kan geven:

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

Merk op ten slotte, merk op dat er mogelijk gevallen zijn waarbij initialiseert naar 0 (in tegenstelling tot een zaad dat niet alle bits 0) heeft, kan resulteren in niet-uniforme distributies voor enkele eerste iteraties vanwege de manier waarop XOR werkt, maar dit is afhankelijk op het algoritme, en is het buiten mijn huidige zorgen en de reikwijdte van deze vraag.


Antwoord 4, Autoriteit 3%

Ik heb dit heel vaak gebruikt in neurale netwerken. Het is bekend dat wanneer we beginnen met het trainen van een neuraal netwerk dat we willekeurig de gewichten initialiseren. Het model is getraind op deze gewichten op een bepaalde dataset. Na het aantal tijdperk krijg je getraind set van gewichten.

Stel nu dat u weer helemaal opnieuw wilt trainen of u het model aan anderen wilt doorgeven om uw resultaten te reproduceren, de gewichten zullen opnieuw worden geïnitialiseerd aan een willekeurige getallen die meestal verschillen van eerdere. De verkregen getrainde gewichten na hetzelfde aantal tijdperk (dezelfde gegevens en andere parameters bijhouden) Zoals eerder zal verschillen. Het probleem is dat uw model niet meer reproduceerbaar is dat is elke keer dat u uw model helemaal opnieuw traint, geeft u verschillende reeksen gewichten. Dit komt omdat het model elke keer wordt geïnitialiseerd door verschillende willekeurige getallen.

Wat als elke keer dat u helemaal opnieuw begint met trainen, het model wordt geïnitialiseerd op dezelfde set willekeurige initialisatiegewichten? In dit geval kan uw model reproduceerbaar worden. Dit wordt bereikt door numpy.random.seed(0). Door seed() te noemen bij een bepaald getal, blijf je altijd vastzitten aan dezelfde reeks willekeurige getallen.


Antwoord 5

Stel je voor dat je iemand laat zien hoe je iets moet coderen met een aantal “willekeurige” getallen. Door numpy seed te gebruiken, kunnen ze hetzelfde seed-nummer gebruiken en dezelfde reeks “willekeurige” nummers krijgen.

Het is dus niet bepaald willekeurig omdat een algoritme de getallen uitspuugt, maar het ziet eruit als een willekeurig gegenereerde verzameling.


Antwoord 6

Alle antwoorden hierboven tonen de implementatie van np.random.seed()in code. Ik zal mijn best doen om in het kort uit te leggen waarom het echt gebeurt. Computers zijn machines die zijn ontworpen op basis van vooraf gedefinieerde algoritmen. Elke uitvoer van een computer is het resultaat van het algoritme dat op de invoer is geïmplementeerd. Dus als we een computer vragen om willekeurige getallen te genereren, weet je zeker dat ze willekeurig zijn, maar de computer heeft ze niet zomaar willekeurig bedacht!

Dus als we np.random.seed(any_number_here)schrijven, zal het algoritme een bepaalde reeks getallen uitvoeren die uniek is voor het argument any_number_here. Het is bijna alsof een bepaalde reeks willekeurige getallen kan worden verkregen als we het juiste argument doorgeven. Maar hiervoor moeten we weten hoe het algoritme werkt, wat nogal vervelend is.

Dus als ik bijvoorbeeld np.random.seed(10)schrijf, blijft de specifieke reeks getallen die ik verkrijg hetzelfde, zelfs als ik dezelfde regel na 10 jaar uitvoer, tenzij het algoritme wijzigingen.


Antwoord 7

Ik hoop een heel kort antwoord te geven:

seedmaken (de volgende serie) willekeurige getallen voorspelbaar. Je kunt denken elke keer nadat je hebt gejubificeerd seed, het pre-definieer serie-nummers en numpy willekeurige houdt de iterator ervan, en elke keer dat je een willekeurig nummer krijgt, ga het gewoon terug.

b.v.:

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

U kunt opmerken wanneer ik hetzelfde zaad instel, ongeacht hoeveel willekeurig nummer dat u elke keer van Numpy vraagt, het geeft altijd dezelfde reeks cijfers, in dit geval dat array([-0.41675785, -0.05626683, -1.24528809]).


Antwoord 8

Een willekeurig zaadje specificeert het startpunt wanneer een computer een willekeurige getalsequentie genereert.

Laten we bijvoorbeeld zeggen dat u een willekeurig getal in Excel wilt genereren (OPMERKING: Excel stelt een limiet van 9999 voor het zaadje in). Als u tijdens het proces een getal in de willekeurige zaaddoos invoert, kunt u dezelfde reeks willekeurige getallen opnieuw gebruiken. Als u “77” in de doos hebt getypt, en getypt “77” de volgende keer dat u de willekeurige nummergenerator uitvoert, geeft Excel diezelfde set willekeurige nummers weer. Als u “99” typt, krijgt u een geheel andere set cijfers. Maar als u teruggaat naar een zaad van 77, krijgt u dezelfde reeks willekeurige nummers waarmee u bent begonnen.

Bijvoorbeeld, “neem een ​​nummer x, voeg 900 + x toe en trek vervolgens 52 af.” Om het proces om te starten, moet u een startnummer, x (het zaad) opgeven. Laten we het startnummer 77 nemen:

voeg 900 + 77 = 977 toe
Aftrekken 52 = 925
Na hetzelfde algoritme zou het tweede “willekeurige” nummer zijn:

900 + 925 = 1825
Aftrekken 52 = 1773
Dit eenvoudige voorbeeld volgt een patroon, maar de algoritmen achter het genereren van computernummers zijn veel gecompliceerder


Antwoord 9

numpy.random.seed(0)
numpy.random.randint(10, size=5)

Dit levert de volgende uitvoer op:
array([5, 0, 3, 3, 7])
Nogmaals, als we dezelfde code uitvoeren, krijgen we hetzelfde resultaat.

Als we nu de seed-waarde 0 veranderen in 1 of andere:

numpy.random.seed(1)
numpy.random.randint(10, size=5)

Dit levert de volgende uitvoer op: array([5 8 9 5 0])maar nu is de uitvoer niet hetzelfde als hierboven.


Antwoord 10

Alle willekeurige getallen die worden gegenereerd na het instellen van een bepaalde seed-waarde zijn hetzelfde op alle platforms/systemen.


Antwoord 11

Er is een mooie uitleg in Numpy-documenten:
https://docs.scipy. org/doc/numpy-1.15.1/reference/generated/numpy.random.RandomState.html
het verwijst naar de Mersenne Twister pseudo-willekeurige nummergenerator. Meer details over het algoritme hier: https://en.wikipedia.org/wiki/Mersenne_Twister

Other episodes