为什么scipy.optimize.curve_fit()在拟合函数中定义了数量的aru后表现更好?

问题描述 投票:1回答:1

我正在尝试将任意长度的多项式函数拟合到某些粒子数据,并且我注意到,当显式声明拟合函数的自变量而不是提供不确定数量的自变量时,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

有人对此行为有任何解释吗?

python scipy curve-fitting data-fitting scipy-optimize
1个回答
0
投票
它实际上是一样的,问题是fit的第二个定义不适用于numpy数组,因为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')

enter image description here
© www.soinside.com 2019 - 2024. All rights reserved.