将数据点拟合到累积分布中

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)

我想使用许多小的Gamma分布来重构一个更大的分布(更大的分布与问题无关,只是为了证明我为什么要拟合累积分布而不是概率密度函数)。

为了实现这一目标,我希望将我的小分布数据拟合到累积分布而不是概率密度函数。—更准确地说,我只想将数据拟合到累积分布的一部分

例如,我只想将数据拟合到累积概率函数(具有特定比例和形状)达到0.6之前的部分。

您对使用fit()进行此目的有什么想法吗?


11
你可以从数据中构建经验分布函数,然后使用 curve_fit 函数将其拟合为伽马分布。详情请参考文档:http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html 。 - ev-br
2
我认为你的 ss.gamma.fit(dataPoints, floc=0) 并没有产生任何有意义的结果,因为你的 dataPoints 不是从伽马分布中取样得到的。fit 只能从样本点估计分布参数。如果你只想拟合 cdf 的形状,请遵循 Zhenya 的建议。或者,将样本点拟合到截断版本的伽马分布中。 - Josef
1
@Zhenya 是的,我也认为这是最后的办法,如果没有可用于执行此操作的函数,有多种原因。 其中一个原因是我想使用MLE而不是最小二乘法来完成此操作。其次,Gamma的cdf略微复杂(当然可以)。第三,您知道我如何像问题中提到的那样约束拟合吗? - Sahil M
2
http://en.wikipedia.org/wiki/Truncated_distribution,而在scipy.stats.distributions中,“ppf”是指反向累积分布函数(分位数函数)。 - Josef
2
正如@qarma所指出的,将数据点拟合到“cdf”并不是没有问题的,因为与传统估计器相比,它添加了额外的语义。其中一个原因是,“cdf”估计器的拟合对于坐标变换(例如,“F(x)=> F(-x)”或多元情况下的旋转)不是不变的,因为积分方向(例如,“x”或“-x”)很重要。@Benjamin,你能否提供更多的见解,看“cdf”而不是“pdf”的动机是什么? - Dietrich
显示剩余7条评论
1个回答

4
我知道您正在尝试用几个不同的比例和形状参数捕获分布的“局部”区域来逐步重构您的累积分布函数。如果您的经验分布是多峰的/难以用一个“全局”参数分布概括,这可能是有意义的。
不知道您是否有特定原因选择拟合几个伽马分布,但如果您的目标是尝试拟合一个相对平滑且能够很好地捕捉您的经验累积分布函数的分布,也许您可以看一下核密度估计。它本质上是一种非参数方法,可将分布拟合到您的数据中。
例如,您可以尝试使用高斯核并更改带宽参数以控制拟合的平滑程度。带宽过小会导致不平滑(“过拟合”)结果[高方差,低偏差]。带宽过大会导致非常平滑的结果,但偏差很高。 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 Kernel的最佳带宽,您可以从中借用一些代码:

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

希望这可以帮到您!


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