将数据点拟合为累积分布

时间:2013-09-17 12:36:16

标签: python numpy scipy probability-density cdf

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

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()的任何想法?

1 个答案:

答案 0 :(得分: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还实现了一个使用交叉验证选择最佳带宽的Guassian内核的好例子,您可以从中借用一些代码:

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

希望这有帮助!