【问题标题】:Estimating parameter values using optimize.curve.fit使用 optimize.curve.fit 估计参数值
【发布时间】:2013-12-04 00:48:20
【问题描述】:

我正在尝试估计非线性方程的参数:

y(x1, x2) = x1 / A + Bx1 + Cx2 

使用this question 的答案中概述的方法,但找不到有关如何将多个自变量适当地传递给 curve_fit 函数的文档。

具体来说,我试图根据植物密度 (x1) 和竞争对手的密度 (x2) 来估计植物生物量 (y)。对于植物密度和植物生物量之间的关系,我有三个指数方程(形式为 y = a[1-exp(-b*x1)]),对于三个竞争对手的密度具有不同的参数值:

For x2 == 146: y = 1697 * [1 - exp(-0.010 * x1)]

For x2 == 112: y = 1994 * [1 - exp(-0.023 * x1)]

For x2 == 127: y = 1022 * [1 - exp(-0.008 * x1)]

因此,我想编写如下代码:

def model_func(self, x_vals, A, B, C):
    return x_vals[0] / (A + B * x_vals[0] + C * x_vals[1])

def fit_nonlinear(self, d, y):
    opt_parms, parm_cov = sp.optimize.curve_fit(self.model_func, [x1, x2], y, p0 = (0.2, 0.004, 0.007), maxfev=10000)
    A, B, C = opt_parms
    return A, B, C

但是我还没有找到任何关于如何格式化参数 y(传递给 fit_nonlinear)以捕获 x_vals 的二维性质的文档(the documentation for curve_fit 声明 y 应该是一个 N 长度的序列)。我正在尝试使用curve_fit 吗?

【问题讨论】:

  • 我不太明白你的问题。 y(x1, x2) 是标量函数吗(即,给定两个数字 x1 和 x2,它返回一个数字?如果是,那么传递给 fit_nonlinear 的参数 y 不必是二维的。如果 y(x1, x2)应该是一个向量函数(它为每个 x1、x2 对返回两个数字),然后您可以将其拆分为两个标量函数(y1(x1,x2)y2(x1,x2))并分别拟合它们。
  • 前者:y(x1,x2) 返回给定 x1 和 x2 值的单个数字。但是,我不确定如何将 y 值构造为 N 长度序列,以便它们与 x 值的二维矩阵的关系清晰。

标签: python numpy scipy nonlinear-optimization


【解决方案1】:

根据您上面的评论,您想考虑使用矩阵的平面版本。如果您从 X1 和 X2 矩阵中获取相同的元素,则该对值具有相应的 y 值。这是一个最小的例子

import numpy as np
import scipy as sp
import scipy.optimize

x1 = np.linspace(-1, 1)
x2 = np.linspace(-1, 1)
X1, X2 = np.meshgrid(x1, x2)

def func(X, A, B, C):
    X1, X2 = X
    return X1 / (A + B * X1 + C * X2)

# generate some noisy points corresponding to a set of parameter values
p_ref = [0.15, 0.001, 0.05]
Yref = func([X1, X2], *p_ref)
std = Yref.std()
Y = Yref + np.random.normal(scale=0.1 * std, size=Yref.shape)

# fit a curve to the noisy points
p0 = (0.2, 0.004, 0.007)
p, cov = sp.optimize.curve_fit(func, [X1.flat, X2.flat], Y.flat, p0=p0)

# if the parameters from the fit are close to the ones used 
# to generate the noisy points, we succeeded
print p_ref
print p

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    相关资源
    最近更新 更多