我希望使用Scipy的
每个组件都是不同的功能,但它们共享我希望适合的参数。理想情况下,我会这样做:
curve_fit
或其他更合适的工具来拟合一个向量输出的函数。例如,考虑以下函数:import numpy as np
def fmodel(x, a, b):
return np.vstack([a*np.sin(b*x), a*x**2 - b*x, a*np.exp(b/x)])
每个组件都是不同的功能,但它们共享我希望适合的参数。理想情况下,我会这样做:
x = np.linspace(1, 20, 50)
a = 0.1
b = 0.5
y = fmodel(x, a, b)
y_noisy = y + 0.2 * np.random.normal(size=y.shape)
from scipy.optimize import curve_fit
popt, pcov = curve_fit(f=fmodel, xdata=x, ydata=y_noisy, p0=[0.3, 0.1])
但是,curve_fit
不能处理向量输出的函数,并会抛出错误信息Result from function call is not a proper array of floats.
。相反,我将其输出展开,如下:
def fmodel_flat(x, a, b):
return fmodel(x[0:len(x)/3], a, b).flatten()
popt, pcov = curve_fit(f=fmodel_flat, xdata=np.tile(x, 3),
ydata=y_noisy.flatten(), p0=[0.3, 0.1])
这种方法是可行的。如果我不仅要拟合一个向量函数,而是要拟合多个具有不同输入但共享模型参数的函数,我可以连接输入和输出。
是否有更适合使用Scipy或其他附加模块拟合向量函数的方法?对我来说,主要考虑因素是效率 - 实际要拟合的函数要复杂得多,拟合需要一些时间,因此,如果这种使用curve_fit
的方法会导致过长的运行时间,我想知道应该怎么做。
scipy.optimize.least_squares
强制要求指定残差函数。你可以把压缩(或者其他更精细的操作)放在那里。 - Nathan Lloyd