Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich SciPy verwenden, um die am besten passende theoretische Verteilung für einen empirischen Datensatz zu finden und Wahrscheinlichkeiten zu berechnen, die einen bestimmten Schwellenwert überschreiten?

Wie kann ich SciPy verwenden, um die am besten passende theoretische Verteilung für einen empirischen Datensatz zu finden und Wahrscheinlichkeiten zu berechnen, die einen bestimmten Schwellenwert überschreiten?

DDD
DDDOriginal
2024-11-24 11:36:09469Durchsuche

How can I use SciPy to find the best-fitting theoretical distribution for an empirical dataset and calculate probabilities exceeding a given threshold?

Anpassen empirischer Verteilungen an theoretische mit Scipy

Problemübersicht

Betrachten Sie einen Datensatz ganzzahliger Werte, die aus einer unbekannten kontinuierlichen Verteilung entnommen wurden. Wir versuchen, die Wahrscheinlichkeit (p-Wert) zu bestimmen, auf Werte zu stoßen, die über einem bestimmten Schwellenwert liegen. Um diese Wahrscheinlichkeiten genau abzuschätzen, ist es wichtig, unsere empirische Verteilung an eine geeignete theoretische Verteilung anzupassen. In diesem Artikel wird untersucht, wie eine solche Anpassung mit Scipy in Python durchgeführt wird.

Verteilungsanpassung

Um die Güte der Anpassung zu beurteilen, können wir eine Summe quadrierter Fehler verwenden (SSE)-Metrik zum Vergleich der Histogramme der empirischen Daten und der angepassten Verteilungen. Die Verteilung mit dem niedrigsten SSE gilt als die beste Anpassung.

Scipy-Implementierung

Das Statistikmodul von Scipy bietet eine breite Palette kontinuierlicher Verteilungsklassen. Wir können jede Verteilung durchlaufen, ihre Parameter schätzen, den SSE berechnen und die Ergebnisse speichern.

Beispiel: El Niño-Datensatz

Lassen Sie uns den Prozess veranschaulichen unter Verwendung von Daten zur Meeresoberflächentemperatur (SST) aus dem El-Niño-Datensatz.

  1. Laden Sie die Daten und zeichnen Sie sie auf Histogramm.
  2. Führen Sie eine Verteilungsanpassung mithilfe der SSE-Metrik durch.
  3. Identifizieren Sie die am besten geeignete Verteilung basierend auf dem niedrigsten SSE.
  4. Plotten Sie die Wahrscheinlichkeitsdichtefunktion (PDF) der Best-Fit-Verteilung zusammen mit dem empirischen Histogramm.

Der folgende Code zeigt dies Implementierung:

import numpy as np
import pandas as pd
import scipy.stats as st
import matplotlib.pyplot as plt
from scipy.stats._continuous_distns import _distn_names
import warnings

# El Niño SST data
data = pd.Series(sm.datasets.elnino.load_pandas().data.set_index('YEAR').values.ravel())

# Function to fit distributions based on SSE
def best_fit_distribution(data):
    return sorted(
        [
            (getattr(st, distribution), distribution.fit(data), np.sum(np.power(data.hist(bins=50).values - distribution.pdf(data.index), 2.0))) 
            for distribution in _distn_names 
            if not distribution in ['levy_stable', 'studentized_range']
        ], 
    key=lambda x:x[2]
)

# Find best fit
best_dist = best_fit_distribution(data)[0]

# Plot distribution
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(data.hist(bins=50, density=True, alpha=0.5, color='gray'))
param_names = best_dist[0].shapes + ', loc, scale' if best_dist[0].shapes else ['loc', 'scale']
param_str = ', '.join(['{}={:0.2f}'.format(k, v) for k, v in zip(param_names, best_dist[1])])
dist_str = '{}({})'.format(best_dist[0].name, param_str)

ax.plot(best_dist[0].pdf(data.index, **best_dist[1]), lw=2, label=dist_str)
ax.set_title('Fitted Distribution: ' + dist_str)
ax.set_xlabel('SST (°C)')
ax.set_ylabel('Frequency')
ax.legend()

Die Ausgabe zeigt die am besten geeignete Verteilung als Weibull-Verteilung mit Parametern:

scale=0.64, loc=15.59

Das obige ist der detaillierte Inhalt vonWie kann ich SciPy verwenden, um die am besten passende theoretische Verteilung für einen empirischen Datensatz zu finden und Wahrscheinlichkeiten zu berechnen, die einen bestimmten Schwellenwert überschreiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn