Python 曲线将多个参数拟合到多个数据集
Python curve fit multiple parameters to multiple datasets
我正在尝试使用 scipy 的 curve_fit 函数来求解模型参数。我使用 作为起点并且能够满足我的需求,但现在我想使用两个输入数据集来导出将由两个数据集共享的模型参数(从长远来看我想使用两个以上的数据集,但作为起点,我使用两个)。
我认为最简单的方法可能是使用 curve_fit 并将我的数据作为矩阵输入。作为一个非常人为的例子,我尝试了 "augmenting" 上面 link 中的例子(我意识到这不是最漂亮的代码——我只是想了解我应该如何做这样做)。
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)
此脚本returns出现以下错误:
File "curveFitting.py", line 135, in
print curve_fit(func, (x,y), z, p0)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/optimize/minpack.py", line 533, in curve_fit
res = leastsq(func, p0, args=args, full_output=1, **kw)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/optimize/minpack.py", line 371, in leastsq
raise TypeError('Improper input: N=%s must not exceed M=%s' % (n, m))
TypeError: Improper input: N=3 must not exceed M=2
我是否尝试以 unintended/inappropriate 的方式使用 curve_fit?我应该使用另一个 function/library 吗?
错误是说你有 3 个变量和 2 个观察值,这是不允许的:变量的数量必须超过观察值的数量。
您设计的示例对每个数据集有 3 个观察值——这将是微不足道的,但是对于两个这样的数据集它应该可以工作。
但是,要使其与 curve_fit
一起使用,您的模型函数应使用 np.concatenate
或 np.flatten
为您的 2 个数据集创建一个包含六个观测值的一维数组每个 3 个观察值。也就是说,curve_fit
的模型函数返回的值必须是一维数组。
您询问替代函数或库:您可能会发现 lmfit
有用。在其他功能中,它允许多个自变量,而无需您 link 进行破解。它也可以与您的模型函数一起使用,而无需使用 np.concatenate
或 flatten
,因为它会自动为您执行此操作。此时,如果我不明确说明我是lmfit
的作者之一,就会有人评论。当然,我毫不怀疑您可以从 lmfit
文档和代码中看到这一点。
我正在尝试使用 scipy 的 curve_fit 函数来求解模型参数。我使用
我认为最简单的方法可能是使用 curve_fit 并将我的数据作为矩阵输入。作为一个非常人为的例子,我尝试了 "augmenting" 上面 link 中的例子(我意识到这不是最漂亮的代码——我只是想了解我应该如何做这样做)。
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)
此脚本returns出现以下错误:
File "curveFitting.py", line 135, in print curve_fit(func, (x,y), z, p0) File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/optimize/minpack.py", line 533, in curve_fit res = leastsq(func, p0, args=args, full_output=1, **kw) File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/optimize/minpack.py", line 371, in leastsq raise TypeError('Improper input: N=%s must not exceed M=%s' % (n, m)) TypeError: Improper input: N=3 must not exceed M=2
我是否尝试以 unintended/inappropriate 的方式使用 curve_fit?我应该使用另一个 function/library 吗?
错误是说你有 3 个变量和 2 个观察值,这是不允许的:变量的数量必须超过观察值的数量。
您设计的示例对每个数据集有 3 个观察值——这将是微不足道的,但是对于两个这样的数据集它应该可以工作。
但是,要使其与 curve_fit
一起使用,您的模型函数应使用 np.concatenate
或 np.flatten
为您的 2 个数据集创建一个包含六个观测值的一维数组每个 3 个观察值。也就是说,curve_fit
的模型函数返回的值必须是一维数组。
您询问替代函数或库:您可能会发现 lmfit
有用。在其他功能中,它允许多个自变量,而无需您 link 进行破解。它也可以与您的模型函数一起使用,而无需使用 np.concatenate
或 flatten
,因为它会自动为您执行此操作。此时,如果我不明确说明我是lmfit
的作者之一,就会有人评论。当然,我毫不怀疑您可以从 lmfit
文档和代码中看到这一点。