2016-12-13 17 views
0

我試圖解決在scipy.optimize.minimize使用專門的折線法的功能。爲了更好地理解它,我適應的例子在幫助頁面的底部,並採用折線法:在scipy-0.18.1的`scipy.optimize.minimize`中有bug嗎?

from scipy.optimize import minimize 

def fun(x): 
    return (x[0] - 1)**2 + (x[1] - 2.5)**2 

# solver 
res = minimize(fun, (2, 0), method='dogleg', jac=False) # or jac=None, it doesn't matter 

print(res) 

我得到一個錯誤ValueError: Jacobian is required for dogleg minimization.

這類似於一個老問題:"Jacobian is required for Newton-CG method" when doing a approximation to a Jacobian not being used when jac=False?它沒有按」 t似乎得到解決。

所以我的問題:是否真的在這個minimize一個bug,或我不能正常使用呢?

+0

注意SciPy的和Python是兩個完全不同的項目,不同的發佈週期和版本號。問題標題暗示你認爲SciPy是Python 3.5的一部分,但它肯定不是。每個版本的Scipy都可以與多個Python版本一起使用,並且與Python版本號相比,Scipy版本號與您的問題更相關。 –

回答

2

你必須通過一個雅可比函數使用dogleg方法,因爲它是基於梯度的優化方法。如果你看看scipy.optimize.minimizejac說法,它說

jac布爾或贖回,可選配
目標函數的雅可比(梯度)。僅適用於CG,BFGS,Newton-CG,L-BFGS-B,TNC,SLSQP,狗腿,信任ncg。如果jac是一個布爾值,是True,假設fun與目標函數一起返回的梯度。如果False,則梯度將以數值估計。 jac也可以是一個可回調的目標梯度。在這種情況下,它必須接受與fun相同的參數。

然後,如果你在注意在頁面的底部往下看:

方法狗腿用來約束極小化狗腿信賴域算法。 該算法需要梯度和Hessian;此外,Hessian必須是正定的。

一些基於梯度的方法不需要明確的雅可比矩陣(和/或Hessian),因爲它們將使用差分方法來近似它們。然而dogleg確實需要你明確地傳遞這樣的功能。

+0

我同意這似乎是一個沒有實現的功能,而不是一個bug。然而,我對文獻的閱讀是,雅可比行列式在沒有明確提供時將在數字上近似。使用具有數值近似Hessian的狗腿信任區優化器是完全可能的。 –

+0

@SvenMarnach這也是我的解釋。但是如果我沒有Jacobian/Hessian呢?我可以用說approx_fprime(https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.approx_fprime.html#scipy.optimize.approx_fprime)來計算雅可比,只需解析此結果變成'jac'?或者我需要一些更好的東西? –

+1

@MedullaOblongata只是嘗試它呢?對於您提供的示例函數,它肯定會起作用,但在實際應用中,它可能取決於您試圖優化的函數的細節。 –