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

如何为LMFIT模型添加X轴偏移量?

解决LMFIT中带X轴偏移的幂律模型拟合问题

方法一:自定义带参数猜测的模型类(推荐)

直接继承Model类实现带X偏移的幂律模型,同时手动实现guess方法,既解决初始参数问题,又从根源避免NaN报错:

import numpy as np
from lmfit import Model
from lmfit.models import PowerlawModel, ConstantModel

def shifted_powerlaw(x, a, x0, b, d):
    # 加入极小值限制,避免(x-x0)为0/负导致幂运算出现NaN
    return a * np.power(np.maximum(x - x0, 1e-8), b) + d

class ShiftedPowerlawModel(Model):
    def __init__(self, **kwargs):
        super().__init__(shifted_powerlaw, **kwargs)
    
    def guess(self, data, x=None, **kwargs):
        # 用你手动验证过的偏移值做x0初始猜测
        x_shifted = x - 57923.24
        # 借助内置模型快速获取a、b、d的初始值
        pl_guess = PowerlawModel().guess(data, x=x_shifted)
        c_guess = ConstantModel().guess(data)
        
        return self.make_params(
            a=pl_guess['amplitude'].value,
            x0=57923.24,
            b=pl_guess['exponent'].value,
            d=c_guess['c'].value
        )

# 拟合示例
# 假设你已有x_data和y_data
model = ShiftedPowerlawModel()
params = model.guess(y_data, x=x_data)
# 给x0加边界,彻底杜绝(x-x0)为负的可能
params['x0'].max = np.min(x_data) - 1e-8
result = model.fit(y_data, params, x=x_data)
print(result.fit_report())

方法二:给ExpressionModel手动设置参数

如果想用ExpressionModel,可以跳过guess方法,直接手动设置初始参数并添加边界限制:

from lmfit import ExpressionModel
import numpy as np

model_expr = ExpressionModel('a * (x - x0)**b + d')
# 用经验值设置初始参数,d可以用数据均值快速初始化
params = model_expr.make_params(
    a=1, 
    x0=57923.24, 
    b=1, 
    d=np.mean(y_data)
)
# 强制x0不能超过x的最小值,避免出现负数幂运算
params['x0'].max = np.min(x_data) - 1e-8
# 拟合时跳过可能出现的NaN数据点(可选)
result = model_expr.fit(y_data, params, x=x_data, nan_policy='omit')
print(result.fit_report())

核心注意事项

  • NaN报错根源:拟合过程中x-x0可能变为0或负数,导致幂运算产生NaN。通过给x0设置上限+模型内的np.maximum限制,能彻底解决这个问题。
  • 初始参数优先级:LMFIT对初始参数敏感,直接用你手动验证过的x0值作为初始猜测,能大幅提升拟合成功率。

内容的提问来源于stack exchange,提问作者edgar_stackoverflow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:03:18