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

9

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

import seaborn as sns
import scipy.stats as stats

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

但我遇到了这个错误:
属性错误:'poisson_gen'对象没有'fit'属性
其他分布(gamma等)工作正常。

3
相关链接:https://github.com/scipy/scipy/issues/2184 - unutbu
1个回答

16

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

我对seaborn.distplot函数不太熟悉,但它似乎假定数据来自连续分布。如果是这种情况,即使scipy.stats.poisson有一个fit方法,也不适合传递给distplot


问题的标题是“如何使用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

生成一些要处理的数据:
In [140]: x = poisson.rvs(0.4, size=100)

这些是x中的值:
In [141]: k = np.arange(x.max()+1)

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

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

泊松分布参数的最大似然估计值就是数据的均值:
In [144]: mlest = x.mean()

使用poisson.pmf()获取期望概率,乘以数据集的大小以获取期望计数,然后使用matplotlib进行绘图。 条形图是实际数据的计数,点是拟合分布的期望计数:
In [145]: plt.plot(k, poisson.pmf(k, mlest)*len(x), 'go', markersize=9)
Out[145]: [<matplotlib.lines.Line2D at 0x114da74d0>]

plot


它还可以在数据上绘制估计的概率密度函数图。是的,这似乎是一个假设。概率密度函数(PDF)意味着连续随机变量。 - ayhan
我认为使用distplot展示离散分布是可能的,但可能需要调整多个参数。countplot可能是更好的选择(确保使用order=)。 - mwaskom
1
@mwaskom 感谢您的提示。我在答案中添加了使用 countplot 生成的图表。 - Warren Weckesser
@WarrenWeckesser 很棒! - mwaskom
这真的帮了我很多,@WarrenWeckesser。非常感谢。 - mechanical_meat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接