Heim > Artikel > Backend-Entwicklung > Wie kann ich mit SciPy in Python eine empirische Verteilung an eine theoretische anpassen?
In der Statistik ist es oft notwendig, eine anzupassen empirische Verteilung, die aus beobachteten Daten ermittelt wurde, zu einer theoretischen Verteilung, die die Daten am besten beschreibt. Dies ermöglicht die Berechnung von Wahrscheinlichkeiten und anderen statistischen Schlussfolgerungen.
Scipy bietet zahlreiche Verteilungsfunktionen, die an Daten angepasst werden können . Um die am besten geeignete Verteilung zu finden, wird häufig die Methode der kleinsten Quadrate verwendet, um die Summe der quadratischen Fehler (SSE) zwischen dem Histogramm der Daten und dem Histogramm der angepassten Verteilung zu minimieren.
import numpy as np import scipy.stats as st # Data points data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # Candidate theoretical distributions distributions = ['norm', 'beta', 'gamma'] # Iterate over distributions and find best fit best_dist = None lowest_sse = float('inf') for dist_name in distributions: dist = getattr(st, dist_name) # Fit distribution to data params = dist.fit(data) # Evaluate SSE sse = np.sum((np.histogram(data, bins=10, density=True)[0] - dist.pdf(np.linspace(0, 10, 100), *params))**2) # Update best distribution if lower SSE found if sse < lowest_sse: lowest_sse = sse best_dist = dist # Calculate p-value for a given value value = 5 p_value = best_dist.cdf(value)
< h2>Beispiel
Im obigen Beispiel wird die empirische Verteilung der Daten an drei verschiedene theoretische Verteilungen angepasst (normal, Beta und Gamma). Es wurde festgestellt, dass die Gammaverteilung den niedrigsten SSE aufweist und daher am besten passt. Der p-Wert für den Wert 5 wird dann als kumulative Verteilungsfunktion der bei 5 bewerteten Gammaverteilung berechnet.
Das obige ist der detaillierte Inhalt vonWie kann ich mit SciPy in Python eine empirische Verteilung an eine theoretische anpassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!