這是一個最小的可重現示例。如果我設定x_0為0,則優化器似乎無法擺脫它。如果我設定x_0為10,它會收斂到全域最小值。知道那是什么嗎?它與Nelder-Mead 演算法的作業原理有關嗎?
我知道它可能會在收斂之前卡住并終止,并且優化器有時對初始猜測很敏感,但我發現這很難檢查,因為我們只給出一個初始點,而 Nelder-Mead 演算法從 (維數 1) 點開始,所以在這里我們應該從兩點開始??顯然,我們只對 SciPy 給出了一個初步猜測,所以我的問題是:SciPy 采取的第二點是什么,如果我使用為什么會導致不收斂x0 = 0?
和x_0 = 0
import numpy as np
from scipy.optimize import minimize, Bounds
def func(x):
return ((x - 1000) ** 2 (x - 10000) ** 2) 440 ** (3 / 2) * np.sqrt(x)
x0 = np.array([0])
x_bounds = Bounds(0, 25000)
res = minimize(func, x0, method='Nelder-Mead', tol=1e-6, bounds=x_bounds)
print("Best:", res.x)
print("Loss:", func(res.x[0]))
輸出:
Best: [0.]
Loss: 101000000.0
與x0 = 10:
import numpy as np
from scipy.optimize import minimize, Bounds
def func(x):
return ((x - 1000) ** 2 (x - 10000) ** 2) 440 ** (3 / 2) * np.sqrt(x)
x0 = np.array([10])
x_bounds = Bounds(0, 25000)
res = minimize(func, x0, method='Nelder-Mead', tol=1e-6, bounds=x_bounds)
print("Best:", res.x)
print("Loss:", func(res.x[0]))
輸出:
Best: [5484.42156982]
Loss: 41183994.677765995
我在Nelder-Mead的scipy 檔案上找不到太多內容。我也不能在最小化的scipy 檔案中。
uj5u.com熱心網友回復:
https://machinelearningmastery.com/how-to-use-nelder-mead-optimization-in-python/
“必須為演算法提供一個起點,它可能是另一個全域優化演算法的終點,也可能是從域中抽取的一個隨機點。
鑒于演算法可能會卡住,它可能會從具有不同起點的多次重啟中受益。
該演算法通過使用由 n 1 個點(頂點)組成的形狀結構(稱為單純形)來作業,其中 n 是函式的輸入維數。”
為什么你只提供一個初始點的答案在這里: https ://github.com/scipy/scipy/blob/b5d8bab88af61d61de09641243848df63380a67f/scipy/optimize/_optimize.py#L743
所以單純形是從 n 1 個點構建的,每個點都是您的起點(復制)。所以維度的數量不是點的數量。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/471333.html
上一篇:使用scipy.optimize.minimize查找交集
下一篇:如何讓MathJax更快?
