Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么scipy.optimize.curve_fit()在fitting函数中定义了一定数量的aruments后性能更好?_Python_Scipy_Curve Fitting_Data Fitting_Scipy Optimize - Fatal编程技术网

Python 为什么scipy.optimize.curve_fit()在fitting函数中定义了一定数量的aruments后性能更好?

Python 为什么scipy.optimize.curve_fit()在fitting函数中定义了一定数量的aruments后性能更好?,python,scipy,curve-fitting,data-fitting,scipy-optimize,Python,Scipy,Curve Fitting,Data Fitting,Scipy Optimize,我试图将任意长度的多项式函数拟合到一些粒子数据中,并且我注意到,当拟合函数的参数显式表示时,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 i

我试图将任意长度的多项式函数拟合到一些粒子数据中,并且我注意到,当拟合函数的参数显式表示时,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])

以下是使用我自己的数据时拟合的比较:


有人对这种行为有什么解释吗?

事实上也是如此,问题是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')

它的工作原理实际上是一样的,问题是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')

如果您给出的起点接近预期起点,则搜索空间会更小。我知道这是真的,但我在这里为两种优化提供了相同的起始值,即[1,1]。我的问题不是如何让它表现得更好,而是为什么它的表现与明确说明拟合系数时不一样。抱歉,请重读一遍,我猜,第一个示例的计算公式比第二个示例的计算公式简单得多:)如果您给出的起点接近预期的起点,搜索空间会更小。我知道这是真的,但我在这里为两种优化提供了相同的起始值,即[1,1]。我的问题不是如何使其性能更好,而是为什么它的性能不与明确说明拟合系数时的性能相同。对不起,重读一遍,您的第一个示例的计算表达式比您的第二个示例简单得多。我猜:)非常感谢您的解决方案,它很有效!我不确定我是否理解为什么np.sum()只返回一个数字是一个问题-这不是curve_fit()对提供的拟合函数的要求吗?不,
curve_fit
要求拟合函数保留
x_数据的形状。通过这种方式,它可以将结果与
y\u数据
(在内部,我认为它会计算类似于
np.sum((fit(x\u数据,p…)-y\u数据)**2)
的结果进行比较,以获得剩余值)非常感谢您的解决方案,它可以工作!我不确定我是否理解为什么np.sum()只返回一个数字是一个问题-这不是curve_fit()对提供的拟合函数的要求吗?不,
curve_fit
要求拟合函数保留
x_数据的形状。通过这种方式,它可以将结果与
y\u数据
(在内部,我假设它计算类似于
np.sum的东西((fit(x\u数据,p..)-y\u数据)**2)
以获得剩余值)