【问题标题】:scipy.curve_fit not fitting when the exponent of an exp has an exponent itself (constant)当 exp 的指数本身具有指数(常数)时,scipy.curve_fit 不合适
【发布时间】:2020-07-23 00:41:23
【问题描述】:

我正在尝试拟合这条曲线:

def logistic2_model(x, a, b, dtau, tau):
    return a/(1+b*np.exp(-np.power((x-dtau)/tau, 0.9)))

使用曲线拟合

x = [54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L, 63L, 64L, 65L, 66L, 67L, 68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 76L, 77L, 78L, 79L, 80L, 81L, 82L, 83L, 84L, 85L, 86L, 87L, 88L, 89L, 90L, 91L, 92L, 93L, 94L, 95L, 96L, 97L, 98L, 99L]
y = [229.0, 322.0, 400.0, 650.0, 888.0, 1128.0, 1694.0, 2036.0, 2502.0, 3089.0, 3858.0, 4636.0, 5883.0, 7375.0, 9172.0, 10149.0, 12462.0, 15113.0, 17660.0, 21157.0, 24747.0, 27980.0, 31506.0, 35713.0, 41035.0, 47021.0, 53578.0, 59138.0, 63927.0, 69176.0, 74386.0, 80539.0, 86498.0, 92472.0, 97689.0, 101739.0, 105792.0, 110574.0, 115242.0, 119827.0, 124632.0, 128948.0, 132547.0, 135586.0, 139422.0, 143626.0]

p0 = [1.52646450e+05, 1.56215676e-01, 9.59401246e+01, 6.23161909e+00]
fit = curve_fit(logistic2_model, x, y, maxfev=100000, p0=p0)

只有在我使用 1.0 时才有效。如果我使用任何其他浮点数,即使接近,它只会达到 maxfev 而没有成功。使用 2.0 原则上它可以工作,但拟合的曲线没有任何意义。

p0 是指数等于 1.0 的拟合:

我最初的目标是将该指数添加到参数中以适应,但如果它不能像那样工作,那就没有希望了。

有什么提示吗?

【问题讨论】:

  • 你能提供xy吗?您可以使用最初的猜测绘制数据和模型;很有可能是p0;如果你明智地选择它,它会更好地工作。
  • 我编辑了问题以包含它们

标签: python scipy curve-fitting data-fitting scipy-optimize


【解决方案1】:

我犯了一个天真的错误,即没有检查函数的实际值。指数的底是负数,当然不能拟合函数。

【讨论】:

    【解决方案2】:

    请添加完整的代码,包括。绘图。

    对于测试,请使用 1.0 的收敛解,并将 0.95 和 1.05 的点添加到图中。这应该让我们和您了解您的方程对该参数的敏感程度。可能是方程式变得疯狂。

    对于您发布的解决方案 (0.9),返回的协方差矩阵仅为 np.inf

    文档对此进行了说明:

    如果解处的雅可比矩阵没有满秩,那么 另一方面,“lm”方法返回一个填充有 np.inf 的矩阵 ‘trf’ 和 ‘dogbox’ 方法使用 Moore-Penrose 伪逆来计算 协方差矩阵。

    您可以使用method='trf'method='dogbox' 尝试任何其他方法 看看这是否可行。

    但有可能你的变量中至少有两个调整相同的东西并且不是独立的。

    【讨论】:

      猜你喜欢
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多