gpt4 book ai didi

python - 在 scipy 函数 curve_fit 中使用不确定数量的参数

转载 作者:行者123 更新时间:2023-12-04 21:09:11 26 4
gpt4 key购买 nike

第一个问题:
我试图用以下形式的函数拟合实验数据:

f(x) = m_o*(1-exp(-t_o*x)) + ... + m_j*(1-exp(-t_j*x))

目前,我没有找到一种方法来获得不确定数量的参数 m_j、t_j,我被迫做这样的事情:
def fitting_function(x, m_1, t_1, m_2, t_2):
return m_1*(1.-numpy.exp(-t_1*x)) + m_2*(1.-numpy.exp(-t_2*x))

parameters, covariance = curve_fit(fitting_function, xExp, yExp, maxfev = 100000)

(xExp 和 yExp 是我的实验点)

有没有办法像这样编写我的拟合函数:
def fitting_function(x, li):
res = 0.
for el in range(len(li) / 2):
res += li[2*idx]*(1-numpy.exp(-li[2*idx+1]*x))
return res

其中 li 是拟合参数列表,然后进行曲线拟合?我不知道如何告诉 curve_fit 拟合参数的数量是多少。
当我尝试使用这种形式进行 fit_function 时,出现“ValueError:无法确定拟合参数的数量”等错误。

第二个问题:
有没有办法强制我的拟合参数为正?

任何帮助表示赞赏:)

最佳答案

看我的问答here .我还制作了一个最小的工作示例,演示如何为您的应用程序完成它。我没有声称这是最好的方法 - 我自己正在处理这一切,所以任何批评或简化都值得赞赏。

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as pl

def wrapper(x, *args): #take a list of arguments and break it down into two lists for the fit function to understand
N = len(args)/2
amplitudes = list(args[0:N])
timeconstants = list(args[N:2*N])
return fit_func(x, amplitudes, timeconstants)


def fit_func(x, amplitudes, timeconstants): #the actual fit function
fit = np.zeros(len(x))
for m,t in zip(amplitudes, timeconstants):
fit += m*(1.0-np.exp(-t*x))
return fit

def gen_data(x, amplitudes, timeconstants, noise=0.1): #generate some fake data
y = np.zeros(len(x))
for m,t in zip(amplitudes, timeconstants):
y += m*(1.0-np.exp(-t*x))
if noise:
y += np.random.normal(0, noise, size=len(x))
return y


def main():
x = np.arange(0,100)
amplitudes = [1, 2, 3]
timeconstants = [0.5, 0.2, 0.1]
y = gen_data(x, amplitudes, timeconstants, noise=0.01)

p0 = [1, 2, 3, 0.5, 0.2, 0.1]
popt, pcov = curve_fit(lambda x, *p0: wrapper(x, *p0), x, y, p0=p0) #call with lambda function
yfit = gen_data(x, popt[0:3], popt[3:6], noise=0)
pl.plot(x,y,x,yfit)
pl.show()
print popt
print pcov

if __name__=="__main__":
main()

警告的话,虽然。指数的线性和将使拟合对任何噪声非常敏感,特别是对于大量参数。您可以通过向脚本中生成的数据添加甚至少量噪声来测试它 - 即使很小的偏差也会导致它完全得到错误的答案,而拟合仍然通过肉眼看起来完全有效(测试噪声 = 0、0.01 和0.1)。即使合身看起来不错,也要非常小心地解释您的结果。它也是一种允许变量交换的形式:即使您将任何 (m_i, t_i) 对与 (m_j, t_j) 交换,最佳拟合解决方案也是相同的,这意味着您的卡方具有多个相同的局部最小值,这可能意味着您的变量在拟合过程中会被交换,这取决于您的初始条件。这不太可能是提取这些参数的数字稳健方法。

对于你的第二个问题,是的,你可以通过像这样定义指数:
m_0**2*(1.0-np.exp(-t_0**2*x)+...
基本上,在您的实际拟合函数中对它们进行平方,拟合它们,然后对结果(可能是负数或正数)进行平方以获得您的实际参数。您还可以使用不同的代理形式将变量定义在某个范围之间。

关于python - 在 scipy 函数 curve_fit 中使用不确定数量的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38327846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com