如何使用seaborn拟合泊松分布?

ben*_*llo 6 poisson scipy seaborn

我尝试将我的数据拟合到泊松分布:

import seaborn as sns
import scipy.stats as stats

sns.distplot(x, kde = False, fit = stats.poisson)
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

AttributeError:'poisson_gen'对象没有属性'fit'

其他分布(伽马等)也很好用.

War*_*ser 11

泊松分布(在SciPy的作为实现scipy.stats.poisson)是离散分布.scipy中的离散分布没有fit方法.

我对这个seaborn.distplot功能不太熟悉,但似乎假设数据来自连续分布.如果是这种情况,那么即使scipy.stats.poissonfit方法,也不适合传递给它distplot.


问题标题是"如何使用seaborn拟合泊松分布?",因此为了完整起见,这是获得数据图及其拟合的一种方法. seaborn仅用于条形图,使用@ mwaskom的建议seaborn.countplot.拟合实际上是微不足道的,因为泊松分布的最大似然估计仅仅是数据的均值.

一,进口:

In [136]: import numpy as np

In [137]: from scipy.stats import poisson

In [138]: import matplotlib.pyplot as plt

In [139]: import seaborn
Run Code Online (Sandbox Code Playgroud)

生成一些数据以使用:

In [140]: x = poisson.rvs(0.4, size=100)
Run Code Online (Sandbox Code Playgroud)

这些是以下值x:

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

In [142]: k
Out[142]: array([0, 1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

使用seaborn.countplot绘制数据:

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

泊松参数的最大似然估计仅仅是数据的均值:

In [144]: mlest = x.mean()
Run Code Online (Sandbox Code Playgroud)

使用poisson.pmf()来获得预期的概率,并通过数据设置,以获得预期的计数的大小相乘,然后绘制使用matplotlib.条形图是实际数据的计数,点是拟合分布的预期计数:

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

情节