簡體   English   中英

為什么“ scipy.optimize.minimize”會給我這么不好的印象?

[英]Why does “scipy.optimize.minimize” gives me such a bad fit?

我有一個函數y(x,z)具有兩個變量xz和6個系數abcdef 我有xz的數據,並假設出於測試目的,系數的數據。 利用這些數據,我計算出y

然后,我想用xz和計算出的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

與我的用於計算y數據的系數相比,擬合度並不是我所說的適當。 有人可以解釋一下我的身材為什么這么差嗎?

PS:如果有人想知道,我會使用cobyla因為稍后必須定義一些約束。 這只是一個測試代碼,可以找出我的問題所在(希望如此)。

查看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

產生一個非常合適的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM