Sah*_*l M 23 python numpy scipy cdf probability-density
我正在尝试将伽玛分布拟合到我的数据点,我可以使用下面的代码来实现.
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)
Run Code Online (Sandbox Code Playgroud)
我想使用许多这样的小伽马分布来重建更大的分布(较大的分布与问题无关,只能证明我为什么要尝试拟合cdf而不是pdf).
为了实现这一点,我希望将累积分布(而不是pdf)与我的较小分布数据相匹配.- 更确切地说,我想将数据仅适用于累积分布的一部分.
例如,我只想拟合数据,直到累积概率函数(具有一定的比例和形状)达到0.6.
fit()为此目的使用的任何想法?
小智 4
我知道您正在尝试使用几个小的伽马分布分段重建您的 cdf,每个分布具有不同的尺度和形状参数来捕获分布的“局部”区域。
如果您的经验分布是多模态的/难以用一个“全局”参数分布来概括,则可能是有意义的。
不知道您是否有专门拟合多个伽马分布的具体原因,但如果您的目标是尝试拟合相对平滑并很好地捕获经验 cdf 的分布,也许您可以看看核密度估计。它本质上是一种将分布拟合到数据的非参数方法。
http://scikit-learn.org/stable/modules/ 密度.html http://en.wikipedia.org/wiki/Kernel_密度_估计
例如,您可以尝试高斯内核并更改带宽参数来控制拟合的平滑程度。带宽太小会导致不平滑(“过度拟合”)结果[高方差,低偏差]。带宽太大会导致非常平滑的结果,但偏差较高。
from sklearn.neighbors.kde import KernelDensity
kde = KernelDensity(kernel='gaussian', bandwidth=0.2).fit(dataPoints)
Run Code Online (Sandbox Code Playgroud)
选择平衡偏差-方差权衡的带宽参数的一个好方法是使用交叉验证。本质上,高层次的想法是对数据进行分区,对训练集进行分析并在测试集上进行“验证”,这将防止数据过度拟合。
幸运的是,sklearn 还实现了一个很好的示例,使用交叉验证选择高斯内核的最佳带宽,您可以从中借用一些代码:
http://scikit-learn.org/stable/auto_examples/neighbors/plot_digits_kde_sampling.html
希望这可以帮助!