[PYTHON] Probieren Sie den Generator von numpy.random aus

Dies ist der erste Beitrag.

NumPy v1.18 wurde Ende Mai 2020 veröffentlicht. Also las ich das Dokument noch einmal und bemerkte, dass, bevor ich es wusste, eine neue Klasse namens "Generator" zum Modul "numpy.random" hinzugefügt wurde, die in Statistik / maschinellem Lernen behandelt wurde, und ich war bis jetzt mit "numpy" vertraut. Es scheint, dass Funktionen wie .random.random` veraltet sind.

Darüber hinaus scheint diese Änderung in NumPy 1.17 vorgenommen worden zu sein. Die Schwäche, die ich jetzt bemerke ...

https://numpy.org/doc/1.17/reference/random/index.html

Persönlich dachte ich, dass es eine große Veränderung war, deshalb möchte ich nachverfolgen, was sich seit dem Schreiben des Memos geändert hat.

Die folgenden Artikel basieren auf der Dokumentation zu NumPy v1.18.

Neue Zufallsstichprobe

Bisher laut NumPy-Dokumentation

from numpy.random import random

random(100)

Anstelle des Zufallsstichprobencodes, den ich in Version 1.17 oder höher geschrieben habe

from numpy.random import default_rng

rg = default_rng()
rg.random(100)

Ist empfohlen. Es ist irgendwie objektorientiert.

Übrigens wird es beim Setzen des Samens so.

from numpy.random default_rng

rg = default_rng(123)
rg.random(100)

Hier ist der alte Code, der dem entspricht.

from numpy.random import RandomState, random, seed

rg = RandomState(123)
rg.random(100)

#Beim Setzen eines globalen Startwerts
seed(123)
random(100)

Vorteile der neuen Methode

Als ich das sah, dachte ich: "Die Anzahl der Zeilen wurde reduziert", "Was ist" default_rng "und" Wozu dient diese Art der Verwendung? ", Aber es gibt einige Vorteile. wie es scheint.

Vorteil 1: Schnell

Erstens ist es schnell und effizient. In meiner PC-Umgebung

In [1]: from numpy.random import standard_normal, default_rng

In [2]: rg = default_rng()

In [3]: %%timeit
   ...: rg.standard_normal(1000000)  # newer 
   ...:  
   ...:                                                                         
24.8 ms ± 709 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [4]: %%timeit
   ...: standard_normal(1000000)  # older
   ...:                                                                         
52.4 ms ± 835 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

Das Ergebnis war das. Die Ausführungszeit ist halbiert!

Der Grund dafür scheint zu sein, dass sich der intern verwendete Zufallszahlengenerator geändert hat. Vor Version 1.16 wurde Mercenne Twister als Zufallszahlengenerator verwendet, nach Version 1.17 wird jedoch ein Zufallszahlengenerator namens PCG verwendet.

PCG ist ein 2014 angekündigter Zufallszahlengenerator, der anscheinend schnell und effizient Pseudozufallszahlen mit guten Eigenschaften erzeugen kann. Ich bin damit nicht vertraut. Wenn Sie interessiert sind, besuchen Sie bitte Wikipedia oder Official Page. Bitte probieren Sie es aus. Kommentar qiita Ich warte auf einen Artikel.

Vorteil 2: Sie können einen Zufallszahlengenerator auswählen

Vor Version 1.16 konnte nur Mercenne Twister als Zufallszahlengenerator verwendet werden. Da gab es keine Wahl. Vielleicht hätte es ein Zauberer, der die C-Sprache verwenden kann, geschafft, aber für einen Endbenutzer wie mich, der dumm und erbärmlich ist und die C-Sprache nicht vollständig verstehen kann, den gegebenen Mercenne Ich konnte nur ein Werkzeug namens Twister verwenden.

Nach Version 1.17 ist dies jedoch anders.

Seit v1.17 haben wir das Recht, einen Zufallszahlengenerator zu wählen. Zusätzlich zum Standard-PCG können wir den nostalgischen Mercenne Twister verwenden und aus mehreren anderen Randomisierern auswählen.

Die Schlüsselmechanismen sind "Generator" und "BitGenerator".

(Bit) Generator ist was

Die "BitGenerator" -Klasse scheint eine abstrakte Klasse für Zufallsgeneratoren wie PCG und Mercenne Twister zu sein (flauschiges Verständnis). Mit NumPy können Pseudozufallsgeneratoren wie "PCG64", "MT19937", "Philox" und "SFC64" wie Unterklassen von "BitGenerator" verwendet werden.

Ich habe es nicht ausprobiert, aber Sie sollten wahrscheinlich in der Lage sein, einen benutzerdefinierten Zufallsgenerator zu erstellen und zu verwenden, indem Sie die BitGenerator-Klasse erweitern. Du hast es geschafft Python-chan! Zufallszahlen werden zunehmen!

Und die Klasse "Generator" ist dafür verantwortlich, diesen "BitGenerator" mit einer bestimmten Wahrscheinlichkeitsverteilung wie einer Gleichverteilung oder einer Normalverteilung zu verbinden.

Bekannte Funktionen wie "zufällig" und "normal" wachsen in den Methoden der "Generator" -Klasse. Es gibt auch einige manische Wahrscheinlichkeitsverteilungsfunktionen wie "Gumbel" und "Weibull". Ich bin glücklich.

Lassen Sie uns nun tatsächlich eine Zufallszahl mit "Generator" erstellen.

from numpy.random import Generator, PCG64, MT19937

#Verwenden Sie PCG als Randomizer
rg_pcg = Generator(PCG64())
rg_pcg.random(100)

#Verwenden Sie Mercenne Twister als Randomizer
rg_mt = Generator(MT19937())
rg_mt.random(100)

default_rng ist was

Das früher erscheinende default_rng ist der Konstruktor für den Generator, der das PCG64 als Randomizer verwendet.

Werfen wir einen Blick auf die Dokumentation in IPython.

In [1]: default_rng?
Docstring:
Construct a new Generator with the default BitGenerator (PCG64).

Aus diesem Grund ist der folgende Code praktisch identisch.

# default_rng version(Mit Samen)
rg = default_rng(123)

#Generatorversion(Mit Samen)
rg = Generator(PCG64(123))

Es war ein Aufholjagd ein Jahr nach der Veröffentlichung von Version 1.17 aufgrund meiner Schwäche, aber ich hoffe, es hilft.

Hab ein gutes Python-Leben!

Recommended Posts

Probieren Sie den Generator von numpy.random aus
Generator
Generator
Versuchen Sie Python
versuchen Sie es mit pysdl2
Generator Memo.
Versuchen Sie PyOpenGL