2017-09-04 148 views
1

我正在運行嵌套優化代碼。相同的優化代碼不同的計算機上的不同結果

sp.optimize.minimize(fun=A, x0=D, method="SLSQP", bounds=(E), constraints=({'type':'eq','fun':constrains}), options={'disp': True, 'maxiter':100, 'ftol':1e-05}) 

sp.optimize.minimize(fun=B, x0=C, method="Nelder-Mead", options={'disp': True}) 

第一次最小化是函數B的一部分,所以它是第二次最小化中運行的一種。

而整個優化是基於數據,沒有涉及到隨機數。

我在兩臺不同的計算機上運行完全相同的代碼,得到完全不同的結果。

我已經安裝了不同版本的森蚺,但

SciPy的,numpy的,以及所使用的所有包具有相同的版本。

我真的不認爲操作系統將無關緊要,但一個是Windows 10(64位),另一種是Windows 8.1中(64位)

我試圖找出什麼可能導致此。

即使我沒有說明整個選項,如果兩臺電腦運行相同的代碼,不應該結果是相同的嗎?

或者是否有sp.optimize的任何選項,默認值設置爲不同於計算機到計算機?

PS。我正在看「eps」選項。這些計算機上的「eps」默認值有可能不同嗎?

+0

Python版本有區別嗎? –

+0

哦。你是對的。我錯過了這個......一個是Python 3.6.0,另一個是Python 3.6.1 它會導致差異嗎?我的意思是......這有點令人沮喪,因爲在一臺計算機上,它在3000次迭代中收斂,但在另一臺計算機上,直到7000次迭代才收斂。 – WKW

+0

這兩個Python實例都是64位的嗎?這也可能是一個因素。檢查numpy數組在兩個實例上使用相同的'dtype'。 –

回答

0

您不應該期望數值方法在不同的設備上具有相同的性能;或者甚至在同一設備上運行相同代碼的不同運行。由於機器的有限精度,您無法計算「真實」結果,但只能計算數值近似值。在長期的優化任務中,這些差異可以總結出來。此外,一些優化方法在內部使用某種隨機性來解決陷入局部最小值的問題:它們爲先前計算的解決方案添加了一個小的alomost消失噪聲,以允許算法在全球最低限度,而不會陷入局部最低點或鞍點。

你可以嘗試繪製你想要最小化功能的景觀?這可以幫助你分析問題:如果兩個結果(在每臺機器上)都是局部最小值,那麼這個行爲可以用我以前的描述來解釋。

如果不是這種情況,您應該檢查兩臺機器上安裝的scipy版本。也許你是在一個設備上隱式使用float值,另一個設備上是否使用double值?

你會看到:這裏有很多可能的解釋(第一眼看)奇怪的數字行爲;你必須給我們更多的細節來解決這個問題。

+0

首先,謝謝你的回答!但是我多次在同一臺計算機上獲得了相同的結果。我只是嘗試在另一臺電腦上,得到不同的結果,有點驚訝.. 我真的希望我可以上傳我的代碼,但我認爲我不應該.. :( 你可能是非常善良和告訴我更多關於「隱式使用float和double」的內容嗎?這是否與機器精度有關?我怎樣才能檢查它?(scipy版本是相同的。) – WKW

+0

@WonkiWoo嘗試繪製你想要的函數的空間正如我告訴過你的,儘量減少。 – FlashTek

相關問題