拟合数据指向累积分布



我正在尝试将伽马分布拟合到我的数据点,我可以使用下面的代码来做到这一点。

import scipy.stats as ss
import numpy as np
dataPoints = np.arange(0,1000,0.2)
fit_alpha,fit_loc,fit_beta = ss.rv_continuous.fit(ss.gamma, dataPoints, floc=0)

我想使用许多这样的小伽马分布重建一个更大的分布(较大的分布与问题无关,只是证明为什么我试图拟合 cdf 而不是 pdf)。

为了实现这一点,我想将累积分布(而不是 pdf)拟合到较小的分布数据中。—更准确地说,我只想将数据拟合到累积分布的一部分

例如,我只想拟合数据,直到累积概率函数(具有一定的尺度和形状)达到 0.6。

关于为此目的使用fit()的任何想法?

我知道

您正在尝试使用几个小伽马分布分段重建您的 cdf,每个分布都有不同的比例和形状参数来捕获分布的"局部"区域。

如果你的经验分布是多模态的/难以用一个"全局"参数分布来概括,这可能是有意义的。

不知道你是否有具体的原因专门拟合几个伽马分布,但如果你的目标是尝试拟合一个相对平滑的分布,并且很好地捕捉你的经验CDF,也许你可以看看核密度估计。它本质上是一种将分布拟合到数据的非参数方法。

http://scikit-learn.org/stable/modules/density.htmlhttp://en.wikipedia.org/wiki/Kernel_density_estimation

例如,您可以尝试使用高斯核并更改带宽参数以控制拟合的平滑程度。带太小会导致不平滑("过拟合")结果[高方差,低偏差]。带宽过大会导致非常平滑的结果,但具有高偏差。

from sklearn.neighbors.kde import KernelDensity
kde = KernelDensity(kernel='gaussian', bandwidth=0.2).fit(dataPoints) 

选择平衡偏差 - 方差权衡的带宽参数的一个好方法是使用交叉验证。本质上,高级思想是您对数据进行分区,在训练集上运行分析并在测试集上"验证",这将防止数据过度拟合。

幸运的是,sklearn 还实现了一个使用交叉验证选择 Guassian 内核最佳带宽的很好的例子,您可以从中借用一些代码:

http://scikit-learn.org/stable/auto_examples/neighbors/plot_digits_kde_sampling.html

希望这有帮助!

相关内容

  • 没有找到相关文章

最新更新