簡體   English   中英

為什么我的優化(scipy.optimize.minimize)不起作用並返回初始值?

[英]Why does my optimization (scipy.optimize.minimize) not work and return the initial values instead?

我有一組數據; 每列對應於特定時間的光譜。 我想將一般時間 (t_i) 的光譜擬合為時間 0(在第一列中)、時間 5(在第 30 列中)和時間 35(在第 210 列中)的光譜的線性組合。 所以我想擬合的方程是:

S(t_i) = a * S(t_0) + b * S(t_5) + c * S(t_35)

在哪里:

  1. 0 <= a, b, c <= 1

  2. a + b + c = 1

我發現這個問題的解決方案( Minimizing Least Squares with Algebraic Constraints and Bounds )非常有用。 但是當我用我的數據集進行嘗試時,結果顯然是錯誤的。 我嘗試將方法修改為“Nelder-Mead”,但它不尊重我的界限,所以我得到了負值。

這是我的腳本:

t0= df.iloc[:,0]    #Spectrum at time 0
t5 = df.iloc[:,30]  # Spectrum at time 5
t35 = df.iloc[:,120] # Spectrum at time 35
ti= df.iloc[:,20]
# Bounds that make every coefficient be between 0 and 1
bnds = [(0, 1), (0, 1), (0, 1)]
# Constrain the sum of the coefficient to 1
cons = [{"type": "eq", "fun": lambda x: x[0] + x[1] + x[2] - 1}]
xinit = np.array([1, 0, 0])
fun = lambda x: np.sum((ti -(x[0] * t0 + x[1] * t5 + x[2] * t35))**2)
res = minimize(fun, xinit,method='Nelder-Mead', bounds=bnds, constraints=cons)
print(res.x)

如果我使用 Nelder-Mead 方法,我會得到: Out: [ 0.02732053 1.01961422 -0.04504698] ,如果我不指定我得到的方法: [1. 0. 0.] [1. 0. 0.] (我相信在這種情況下使用的是 SLSQP 方法)。

我指的數據類似於以下內容:

0            3.333       5           35.001
0.001045089 0.001109701 0.001169798 0.000725486
0.001083051 0.001138815 0.001176665 0.000713021
0.001090994 0.001142676 0.001186642 0.000716149
0.001096258 0.001156476 0.001190218 0.00071286

你能找出問題所在嗎? 你能建議其他方法來解決這個問題嗎? 我也嘗試過使用least_squares ,但失敗了。

局部優化的結果很大程度上取決於初始值。

對於上述情況,它可能會返回[1, 0, 0] ,因為優化器根本不可能找到通向[0. 1. 0.] [0. 1. 0.] . 事實上,您可能已經從局部最小值開始,並且所有擺脫困境的方法都走上坡路。 所以優化器選擇留下來。 這就是這些優化器的工作方式。

嘗試

xinit = np.array([0.0, 1.0, 0.0])

對於t_i = t5 ,我很確定優化器將返回初始值。

對於您的情況,請執行我在此處所述的操作:多次運行優化器,每次在您的邊界內選擇隨機初始值。 您可以選擇發布在那里的代碼並添加您的約束,使用 SLSQP 或 trust-constr。

暫無
暫無

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

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