我正在尝试将任意长度的多项式函数拟合到某些粒子数据,并且我注意到,当显式声明拟合函数的自变量而不是提供不确定数量的自变量时,curve_fit()的性能要好得多,即
import scipy.optimize as optimize
def fit(x, a, b):
return a + b*x
my_fit = optimize.curve_fit(fit, x_data, y_data)
表现优于
import scipy.optimize as optimize
import numpy as np
def fit(x, *args):
return np.sum([arg * x**i for i, arg in enumerate(args)])
my_fit = optimize.curve_fit(fit, x_data, y_data, p0=[1, 1])
这里是使用我自己的数据时拟合之间的比较:
Fitting with *args and explicit coefficients comparison
有人对此行为有任何解释吗?
np.sum
将始终产生单个数字。只需指定轴即可使用:import scipy.optimize as optimize
def fit(x, a, b):
return a + b*x
def fit2(x, *args):
return np.sum([arg * x**i for i, arg in enumerate(args)], axis=0)
x_data = np.linspace(-0.3, 0.3, 200)
y_data = x_data * 1000 + np.random.normal(size=x_data.shape[0], scale=20)
my_fit = optimize.curve_fit(fit, x_data, y_data, p0=[1, 1])
my_fit2 = optimize.curve_fit(fit2, x_data, y_data, p0=[1, 1])
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5))
ax1.scatter(x_data, y_data, alpha=0.5, color='red')
ax1.plot(x_data, fit(x_data, my_fit[0][0], my_fit[0][1]), color='k')
ax2.scatter(x_data, y_data, alpha=0.5, color='red')
ax2.plot(x_data, fit2(x_data, my_fit2[0][0], my_fit2[0][1]), color='k')