我有我想要拟合函数的时变数据跟踪。 函数的输入是列表,我希望 curve_fit 优化列表中的所有值以拟合曲线。 我已经得到了这么远-

from scipy.optimize import curve_fit
from matplotlib.pylab import plt
from numpy import exp

def ffunc2(x, a, b):
    counter = 0
    return_value = 0
    while counter < len(a):
        return_value += a[counter] * exp(b[counter] * x)
        counter += 1
    return return_value

# INITIAL DATA
x = [1, 2, 3, 5]
y = [1, 8, 81, 125]


number_variable = 2

# INTIAL GUESS
p0 = []
counter = 0
while counter < number_variable:
    p0.append(0.0)
    counter += 1

p, _ = curve_fit(ffunc2, x, y, p0=[0.0, 0.0])

我想创建一个循环,它进行迭代,通过最小化错误来为我提供最大数量的变量的最佳拟合。

我也发现了这个讨论 - 使用 scipy curve_fit for a variable number of parameters

from numpy import exp
from scipy.optimize import curve_fit

def wrapper_fit_func(x, N, *args):
    a, b, c = list(args[0][:N]), list(args[0][N:2*N]), list(args[0][2*N:3*N])
    return fit_func(x, a, b)

def fit_func(x, a, b):
    counter = 0
    return_value = 0
    while counter < len(a):
        return_value += a[counter] * exp(b[counter] * x)
        counter += 1
    return return_value


x = [1, 2, 3, 5]
y = [1, 8, 81, 125]
params_0 = [0,1.0,2.0,3.0,4.0,5.0]

popt, pcov = curve_fit(lambda x, *params_0: wrapper_fit_func(x, 3, params_0), x, y, p0=params_0)

但是得到一个错误 -´´´ File "C:\\python\\lib\\site-packages\\scipy\\optimize\\minpack.py", line 387, in leastsq raise TypeError('Improper input: N=%s must not become M =%s' % (n, m)) TypeError: 不正确的输入:N=6 不能超过 M=4 ´´´

#1楼 票数:1 已采纳

我能够直接使用 sci_py.optimize.least_squares 来解决这个问题,因为它接受元组作为输入而不是直接变量。 但我必须定义误差函数。 我认为它有助于解决我现在的问题。

from scipy.optimize import least_squares
from matplotlib.pylab import plt
from numpy import exp
import numpy as np


# define function to fit
def ffunc2(a, x):
    counter = 0
    return_value = 0
    while counter < len(a):
        return_value += a[counter] * exp(x * a[counter + 1])
        counter += 2

    return return_value


def error_func(tpl, x, y):
    return ffunc2(tpl,x) - y


# INPUT DATA
x = np.array([1, 2, 3, 5])
y = np.array([0.22103418, 0.24428055, 0.26997176, 0.32974425,])

# INITIAL GUESS
p0 = (1, 1)*10
output = least_squares(error_func, x0=p0, jac='2-point', bounds=(0, np.inf), method='trf', ftol=1e-08,
                       xtol=1e-08, gtol=1e-08, x_scale=1.0, loss='linear', f_scale=1.0, diff_step=None,
                       tr_solver=None,
                       tr_options={}, jac_sparsity=None, max_nfev=None, verbose=0, args=(x, y))

tpl_final = output.x
print (tpl_final)

final_curve = ffunc2(tpl_final,x)

plt.plot(x, y, 'r-', x, final_curve, 'g-')
plt.show()

#2楼 票数:0

最简洁的答案是不”。 curve_fit需要一个变量参数列表/ndarray,这些参数按顺序与您提供的模型函数的参数相对应。 也就是说,您必须明确命名函数中的所有参数,并使您的变量列表列表严格为一维。

话又说回来, curve_fit不低于周围的包装更scipy.optimize.least_squares 要使用这种方法,您需要传入一个(仍然严格为一维的)列表/ndarray,并使用这些值来构建要从该单个变量数组最小化的数组(通常是data-model )。 在一些具有许多组件或数据集的复杂情况下,这会变得更容易使用。 也就是说, curve_fit方法不能很好地扩展到 50 个位置变量。

根据您的问题的性质,您可能还会发现lmfit ( https://lmfit.github.io/lmfit-py/ -- 免责声明:我是原作者) 很有用。 这按名称组织参数,而不是在列表中的位置,并提供更多内置方法来约束参数和探索不确定性。 对于您的情况可能特别重要的是,用于曲线拟合的lmfit.Model类包括将模型轻松添加到复合材料中的能力(例如, https://lmfit.github 中显示的 2 个高斯 + n 指数背景。 io/lmfit-py/examples/documentation/builtinmodels_nistgauss2.html )。 这可能会帮助您表达您正在尝试做的事情。

  ask by codingtoddler translate from so

未解决问题?本站智能推荐:

1回复

使用带权重的scipy.optimize.curve_fit

根据文档 ,参数sigma可用于设置拟合中数据点的权重。 当参数absolute_sigma=True时,这些“描述”1-sigma错误。 我有一些人为的正常分布噪声数据,这些数据有所不同: 如果我想使用curve_fit将嘈杂的y拟合到f ,那么我应该设置sigma ? 这里
2回复

无法使用scipy.optimize.curve_fit拟合ECDF

我正在尝试使用平滑函数(参数小于5)来估计经验累积分布函数( 我想近似的ECDF ),例如广义逻辑函数 。 但是,使用scipy.optimize.curve_fit ,拟合操作会给出非常差的近似值,或者根本不起作用(取决于初始值)。 变量series表示我的数据存储为pandas.Se
1回复

使用 scipy.optimize.curve_fit 绘制图形

我在理解optimize.curve_fit函数时遇到问题。 我的拟合函数是幂律。 但我不知道 plot 命令中的第二个值应该是什么? 首先我们必须调用函数ff(L,v)它会返回给我们拟合线但我们没有调用这个函数。 这个命令是如何工作的,我想知道。
1回复

如何使用“scipy.optimize.curve_fit”顺利拟合我的数据点?

我想使用scipy.optimize.curve_fit来拟合一些数据点。 不幸的是,我得到一个不稳定的适合,我不知道为什么。 我会期望某种平滑的曲线。 有人可以解释我在这里做错了什么吗?
1回复

使用scipy.optimize.curve_fit传递其他参数?

我正在用Python编写一个程序,它将高斯和洛伦兹的形状与某些给定的共振数据相匹配。 我最初开始使用scipy.optimize.leastsq但在从协方差矩阵中检索优化参数中的错误时遇到困难后改为使用optimize.curve_fit 。 我已经定义了一个函数来拟合Gaussian和
1回复

使用 scipy.optimize.curve_fit 执行加权线性拟合

我想执行的加权线性拟合来提取参数m和c在方程y = mx+c 。 我要执行拟合的数据是: 我想使用scipy.optimize.curve_fit但是当每个 y 数据点都有与之相关的错误时,我不知道如何使用它。
2回复

在类中使用scipy.optimize.curve_fit

我有一堂课描述一个数学函数。 该类必须能够最小二乘拟合以适合传入的数据。 即您可以调用这样的方法: 并调整其内部变量以最适合数据。 我正在尝试为此使用scipy.optimize.curve_fit,它需要我传入模型函数。 问题在于模型函数在类之内,并且需要访问该类的变量和成员以
1回复

使用参数作为scipy.optimize.curve_fit的界限

我想知道是否可以为curve_fit()的参数设置界限,以使界限取决于另一个参数。 例如,假设我想将直线的斜率设置为大于截距。 我知道这是行不通的,因为参数b在界限内被调用之前没有定义,但是我不确定是否有办法使它起作用?