簡體   English   中英

基於 scipy.optimize.basinhopping 中的 Levenberg-Marquardt 的自定義最小化器

[英]Custom minimizer based on Levenberg-Marquardt in scipy.optimize.basinhopping

我在最小化 python 中復雜的非線性函數時遇到了麻煩。 該函數實際上是用於擬合實驗數據的擬合模型的卡方。 為了獲得全局最小值,我在 scipy 中使用了 Basinhopping 函數。 這個函數是minimize() 函數的一個封裝,它增加了一些擾動來尋找不同的局部最小值。 現在我的問題是很難找到局部最小值。

有很多求解器可用於最小化(),並且由於我使用的是邊界,因此我在“L-BFGS-B”、“SLSQP”和“TNC”之間進行了選擇。 他們都沒有真正找到局部最小值。 是否有一種基於流行的 Levenberg-Marquardt 算法的方法可用於最小化? 也許這沒有意義,否則它已經實施了,但我不明白為什么。

我最初的想法實際上是使用leastsqbound 函數( https://pypi.python.org/pypi/leastsqbound ),我知道它非常擅長提供准確的協方差矩陣,而不管邊界,並將其包含在一個更大的算法中,看起來對於全局最小值(如盆地跳躍函數)。 你知道這樣的東西是否已經存在?

非常感謝您的建議!

Scipy 有一個 Levenberg-Marquardt 實現: scipy.optimize.leastsq 它沒有正確的返回類型以用於minimize (因此是basin_hopping )。 然而,這似乎可以相當直接地補救。

雖然我還沒有運行它,但這應該可以解決問題:

def leastsq_for_minimize( *args, **kwargs ):
    results = leastsq( *args, **kwargs )
    optimize_results = scipy.optimize.OptimizeResult()
    # Some code here to correctly copy results to optimize results
    return optimize_results

scipy.optimize.basinhopping(
    # your arguments here
    minimizer_kwargs=dict(method=leastsq_for_minimize),
    )

暫無
暫無

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

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