2017-03-25 42 views
3

當前我有以下代碼定義函數f使參數最小化功能

a = #something 
b = #something 
c = #something 
def f(x): 
    """Evaluates some function that depends on parameters a, b, and c""" 
    someNumber = #some calculation 
    return someNumber 

理想的情況下,我會做def f(x, a, b, c),但我對於減少fx並SciPy的的優化工具箱不允許一個與在參數參數最小化的功能。這就是說我想運行我的最小化代碼的多個值a, bc。有什麼辦法可以做到這一點?

+2

使用'functools.partial'將特定'a,b,c'值的函數「凍結」? –

+0

@ PM2Ring這將工作,我很高興我現在知道這個工具,但@Liteye指出'最小化'實際上允許我傳遞它的參數。謝謝! –

+1

不用擔心。當你需要時,「partial」很好,但我不知道SciPy,所以這只是一個建議。顯然,Liteye的答案是這樣做的正確方法。 :) –

回答

7

可以在args

minimize(f, x0, args=(a, b, c)) 
+0

不能相信我沒有在文檔中看到這個。謝謝! –

1

指定附加參數這是一個很簡單的問題,回答有關使用minimize。如果其他用戶需要更具體的東西,這裏有一個簡單的例子。

廣義二次方程:

In [282]: def fun(x, a,b,c): 
    ...:  return a*x**2 + b*x + c 

In [283]: optimize.minimize(fun, 10, args=(1,0,0)) 
Out[283]: 
     fun: 1.7161984122524196e-15 
hess_inv: array([[ 0.50000001]]) 
     jac: array([ -6.79528891e-08]) 
    message: 'Optimization terminated successfully.' 
    nfev: 15 
     nit: 4 
    njev: 5 
    status: 0 
    success: True 
     x: array([ -4.14270251e-08]) 

In [284]: optimize.minimize(fun, 10, args=(1,1,1)) 
Out[284]: 
     fun: 0.7500000000000221 
hess_inv: array([[ 0.49999999]]) 
     jac: array([ 3.12924385e-07]) 
    message: 'Optimization terminated successfully.' 
    nfev: 12 
     nit: 2 
    njev: 4 
    status: 0 
    success: True 
     x: array([-0.49999985]) 

功能可以採取數組作爲輸入爲好,但仍需要返回單(標)值:

In [289]: optimize.minimize(fun, [10,10,10], args=(np.array([1,2,3]), 1, 1)) 
Out[289]: 
     fun: 2.541666666667115 
hess_inv: array([[ 0.50021475, -0.00126004, 0.00061239], 
     [-0.00126004, 0.25822101, -0.00259327], 
     [ 0.00061239, -0.00259327, 0.16946887]]) 
     jac: array([ -8.94069672e-08, 4.47034836e-07, -2.20537186e-06]) 
    message: 'Optimization terminated successfully.' 
    nfev: 55 
     nit: 9 
    njev: 11 
    status: 0 
    success: True 
     x: array([-0.50000006, -0.2499999 , -0.16666704]) 

In [286]: def fun(x, a,b,c): 
...:  return (a*x**2 + b*x + c).sum() 

這是一個好主意確保函數運行的建議x0和參數,例如

In [291]: fun(np.array([10,10,10]), np.array([1,2,3]), 1, 1) 
Out[291]: 633 

如果您不能調用目標函數,或者是困惑,它的參數是如何工作的,minimize是不是靈丹妙藥。這種最小化與您對目標函數的理解一樣好。