In der maschinellen Lernaufgabe. Wir sollten eine Gruppe von zufälligen Normalverteilung mit gebunden erhalten. Wir können eine normale Verteilungsnummer mit np.random.normal()
bekommen, aber es bietet keine gebundenen Parameter an. Ich möchte wissen, wie das geht? Wie bekomme ich eine normale Verteilung innerhalb eines Bereichs in numpy?
Antwort
Wenn Sie die Truncated normal distribution suchen, hat SciPy eine Funktion für sie truncnorm
Die Standardform dieser Verteilung bezeichnet, ist ein Standard-Normal verkürzten auf den Bereich [a, b] - Beachten Sie, dass a und b sind über die Domäne der Standardnormalen definiert. Um Clip-Werte für einen bestimmten Mittelwert wandeln und Standardabweichung, zu verwenden:
a, b = (myclip_a - my_mean)/my_std, (myclip_b - my_mean)/my_std
truncnorm nimmt a und b als Formparameter .
>>> from scipy.stats import truncnorm
>>> truncnorm(a=-2/3., b=2/3., scale=3).rvs(size=10)
array([-1.83136675, 0.77599978, -0.01276925, 1.87043384, 1.25024188,
0.59336279, -0.39343176, 1.9449987 , -1.97674358, -0.31944247])
Das obige Beispiel ist mit -2 begrenzt und 2 und gibt 10 Zufallszahl (unter Verwendung der Methode .rvs()
)
>>> min(truncnorm(a=-2/3., b=2/3., scale=3).rvs(size=10000))
-1.9996074381484044
>>> max(truncnorm(a=-2/3., b=2/3., scale=3).rvs(size=10000))
1.9998486576228549
Hier ist ein Histogramm-Diagramm für -6, 6:
Neben @bakkal Vorschlag (+1) können Sie auch einen Blick inwerfenRezept für das Erreichen dieser, umgeschrieben als py-rtnorm Modul von Christoph Lassner.
Die Parametrisierung von truncnorm
ist kompliziert, so ist hier eine Funktion, die die Parametrisierung auf etwas intuitivere übersetzt:
from scipy.stats import truncnorm
def get_truncated_normal(mean=0, sd=1, low=0, upp=10):
return truncnorm(
(low - mean)/sd, (upp - mean)/sd, loc=mean, scale=sd)
Wie es zu benutzen?
Instanz der Generator mit den Parametern: bedeuten, Standardabweichung und Verkürzungsbereich:
>>> X = get_truncated_normal(mean=8, sd=2, low=1, upp=10)
Dann können Sie X verwenden, um einen Wert zu erzeugen:
>>> X.rvs() 6.0491227353928894
Oder ein numpy a rray mit N erzeugten Werte:
>>> X.rvs(10) array([ 7.70231607, 6.7005871 , 7.15203887, 6.06768994, 7.25153472, 5.41384242, 7.75200702, 5.5725888 , 7.38512757, 7.47567455])
als Anschauungsbeispiel
Hier ist die Handlung von drei verschiedenen abgeschnittene Normalverteilungen:
X1 = get_truncated_normal(mean=2, sd=1, low=1, upp=10)
X2 = get_truncated_normal(mean=5.5, sd=1, low=1, upp=10)
X3 = get_truncated_normal(mean=8, sd=1, low=1, upp=10)
import matplotlib.pyplot as plt
fig, ax = plt.subplots(3, sharex=True)
ax[0].hist(X1.rvs(10000), normed=True)
ax[1].hist(X2.rvs(10000), normed=True)
ax[2].hist(X3.rvs(10000), normed=True)
plt.show()
Fantastische Antwort, danke! – Gabriel
+1. Es ist jedoch zu beachten, dass die Funktion viel schneller wird, wenn 'get_truncated_normal.rvs()' sofort innerhalb der Funktion verwendet wird, anstatt sie außerhalb aufzurufen. Natürlich hilft das nur, wenn Sie zufällige Draws haben wollen –
- 1. Heapsort innerhalb eines gegebenen Bereichs
- 2. Wartung eines Nat innerhalb eines festen Bereichs
- 3. Grid-Verteilung mit numpy
- 4. Daten innerhalb eines Bereichs in R
- 5. Numpy Conditional Max des Bereichs
- 6. Wie kann man feststellen, wie viele Elemente eines Bereichs innerhalb eines anderen gegebenen Bereichs liegen?
- 7. Erzeuge 'n' eindeutige Zufallszahlen innerhalb eines Bereichs
- 8. Gebiet Segmentierung innerhalb eines segmentierten Bereichs
- 9. Numpy trapezoide Verteilung für Altersverteilung
- 10. Begrenzte Redis-Warteschlange innerhalb eines Bereichs
- 11. Suchen Sie eine Teilmenge mit Summe innerhalb eines Bereichs
- 12. Wie kann ich eine Zufallszahl innerhalb eines Bereichs in Rust erzeugen?
- 13. Wie bekomme ich hier eine Ausnahme außerhalb des Bereichs?
- 14. Überprüfen eines Datums innerhalb des SqlDbType.DateTime-Bereichs
- 15. Schienen konvertieren Datetime Datum innerhalb eines Bereichs
- 16. mysql Suche min (Datum) innerhalb eines Bereichs
- 17. Unity3d: Wie man einen Klick innerhalb eines Bereichs erkennt
- 18. Wie ich eine Zufallszahl innerhalb eines Bereichs mit der Wahrscheinlichkeit einer der Zahlen
- 19. Wie kopiert man die Werte innerhalb eines dynamischen benannten Bereichs?
- 20. Berechnen von Teilmengen eines Arrays innerhalb eines bestimmten Bereichs?
- 21. Wie konvertiert man eine Beta-Verteilung in eine einheitliche Verteilung?
- 22. Wie wählen Sie eine Zufallszahl innerhalb des Bereichs, aber gewichtet in Richtung eines Teils dieses Bereichs? (in Java)
- 23. Get Werte für Schlüssel innerhalb eines Bereichs in Java
- 24. in GTK, wie bekomme ich die ursprüngliche normale bg Farbe eines Widgets?
- 25. Numpy: Wie bekomme ich die maximale Behälterposition?
- 26. Django - Filtern eines Datums innerhalb eines Bereichs mit Validierung
- 27. Wie bekomme ich normale Zahl von Dezimalzahl mit Javascript
- 28. Wie bekomme ich eine Unterliste eines ArrayDeQueLists?
- 29. Wie bekomme ich eine Instanz eines XMLEventAllocator?
- 30. Wie überschreibe ich den Hauptteil eines Formulars innerhalb eines Bereichs für einen bestimmten Pfad?
Shouldn‘ t Stichproben von normalerweise verteilte Daten per Definition unbegrenzt sein? – Tom