scipy.stats.

gaussian_kde#

class scipy.stats.gaussian_kde(dataset, bw_method=None, weights=None)[Quelle]#

Repräsentation einer Kernel-Dichteschätzung mit Gaußschen Kernels.

Kernel-Dichteschätzung (Kernel Density Estimation, KDE) ist eine Methode zur nicht-parametrischen Schätzung der Wahrscheinlichkeitsdichtefunktion (PDF) einer Zufallsvariable. gaussian_kde funktioniert sowohl für univariate als auch für multivariate Daten. Sie beinhaltet die automatische Bestimmung der Bandbreite. Die Schätzung funktioniert am besten für eine unimodale Verteilung; bimodale oder multimodale Verteilungen neigen dazu, geglättet zu werden.

Parameter:
datasetarray_like

Datenpunkte zur Schätzung. Im Falle von univariaten Daten ist dies ein 1D-Array, andernfalls ein 2D-Array mit der Form (# Dimensionen, # Datenpunkte).

bw_methodstr, skalar oder aufrufbar, optional

Die Methode zur Berechnung des Bandbreitenfaktors. Dies kann 'scott', 'silverman', eine skalare Konstante oder eine aufrufbare Funktion sein. Wenn es sich um einen Skalar handelt, wird dieser direkt als factor verwendet. Wenn es sich um eine aufrufbare Funktion handelt, sollte diese eine gaussian_kde-Instanz als einziges Argument nehmen und einen Skalar zurückgeben. Wenn None (Standard), wird 'scott' verwendet. Siehe Hinweise für weitere Details.

weightsarray_like, optional

Gewichte der Datenpunkte. Dies muss die gleiche Form wie `dataset` haben. Wenn None (Standard), werden die Stichproben als gleich gewichtet angenommen.

Attribute:
datasetndarray

Der Datensatz, mit dem gaussian_kde initialisiert wurde.

dint

Anzahl der Dimensionen.

nint

Anzahl der Datenpunkte.

neffint

Effektive Anzahl von Datenpunkten.

Hinzugefügt in Version 1.2.0.

factorfloat

Der Bandbreitenfaktor, der von covariance_factor erhalten wurde.

covariancendarray

Die Kovarianzmatrix des Kernels; dies ist die Daten-Kovarianzmatrix multipliziert mit dem Quadrat des Bandbreitenfaktors, z. B. np.cov(dataset) * factor**2.

inv_covndarray

Die Inverse von covariance.

Methoden

evaluate(points)

Die geschätzte PDF an einer Reihe von Punkten auswerten.

__call__(points)

Die geschätzte PDF an einer Reihe von Punkten auswerten.

integrate_gaussian(mean, cov)

Multipliziert die geschätzte Dichte mit einer multivariaten Gaußschen Verteilung und integriert über den gesamten Raum.

integrate_box_1d(low, high)

Berechnet das Integral einer 1D-PDF zwischen zwei Grenzen.

integrate_box(low_bounds, high_bounds[, ...])

Berechnet das Integral einer PDF über ein rechteckiges Intervall.

integrate_kde(other)

Berechnet das Integral des Produkts dieser Kernel-Dichteschätzung mit einer anderen.

pdf(x)

Evaluieren Sie die geschätzte PDF an einem bereitgestellten Satz von Punkten.

logpdf(x)

Evaluieren Sie den Logarithmus der geschätzten PDF an einem bereitgestellten Satz von Punkten.

resample([size, seed])

Zufälliges Ziehen eines Datensatzes aus der geschätzten PDF.

set_bandwidth([bw_method])

Berechnen Sie den Bandbreitenfaktor mit der angegebenen Methode.

covariance_factor()

Berechnet den Bandbreitenfaktor factor.

Hinweise

Die Wahl der Bandbreite hat starken Einfluss auf die von der KDE erhaltene Schätzung (viel stärker als die tatsächliche Form des Kernels). Die Wahl der Bandbreite kann durch eine "Faustregel", durch Kreuzvalidierung, durch "Plug-in-Methoden" oder auf andere Weise erfolgen; siehe [3], [4] für Übersichten. gaussian_kde verwendet eine Faustregel, die Standardeinstellung ist Scotts Regel.

Scotts Regel [1], implementiert als scotts_factor, ist

n**(-1./(d+4)),

mit n der Anzahl der Datenpunkte und d der Anzahl der Dimensionen. Im Falle von ungleich gewichteten Punkten wird scotts_factor zu

neff**(-1./(d+4)),

mit neff der effektiven Anzahl von Datenpunkten. Silvermans Vorschlag für *multivariate* Daten [2], implementiert als silverman_factor, ist

(n * (d + 2) / 4.)**(-1. / (d + 4)).

oder im Falle von ungleich gewichteten Punkten

(neff * (d + 2) / 4.)**(-1. / (d + 4)).

Beachten Sie, dass dies nicht dasselbe ist wie "Silvermans Faustregel" [6], welche im univariaten Fall robuster sein kann; siehe Dokumentation der Methode set_bandwidth für die Implementierung einer benutzerdefinierten Bandbreitenregel.

Gute allgemeine Beschreibungen der Kernel-Dichteschätzung finden Sie in [1] und [2], die Mathematik für diese mehrdimensionale Implementierung finden Sie in [1].

Mit einem Satz gewichteter Stichproben wird die effektive Anzahl von Datenpunkten neff definiert durch

neff = sum(weights)^2 / sum(weights^2)

wie in [5] detailliert.

gaussian_kde unterstützt derzeit keine Daten, die in einem Unterraum geringerer Dimension des Raumes liegen, in dem sie ausgedrückt werden. Für solche Daten sollten Sie eine Hauptkomponentenanalyse / Dimensionsreduktion durchführen und gaussian_kde mit den transformierten Daten verwenden.

Referenzen

[1] (1,2,3)

D.W. Scott, „Multivariate Density Estimation: Theory, Practice, and Visualization“, John Wiley & Sons, New York, Chicester, 1992.

[2] (1,2)

B.W. Silverman, „Density Estimation for Statistics and Data Analysis“, Vol. 26, Monographs on Statistics and Applied Probability, Chapman and Hall, London, 1986.

[3]

B.A. Turlach, „Bandwidth Selection in Kernel Density Estimation: A Review“, CORE and Institut de Statistique, Vol. 19, pp. 1-33, 1993.

[4]

D.M. Bashtannyk und R.J. Hyndman, „Bandwidth selection for kernel conditional density estimation“, Computational Statistics & Data Analysis, Vol. 36, pp. 279-298, 2001.

[5]

Gray P. G., 1969, Journal of the Royal Statistical Society. Series A (General), 132, 272

[6]

Kernel-Dichteschätzung. *Wikipedia*. https://en.wikipedia.org/wiki/Kernel_density_estimation

Beispiele

Generieren Sie einige zufällige zweidimensionale Daten

>>> import numpy as np
>>> from scipy import stats
>>> def measure(n):
...     "Measurement model, return two coupled measurements."
...     m1 = np.random.normal(size=n)
...     m2 = np.random.normal(scale=0.5, size=n)
...     return m1+m2, m1-m2
>>> m1, m2 = measure(2000)
>>> xmin = m1.min()
>>> xmax = m1.max()
>>> ymin = m2.min()
>>> ymax = m2.max()

Führen Sie eine Kernel-Dichteschätzung für die Daten durch

>>> X, Y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
>>> positions = np.vstack([X.ravel(), Y.ravel()])
>>> values = np.vstack([m1, m2])
>>> kernel = stats.gaussian_kde(values)
>>> Z = np.reshape(kernel(positions).T, X.shape)

Stellen Sie die Ergebnisse grafisch dar

>>> import matplotlib.pyplot as plt
>>> fig, ax = plt.subplots()
>>> ax.imshow(np.rot90(Z), cmap=plt.cm.gist_earth_r,
...           extent=[xmin, xmax, ymin, ymax])
>>> ax.plot(m1, m2, 'k.', markersize=2)
>>> ax.set_xlim([xmin, xmax])
>>> ax.set_ylim([ymin, ymax])
>>> plt.show()
../../_images/scipy-stats-gaussian_kde-1_00_00.png

Vergleich mit manueller KDE an einem Punkt

>>> point = [1, 2]
>>> mean = values.T
>>> cov = kernel.factor**2 * np.cov(values)
>>> X = stats.multivariate_normal(cov=cov)
>>> res = kernel.pdf(point)
>>> ref = X.pdf(point - mean).sum() / len(mean)
>>> np.allclose(res, ref)
True