为什么“scipy.optimize.minimize”给了我这么差劲?

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

我有一个函数y(x,z)有两个变量xz和6个系数abcdef。我有xz的数据,让我们说测试目的是系数的数据。有了这些数据,我计算了我的y

然后我想用qazxsw poi,qazxsw poi和计算的qazxsw poi的数据拟合函数来获得系数并将它们与测试目的进行比较。

x

我从拟合得到以下系数:

z

与我计算y数据的系数相比,拟合并不是我称之为适当的。有人能解释我为什么我的健康如此糟糕?

P.S。:如果有人想知道,我使用import numpy as np from scipy.optimize import minimize x = np.array([0,0.25,0.5,0.75,1]) # data of variable x z = np.array([0,0.25,0.5,0.75,1]) # data of variable z def func(pars,x,z): #my function a,b,c,d,e,f = pars return a*x**2+b*x+c+d*z+e*z*x+f*z*x**2 a = np.array([1,1,1,1,1]) #define coefficients to get the y data and compare them later with fit b = np.array([0.5,0.5,0.5,0.5,0.5]) c = np.array([0.25,0.25,0.25,0.25,0.25]) d = np.array([1,1,1,1,1]) e = np.array([0.5,0.5,0.5,0.5,0.5]) f = np.array([0.25,0.25,0.25,0.25,0.25]) y = [] y.append(func((a,b,c,d,e,f),x,z)) #calculate the y data print(y) def resid(pars,x,z,y): #residual function return ((func(pars,x,z) - y) ** 2).sum() pars0 = np.array([0,0,0,0,0,0]) res = minimize(resid, pars0,args=(x,z,y), method='cobyla',options={'maxiter': 5000000}) print("a = %f , b = %f, c = %f, d = %f, e = %f, f = %f" % (res.x[0], res.x[1], res.x[2], res.x[3], res.x[4], res.x[5])) 因为我必须在以后定义一些约束。这只是一个测试代码,可以找出我的问题所在(希望如此)。

python scipy curve-fitting minimize
1个回答
2
投票

看看a = 1.181149 , b = 1.228558, c = 0.253053, d = 0.219143, e = 0.444941, f = 0.172369 ,这是在你的情况下围绕y,实际上非常好。

很可能你找到了目标函数的局部最小值。若要更好地了解此行为,请尝试下面的代码。这将为不同的起点生成不同的结果。正如您将看到的那样,您正在最小化,而不是全球最低限度。要全局优化,您必须使用其他方法/方法。您还可以增加何时停止优化的标准。或者使用混合方法并从不同的初始点开始,解决局部最小化并获得最佳值。

cobyla

尝试接近您正在寻求的解决方案的初始点。这很可能会产生全局结果。如果您不知道解决方案的模糊位置,则可能必须使用混合/全局方法来最小化。

例如,初始点:

res.fun

产生一个非常合适的解决方

© www.soinside.com 2019 - 2024. All rights reserved.