我正在尝试使用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 =最小平方(func,p0,args = args,full_output = 1,** kw) 文件“ /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/optimize/minpack.py”,第371行,至少 引发TypeError('输入错误:N =%s不能超过M =%s'%(n,m)) TypeError:输入不正确:N = 3不能超过M = 2
我是否试图以意外/不合适的方式使用curve_fit?我应该使用另一个功能/库吗?
答案 0 :(得分:3)
错误是说您有3个变量和2个观察值,这是不允许的:变量的数量必须超过观察值的数量。
您设计的示例对每个数据集都有3个观察值-这是微不足道的,但是对于两个这样的数据集,它应该可以工作。
但是,要使其与curve_fit
一起使用,您的模型函数应使用np.concatenate
或np.flatten
为包含3个观测值的2个数据集的6个观测值建立一维数组每。也就是说,模型函数为curve_fit
返回的值必须是一维数组。
您询问其他功能或库:您可能会发现lmfit
有用。除其他功能外,它还允许多个独立变量,而无需链接到您的hack。它也可以与模型函数一起使用,而不必使用np.concatenate
或flatten
,因为它将自动为您完成此操作。在这一点上,如果我没有明确声明我是lmfit
的作者之一,就会有人发表评论。当然,毫无疑问,您可以从lmfit
文档和代码中看到这一点。