首页 文章

Python曲线将多个参数拟合到多个数据集

提问于
浏览
0

我正在尝试使用scipy的curve_fit函数来求解模型参数 . 我使用Python curve_fit with multiple independent variables作为起点并且能够满足我的需求,但现在我想使用两个以上的数据集,但作为一个起点,我使用了两个) .

我认为最简单的方法可能是使用curve_fit并输入我的数据作为矩阵 . 作为一个非常人为的例子,我尝试在上面的链接中“扩充”这个例子(我意识到这不是最漂亮的代码 - 我只是试图弄清楚我应该如何做到这一点) .

def func(X, a, b, c):
    x,y = X
    result0 = np.log(a) + b*np.log(x[0]) + c*np.log(y[0])
    result1 = np.log(a) + b*np.log(x[1]) + c*np.log(y[1])
    return np.array([result0, result1])

# some artificially noisy data to fit
x0 = np.linspace(0.1,1.1,101)
y0 = np.linspace(1.,2., 101)

x1 = np.linspace(0.1,1.1,101)
y1 = np.linspace(1.,2., 101)

a, b, c = 10., 4., 6.

x = np.array([x0,x1])
y = np.array([y0,y1])

z = func((x,y), a, b, c)
z[0] = z[0] * 1 + np.random.random(101)/100
z[1] = z[1] * 1 + np.random.random(101)/100

# initial guesses for a,b,c:
p0 = 8., 2., 7.
print curve_fit(func, (x,y), z, p0)

此脚本返回以下错误:

文件“curveFitting.py”,第135行,打印curve_fit(func,(x,y),z,p0)文件“/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/ scipy / optimize / minpack.py“,第533行,在curve_fit中res = leastsq(func,p0,args = args,full_output = 1,** kw)文件”/System/Library/Frameworks/Python.framework/Versions/2.7 /Extras/lib/python/scipy/optimize/minpack.py“,第371行,inssq引发TypeError('输入错误:N =%s不得超过M =%s'%(n,m))TypeError:错误输入:N = 3不得超过M = 2

我是否尝试以无意/不合适的方式使用curve_fit?我应该使用另一个函数/库吗?

1 回答

  • 3

    错误是说你有3个变量和2个观察,这是不允许的:变量的数量必须超过观察的数量 .

    你设想的例子对每个数据集有3个观察 - 这是边缘的,但是有两个这样的数据集应该可以工作 .

    但是,为了使其与 curve_fit 一起使用,您的模型函数应使用 np.concatenatenp.flatten 来制作一维数组,其中包含每个3个观测值的2个数据集的六个观测值 . 也就是说, curve_fit 的模型函数返回的值必须是1-D数组 .

    你问一个替代函数或库:你可能会发现 lmfit 很有用 . 在其他功能中,它允许多个独立变量,而无需链接到的黑客 . 它也适用于您的模型功能,而不必使用 np.concatenateflatten ,因为它会自动为您执行此操作 . 在这一点上,如果我没有明确说明我是 lmfit 的作者之一,有人会发表评论 . 当然,我毫不怀疑你能够从 lmfit 文档和代码中看到这一点 .

相关问题