scipy.stats.truncnorm#

scipy.stats.truncnorm = <scipy.stats._continuous_distns.truncnorm_gen object>[Quelle]#

Eine abgeschnittene Normalverteilung, stetige Zufallsvariable.

Als Instanz der Klasse rv_continuous erbt das Objekt truncnorm von dieser eine Sammlung generischer Methoden (siehe unten für die vollständige Liste) und vervollständigt sie mit Details, die spezifisch für diese spezielle Verteilung sind.

Methoden

rvs(a, b, loc=0, scale=1, size=1, random_state=None)

Zufallsvariaten.

pdf(x, a, b, loc=0, scale=1)

Wahrscheinlichkeitsdichtefunktion.

logpdf(x, a, b, loc=0, scale=1)

Logarithmus der Wahrscheinlichkeitsdichtefunktion.

cdf(x, a, b, loc=0, scale=1)

Kumulative Verteilungsfunktion.

logcdf(x, a, b, loc=0, scale=1)

Logarithmus der kumulativen Verteilungsfunktion.

sf(x, a, b, loc=0, scale=1)

Überlebensfunktion (auch definiert als 1 - cdf, aber sf ist manchmal genauer).

logsf(x, a, b, loc=0, scale=1)

Logarithmus der Überlebensfunktion.

ppf(q, a, b, loc=0, scale=1)

Perzentilpunktfunktion (Umkehrung von cdf — Perzentile).

isf(q, a, b, loc=0, scale=1)

Umgekehrte Überlebensfunktion (Umkehrung von sf).

moment(order, a, b, loc=0, scale=1)

Nichtzentrales Moment der angegebenen Ordnung.

stats(a, b, loc=0, scale=1, moments=’mv’)

Mittelwert(‚m‘), Varianz(‚v‘), Schiefe(‚s‘) und/oder Kurtosis(‚k‘).

entropy(a, b, loc=0, scale=1)

(Differential-)Entropie der RV.

fit(data)

Parameterschätzungen für generische Daten. Siehe scipy.stats.rv_continuous.fit für eine detaillierte Dokumentation der Schlüsselwortargumente.

expect(func, args=(a, b), loc=0, scale=1, lb=None, ub=None, conditional=False, **kwds)

Erwartungswert einer Funktion (einer Variablen) bezüglich der Verteilung.

median(a, b, loc=0, scale=1)

Median der Verteilung.

mean(a, b, loc=0, scale=1)

Mittelwert der Verteilung.

var(a, b, loc=0, scale=1)

Varianz der Verteilung.

std(a, b, loc=0, scale=1)

Standardabweichung der Verteilung.

interval(confidence, a, b, loc=0, scale=1)

Konfidenzintervall mit gleichen Flächen um den Median.

Hinweise

Diese Verteilung ist die Normalverteilung mit Mittelwert loc (Standardwert 0) und Standardabweichung scale (Standardwert 1), die bei a und b *Standardabweichungen* von loc abgeschnitten ist. Für beliebige loc und scale sind a und b *nicht* die Abszissen, bei denen die verschobene und skalierte Verteilung abgeschnitten wird.

Hinweis

Wenn a_trunc und b_trunc die Abszissen sind, bei denen wir die Verteilung abschneiden möchten (im Gegensatz zur Anzahl der Standardabweichungen von loc), dann können wir die Verteilungsparameter a und b wie folgt berechnen:

a, b = (a_trunc - loc) / scale, (b_trunc - loc) / scale

Dies ist ein häufiger Punkt der Verwirrung. Für zusätzliche Klarheit siehe das folgende Beispiel.

Beispiele

>>> import numpy as np
>>> from scipy.stats import truncnorm
>>> import matplotlib.pyplot as plt
>>> fig, ax = plt.subplots(1, 1)

Ermitteln Sie den Träger (Support)

>>> a, b = 0.1, 2
>>> lb, ub = truncnorm.support(a, b)

Berechnen Sie die ersten vier Momente

>>> mean, var, skew, kurt = truncnorm.stats(a, b, moments='mvsk')

Zeigen Sie die Wahrscheinlichkeitsdichtefunktion (pdf) an

>>> x = np.linspace(truncnorm.ppf(0.01, a, b),
...                 truncnorm.ppf(0.99, a, b), 100)
>>> ax.plot(x, truncnorm.pdf(x, a, b),
...        'r-', lw=5, alpha=0.6, label='truncnorm pdf')

Alternativ kann das Verteilungsobjekt (als Funktion) aufgerufen werden, um die Form-, Orts- und Skalierungsparameter festzulegen. Dies gibt ein „eingefrorenes“ RV-Objekt zurück, das die angegebenen Parameter beibehält.

Frieren Sie die Verteilung ein und zeigen Sie die eingefrorene pdf an

>>> rv = truncnorm(a, b)
>>> ax.plot(x, rv.pdf(x), 'k-', lw=2, label='frozen pdf')

Überprüfen Sie die Genauigkeit von cdf und ppf

>>> vals = truncnorm.ppf([0.001, 0.5, 0.999], a, b)
>>> np.allclose([0.001, 0.5, 0.999], truncnorm.cdf(vals, a, b))
True

Generieren Sie Zufallszahlen

>>> r = truncnorm.rvs(a, b, size=1000)

Und vergleichen Sie das Histogramm

>>> ax.hist(r, density=True, bins='auto', histtype='stepfilled', alpha=0.2)
>>> ax.set_xlim([x[0], x[-1]])
>>> ax.legend(loc='best', frameon=False)
>>> plt.show()
../../_images/scipy-stats-truncnorm-1_00_00.png

In den obigen Beispielen sind loc=0 und scale=1, sodass das Histogramm links bei a und rechts bei b abgeschnitten ist. Angenommen, wir würden jedoch dasselbe Histogramm mit loc = 1 und scale = 0.5 erzeugen.

>>> loc, scale = 1, 0.5
>>> rv = truncnorm(a, b, loc=loc, scale=scale)
>>> x = np.linspace(truncnorm.ppf(0.01, a, b),
...                 truncnorm.ppf(0.99, a, b), 100)
>>> r = rv.rvs(size=1000)
>>> fig, ax = plt.subplots(1, 1)
>>> ax.plot(x, rv.pdf(x), 'k-', lw=2, label='frozen pdf')
>>> ax.hist(r, density=True, bins='auto', histtype='stepfilled', alpha=0.2)
>>> ax.set_xlim(a, b)
>>> ax.legend(loc='best', frameon=False)
>>> plt.show()
../../_images/scipy-stats-truncnorm-1_01_00.png

Beachten Sie, dass die Verteilung nicht mehr bei den Abszissen a und b abgeschnitten zu sein scheint. Das liegt daran, dass die *Standard*-Normalverteilung zuerst bei a und b abgeschnitten wird, *dann* die resultierende Verteilung mit scale skaliert und mit loc verschoben wird. Wenn wir stattdessen möchten, dass die verschobene und skalierte Verteilung bei a und b abgeschnitten wird, müssen wir diese Werte transformieren, bevor wir sie als Verteilungsparameter übergeben.

>>> a_transformed, b_transformed = (a - loc) / scale, (b - loc) / scale
>>> rv = truncnorm(a_transformed, b_transformed, loc=loc, scale=scale)
>>> x = np.linspace(truncnorm.ppf(0.01, a, b),
...                 truncnorm.ppf(0.99, a, b), 100)
>>> r = rv.rvs(size=10000)
>>> fig, ax = plt.subplots(1, 1)
>>> ax.plot(x, rv.pdf(x), 'k-', lw=2, label='frozen pdf')
>>> ax.hist(r, density=True, bins='auto', histtype='stepfilled', alpha=0.2)
>>> ax.set_xlim(a-0.1, b+0.1)
>>> ax.legend(loc='best', frameon=False)
>>> plt.show()
../../_images/scipy-stats-truncnorm-1_02_00.png