2016-05-28 14 views
2

Ich versuche, meine Daten zu einer Poisson-Verteilung zu passen:Wie passt man eine Poisson-Verteilung mit Seabohnen an?

import seaborn as sns 
import scipy.stats as stats 

sns.distplot(x, kde = False, fit = stats.poisson) 

Aber ich bekomme diese Fehlermeldung:

Attribute: 'poisson_gen' Objekt hat kein Attribut 'passen'

Andere Verteilung (Gamma usw.) gut funktionieren.

+2

Verwandte: https://github.com/scipy/scipy/issues/2184 – unutbu

Antwort

6

Die Poisson distribution (implementiert in scipy als scipy.stats.poisson) ist eine discrete distribution. Die diskreten Verteilungen in scipy haben keine fit Methode.

Ich bin nicht sehr vertraut mit der seaborn.distplot-Funktion, aber es scheint anzunehmen, dass die Daten aus einer kontinuierlichen Verteilung stammen. Wenn das der Fall ist, dann wäre scipy.stats.poisson eine fit Methode, es wäre keine geeignete Verteilung, die an distplot übergeben werden.


Die Frage Titel „Wie man eine Poisson-Verteilung mit Seaborn passen?“, Also der Vollständigkeit halber, hier ist eine Möglichkeit, eine Darstellung der Daten und deren Sitz zu erhalten. seaborn wird nur für das Balkendiagramm verwendet, wobei @ mwaskoms Vorschlag verwendet wird, seaborn.countplot zu verwenden. Die Anpassung ist tatsächlich trivial, weil die Maximum-Likelihood-Schätzung für die Poisson-Verteilung einfach der Mittelwert der Daten ist.

Zunächst werden die Importe:

In [136]: import numpy as np 

In [137]: from scipy.stats import poisson 

In [138]: import matplotlib.pyplot as plt 

In [139]: import seaborn 

einige Daten generieren, mit zu arbeiten:

In [140]: x = poisson.rvs(0.4, size=100) 

Dies sind die Werte in der x:

In [141]: k = np.arange(x.max()+1) 

In [142]: k 
Out[142]: array([0, 1, 2, 3]) 

Verwenden seaborn.countplot plotten die Daten:

In [143]: seaborn.countplot(x, order=k, color='g', alpha=0.5) 
Out[143]: <matplotlib.axes._subplots.AxesSubplot at 0x114700490> 

Die Maximum-Likelihood-Schätzung der Poisson-Parameter ist einfach der Mittelwert der Daten:

In [144]: mlest = x.mean() 

Verwenden poisson.pmf() die erwartete Wahrscheinlichkeit, zu erhalten und durch die Größe des Datensatzes zu erhalten, die erwarteten Zählwerte multiplizieren und plotten Sie dann unter Verwendung von matplotlib. Die Balken sind die Zählungen der aktuellen Daten, und die Punkte sind die erwarteten Zählwerte der angepassten Verteilung:

In [145]: plt.plot(k, poisson.pmf(k, mlest)*len(x), 'go', markersize=9) 
Out[145]: [<matplotlib.lines.Line2D at 0x114da74d0>] 

plot

+0

"Es kann auch (...) das geschätzte PDF über die Daten plotten." Ja, es scheint die Annahme zu sein. PDF (Wahrscheinlichkeitsdichtefunktion) impliziert eine kontinuierliche Zufallsvariable. – ayhan

+0

Ich würde sagen, dass es möglich ist, eine diskrete Verteilung mit "distplot" zu zeigen, aber könnte einige Parameter optimieren. 'countplot' könnte eine bessere Wahl sein (stellen Sie sicher, dass Sie' order = 'verwenden). – mwaskom

+1

@mwaskom Danke für den Tipp. Ich fügte der Antwort ein mit 'countplot' erzeugtes Plot hinzu. –