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

Python 将数据点拟合到累积分布,python,numpy,scipy,probability-density,cdf,Python,Numpy,Scipy,Probability Density,Cdf,我正在尝试将gamma分布拟合到我的数据点,我可以使用下面的代码来实现这一点 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分布重建一个更大的分布(较大的分布与这个问题无关,只是证明了为什么我尝试拟

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

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分布重建一个更大的分布(较大的分布与这个问题无关,只是证明了为什么我尝试拟合cdf而不是pdf)

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

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


有没有想过使用
fit()
来实现这一目的?

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

如果你的经验分布是多模态的/很难用一个“全局”参数分布来概括,那么这可能是有意义的

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

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

from sklearn.neighbors.kde import KernelDensity
kde = KernelDensity(kernel='gaussian', bandwidth=0.2).fit(dataPoints) 
然后,选择平衡偏差-方差权衡的带宽参数的一个好方法是使用交叉验证。本质上,高层次的想法是划分数据,在训练集上运行分析,在测试集上“验证”,这将防止数据拟合过度

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


希望这有帮助

你能从你的数据中构造一个经验cdf,并使用例如
curve\u fit
将其拟合到gamma cdf吗?我认为你的
ss.gamma.fit(dataPoints,floc=0)
不会产生任何有意义的结果,因为你的数据点不是gamma分布的样本<代码>拟合只能从样本点估计分布参数。如果您只是想适合cdf的形状,请遵循Zhenya的建议。或者,将样本点拟合到伽马分布的截断版本。@Zhenya是的,我认为这是最后的手段,如果函数不可用,出于多种原因,其中一个原因是我想使用MLE来代替最小二乘法。其次,伽马的cdf有点不平凡(但当然可能)。第三,你知道我如何限制问题中提到的适合度吗?而
ppf
是scipy.stats.distributions中所称的逆cdf(分位数函数)。正如@qarma所指出的,将数据点拟合到
cdf
并非没有问题,因为它比传统的估计器增加了额外的语义。一个原因是,对
cdf
估计器的拟合对于坐标变换(例如,
F(x)=>F(-x)
,或多元情况下的旋转)不是不变的,因为积分方向(例如,
x
-x
)很重要@本杰明,你能提供更多的见解吗?看
cdf
s而不是
pdf
s的动机是什么?