webentwicklung-frage-antwort-db.com.de

Wie erhält man eine Normalverteilung innerhalb eines Zahlenbereichs?

In maschineller Lernaufgabe. Wir sollten eine Gruppe zufälliger Normalverteilungen mit bound erhalten. Wir können eine normale Verteilungsnummer mit np.random.normal() erhalten, aber es werden keine gebundenen Parameter angeboten. Ich möchte wissen, wie das geht?

26
maple

Die Parametrisierung von truncnorm ist kompliziert . Hier ist eine Funktion, die die Parametrisierung in etwas Intuitiveres ü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 benutzt man es?

  1. Instanzieren Sie den Generator mit den Parametern: Mittelwert, Standardabweichung und Kürzungsbereich:

    >>> X = get_truncated_normal(mean=8, sd=2, low=1, upp=10)
    
  2. Dann können Sie mit X einen Wert erzeugen:

    >>> X.rvs()
    6.0491227353928894
    
  3. Oder ein Numpy-Array mit N generierten Werten:

    >>> X.rvs(10)
    array([ 7.70231607,  6.7005871 ,  7.15203887,  6.06768994,  7.25153472,
            5.41384242,  7.75200702,  5.5725888 ,  7.38512757,  7.47567455])
    

Ein visuelles Beispiel

Hier ist die Darstellung von drei verschiedenen Normalverteilungsstümpfen:

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

enter image description here

37
toto_tico

Wenn Sie nach der abgeschnittenen Normalverteilung suchen, hat SciPy dafür eine Funktion namens truncnorm

Die Standardform dieser Verteilung ist eine Standardnormale, die auf den Bereich [a, b] gekürzt ist. Beachten Sie, dass a und b über den Bereich der Standardnormale definiert sind. Verwenden Sie zum Konvertieren von Clip-Werten für einen bestimmten Mittelwert und eine bestimmte Standardabweichung Folgendes:

a, b = (myclip_a - my_mean)/my_std, (myclip_b - my_mean)/my_std

truncnorm verwendet 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 durch -2 und 2 begrenzt und gibt 10 Zufallsvariablen zurück (unter Verwendung der .rvs() -Methode)

>>> 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 Histogrammplot für -6, 6:

enter image description here

12
bakkal

Neben dem @ Bakkal-Vorschlag (+1) möchten Sie vielleicht auch einen Blick auf Vincent Mazet werfen, das als py-rtnorm Modul von Christoph Lassner .

1
armatita