使用Scipy拟合genpareto分布时如何设置形状参数的取值边界
Scipy拟合广义帕累托分布(genpareto)的参数约束方案
Scipy的scipy.stats.rv_continuous.fit方法原生支持参数边界约束,不需要额外编写复杂的自定义optimizer,你的原有代码主要是边界格式、参数传递逻辑不符合接口要求,以下是两种可直接运行的正确实现:
方案1:直接用fit方法自带的bounds参数(推荐)
无需自定义优化器,直接通过官方提供的bounds参数配置各参数的上下限即可:
import numpy as np import scipy.stats column = [17.5, 17.8, 22.4, 22.6 ,25, 25.2, 27.5, 30, 32.4, 32.5] dist = scipy.stats.genpareto # genpareto参数顺序为:形状参数c、loc、scale # 配置规则:bounds列表每个元素对应一个参数的(下界, 上界),None表示不限制 param = dist.fit( column, floc = np.min(column), # 固定loc为样本最小值 bounds = [(0, 0.5), (None, None), (0, None)] # 依次约束c∈(0,0.5),scale>0,固定的loc参数不受边界影响 ) c, loc, scale = param print(f"拟合结果:形状参数c={c:.4f}, loc={loc:.4f}, scale={scale:.4f}")
方案2:修正后的自定义optimizer实现
如果你确实需要自定义优化逻辑,原有代码需要修改边界格式、参数传递规则,修正后代码如下:
import numpy as np import scipy.stats from scipy.optimize import minimize column = [17.5, 17.8, 22.4, 22.6 ,25, 25.2, 27.5, 30, 32.4, 32.5] dist = scipy.stats.genpareto def optimizer(objective, x0, args=(), disp=False): # 因为loc已经被固定,待优化参数顺序为[c, scale],分别给两个参数设置边界 return minimize( objective, x0, args = args, method = 'TNC', bounds = [(0, 0.5), (0, None)] # c约束在(0,0.5),scale默认大于0 ) param = dist.fit( column, floc = np.min(column), optimizer = optimizer ) c, loc, scale = param print(f"拟合结果:形状参数c={c:.4f}, loc={loc:.4f}, scale={scale:.4f}")
两种方案输出结果一致,都可以得到形状参数在你要求的(0,0.5)区间内的拟合效果。
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

