2014-05-14 111 views
3

我正在使用scipy.optimize.minimize對目標函數進行無限制優化,該目標函數接收幾個參數並根據這些參數運行復雜的數值模擬。這種模擬並不總是收斂,在這種情況下,我使目標函數返回inf,在某些情況下,在其他的NaN中。告訴scipy.optimize.minimize失敗

我認爲這種黑客會阻止最小化在靠近一組參數的任何地方收斂,使得模擬發散。相反,我遇到了一種情況,即仿真對於初始參數集甚至不會收斂,但不失敗,優化在0次迭代中「成功」終止。它似乎不關心返回inf的目標函數。

有沒有辦法告訴scipy.optimize.minimize失敗,例如,通過提出某種例外。雖然在這種情況下,很明顯,優化沒有成功終止 - 因爲迭代次數爲0,並且我知道最佳結果 - 在某些時候,我想運行問題,但我不知道解決方案,我需要依靠最小化告訴我狗屎是否擊中粉絲。如果返回很多nans和infs不會「破壞」算法,我想我必須通過暴力來實現。


下面是幾乎迭代的例子。 功能 - 兩個變量的函數 - 被稱爲4倍過所有:
1)在起點 - >模擬發散,F(X)= INF
2)在點1E-5 (梯度近似) - >模擬收斂,f(x)= inf,其中f(x)=一些有限值
4)再次在起點 - >模擬發散,f(x)= inf

回答

1

你有2個選擇,我能想到的:

  • 齊齊約束優化
  • 修改你的目標函數發散,只要您的數值模擬不收斂。基本上這意味着返回一個很大的值,相比於「正常」值,這取決於您手頭的問題。然後minimize將嘗試優化另一個方向

不過,我有些意外的是minimize不理解inf爲一個較大的值去,並不會嘗試去尋找另一個方向的解決方案。難道只有當你的目標函數返回nan時它才返回0次迭代?您可以通過在目標函數中的return聲明之前打印值來嘗試調試問題。

+0

我試過這個,顯然NaN甚至沒有問題。我編輯了這個問題以包含第0次迭代的總結。 約束優化的問題是,我將不得不更頻繁地運行模擬,作爲目標函數的一部分,並作爲約束函數的一部分,該函數必須是二進制值函數。聽起來非常混亂和低效。 – Nebukadnezar

+1

從上面的內容可以看出,你的初始猜測不是一個有效的點,而'fmin'拒絕繼續,主要是因爲局部梯度不是有限的,即至少它的一個分量不是有限的。你能製作/你知道一個有效的猜測嗎? – gg349

+1

我似乎無法找到有效的初始猜測,但仍然會重現問題。假設'fmin'在任何進一步的迭代中都不會選擇一個無效點(這似乎是一個合理的假設),這幾乎解決了我的問題。謝謝! – Nebukadnezar