2014-04-03 28 views
1

我有一個簡單的公式,我通過理解爲scipy.optimize.minimize()函數的錯誤

def chernoff_bound(beta): 
    return 0.5 * np.exp(-beta * (1-beta)) 

betas = np.arange(0, 1, 0.01) 
c_bound = chernoff_bound(betas) 

plt.plot(betas, c_bound) 
plt.title('Chernoff Bound') 
plt.ylabel('P(error)') 
plt.xlabel('parameter beta') 

plt.show() 

enter image description here

繪製現在,我想找到的值,其中P(誤差)最小。 我試圖通過scipy.optimize.minimize()功能做(說實話,我以前沒有使用過它,有可能想到的一些錯誤在這裏...)

from scipy.optimize import minimize 

x0 = [0.1,0.2,0.4,0.5,0.9] 
fun = lambda x: 0.5 * np.exp(-x * (1-x)) 
res = minimize(fun, x0, method='Nelder-Mead') 

而我得到的錯誤是:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-25-2b04597c4341> in <module>() 
     3 x0 = [0.1,0.2,0.4,0.5,0.9] 
     4 fun = lambda x: 0.5 * np.exp(-x * (1-x)) 
----> 5 res = minimize(fun, x0, method='Nelder-Mead') 
     6 print(res) 

/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/scipy/optimize/_minimize.py in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options) 
    364 
    365  if meth == 'nelder-mead': 
--> 366   return _minimize_neldermead(fun, x0, args, callback, **options) 
    367  elif meth == 'powell': 
    368   return _minimize_powell(fun, x0, args, callback, **options) 

/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/scipy/optimize/optimize.py in _minimize_neldermead(func, x0, args, callback, xtol, ftol, maxiter, maxfev, disp, return_all, **unknown_options) 
    436  if retall: 
    437   allvecs = [sim[0]] 
--> 438  fsim[0] = func(x0) 
    439  nonzdelt = 0.05 
    440  zdelt = 0.00025 

ValueError: setting an array element with a sequence. 

如果有人能指點我這裏的正確軌道,我將非常感激!

回答

2

optimize.minimize的第二個參數是一個初始猜測 - 您對最低x的猜測 - 您希望optimize.minimize找到的值。因此,例如,

import numpy as np 
from scipy import optimize 
x0 = 0.1 
fun = lambda x: 0.5 * np.exp(-x * (1-x)) 
res = optimize.minimize(fun, x0, method='Nelder-Mead') 
print(res) 

產生

status: 0 
    nfev: 36 
success: True 
    fun: 0.38940039153570244 
     x: array([ 0.5]) 
message: 'Optimization terminated successfully.' 
    nit: 18 

x0不必總是標量。它可能是一個數組 - 它取決於fun。在上面的例子中,x0 = np.array([0.1])也可以工作。關鍵在於,無論你猜到什麼,fun(x0)應該是一個標量。

+0

不錯,謝謝。由於我有這個情節,我已經可以說這是約。 0.39並將其用作初始猜測...給出相同的結果:) – Sebastian