You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:39:03