为什么“ scipy.optimize.minimize”会给我带来如此不适?

时间:2019-03-04 14:32:10

标签: python scipy curve-fitting minimize

我有一个函数y(x,z),其中有两个变量xz和6个系数abc,{{1 }},de。我有fx的数据,为了进行测试,我们假设系数的数据。利用这些数据,我计算出了z

然后,我想用yx和计算出的z的数据来拟合函数,以获取系数并将其与测试目的之一进行比较。

y

我从拟合中得到以下系数:

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]))

与我的用于计算a = 1.181149 , b = 1.228558, c = 0.253053, d = 0.219143, e = 0.444941, f = 0.172369 数据的系数相比,拟合并不符合我所说的适度。有人可以解释一下我的身材为什么这么差吗?

P.S .:如果有人想知道,我使用y,因为稍后必须定义一些约束。这只是一个测试代码,可以(希望)找出我的问题所在。

1 个答案:

答案 0 :(得分:2)

看着res.fun,在您的情况下,1e-5的契合度实际上是相当不错的。

您很可能找到了目标函数的局部最小值。为了更好地理解这种行为,请尝试下面的代码。对于不同的起点,这将产生不同的结果。正如您将看到的,您正在最小化,只是没有达到全局最小值。要进行全局优化,您必须使用其他方法/方法。您还可以增加何时停止优化的条件。或使用混合方法并从不同的起始点开始,解决局部最小化问题并获得最佳价值。

for i in range(10):
    pars0 = np.random.rand(6) * 1
    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]))
    print(res.fun)

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

例如,初始点:

pars0 = np.array([1,0.5,0.25,1,0.5,0.25]) + np.random.rand(6)*0.01

提供了一个非常合适的解决方案。