使用Scipy和Matplotlib将数据拟合到多模态分布

9
我有一个数据集,想要将其拟合到已知的概率分布中。目的是在数据生成器中使用拟合后的PDF,以便可以从已知(拟合)的PDF中抽取数据样本。数据将用于模拟目的。目前,我只是从正态分布中抽样,这与真实数据不一致,因此模拟结果不准确。
我最初想使用以下方法: 如何使用Scipy(Python)将经验分布拟合到理论分布? 我最初想将其拟合到韦伯分布,但数据实际上是多峰的(附图)。所以我想需要结合多个分布,然后将数据拟合到结果分布,对吗?也许结合高斯和韦伯分布?
我如何使用混合/多峰分布的scipy fit()函数?
此外,我希望在Python中完成这项工作(即使用scipy / numpy / matplotlib),因为数据生成器是用Python编写的。
非常感谢!

histogram of data

1个回答

14

我建议使用核密度估计(KDE)。它会以概率密度函数的混合物形式给出解决方案。

SciPy 只有高斯核(对于您特定的直方图看起来不错),但是您可以在 statsmodelsscikit-learn 包中找到其他核函数。

参考下面这些相关函数:

from sklearn.neighbors import KernelDensity
from scipy.stats import gaussian_kde
from statsmodels.nonparametric.kde import KDEUnivariate
from statsmodels.nonparametric.kernel_density import KDEMultivariate

关于在Python中使用KDE的一个很好的资源在这里


4
谢谢Elad的回答。我认为一个核密度估计会很适合我的数据。然而,我该如何将拟合好的 KDE 曲线表示为数学方程?例如,多项式拟合曲线可以表示为 f(x) = x^2 + x + 1(示例)。是否有可能用公式表示通过 stats.gaussian_kde 得到的 KDE?这样我就可以把它放在纸上供他人复制/重用。谢谢! - Rosh
真的是一个非常好的资源。 - O.rka
我想做类似的事情(请看这里)。我正在寻找一种方法来估计多个概率分布的参数 - 我相信有一个非常简单的解决方案 - 也许你知道其中之一? - Stefan Falk

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