24

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

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()用于此目的吗?

4

1 回答 1

4

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

如果您的经验分布是多模态/难以通过一个“全局”参数分布来概括,则可能是有意义的。

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

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

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

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

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

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

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

希望这可以帮助!

于 2015-04-16T23:58:32.150 回答