scipy.optimize.fmin_l_bfgs_b - too many values to unpack (expected 2)

0

Hej chce znalezc arguumenty minimalizujace dana funkcje. Niestety funkcja
scipy.optimize.fmin_l_bfgs_b
wyrzuca blad i nie wiem jak go naprawic

def Kou_calibration_full():
    i=0
    global opt
    mybounds=((0.10,0.31, 0.1),(0.01,2.3, 0.5), (0.1,0.72,0.2), (1.1,2,4),(0.1,2,4))
    p0 = spo.brute(Kou_error_function, ranges=mybounds, finish=None)
    opt,a,b = spo.fmin_l_bfgs_b(Kou_error_function, p0,bounds=mybounds, approx_grad=True )
    return opt
<ipython-input-73-d6642061f0de> in Kou_calibration_full()
      4     mybounds=((0.10,0.31, 0.1),(0.01,2.3, 0.5), (0.1,0.72,0.2), (1.1,2,4),(0.1,2,4))
      5     p0 = spo.brute(Kou_error_function, ranges=mybounds, finish=None)
----> 6     opt,a,b = spo.fmin_l_bfgs_b(Kou_error_function, p0,bounds=mybounds, approx_grad=True )
      7     return opt

~\anaconda3\lib\site-packages\scipy\optimize\lbfgsb.py in fmin_l_bfgs_b(func, x0, fprime, args, approx_grad, bounds, m, factr, pgtol, epsilon, iprint, maxfun, maxiter, disp, callback, maxls)
    195             'maxls': maxls}
    196 
--> 197     res = _minimize_lbfgsb(fun, x0, args=args, jac=jac, bounds=bounds,
    198                            **opts)
    199     d = {'grad': res['jac'],

~\anaconda3\lib\site-packages\scipy\optimize\lbfgsb.py in _minimize_lbfgsb(fun, x0, args, jac, bounds, disp, maxcor, ftol, gtol, eps, maxfun, maxiter, iprint, callback, maxls, finite_diff_rel_step, **unknown_options)
    285 
    286     # unbounded variables must use None, not +-inf, for optimizer to work properly
--> 287     bounds = [(None if l == -np.inf else l, None if u == np.inf else u) for l, u in bounds]
    288     # LBFGSB is sent 'old-style' bounds, 'new-style' bounds are required by
    289     # approx_derivative and ScalarFunction

~\anaconda3\lib\site-packages\scipy\optimize\lbfgsb.py in <listcomp>(.0)
    285 
    286     # unbounded variables must use None, not +-inf, for optimizer to work properly
--> 287     bounds = [(None if l == -np.inf else l, None if u == np.inf else u) for l, u in bounds]
    288     # LBFGSB is sent 'old-style' bounds, 'new-style' bounds are required by
    289     # approx_derivative and ScalarFunction

ValueError: too many values to unpack (expected 2)```
0

Co tam mówi dokumentacja spo.brute? Próbowałęś też przejechac to debugerem?

1

Wygląda, że mybounds jest źle skonstruowane. Kod oczekuje dwóch elementów, a są po trzy w każdej krotce.

0
tsz napisał(a):

Wygląda, że mybounds jest źle skonstruowane. Kod oczekuje dwóch elementów, a są po trzy w każdej krotce.

Masz racje, zmieniłem na cos takiego ale tym razem wywala cos innego

def Kou_calibration_full():
    i=0
    global opt
    mybounds=[(0.10,0.31),(0.01,2.3), (0.1,0.72), (1.1,2),(0.1,2)]
    p0 = spo.brute(Kou_error_function, ((0.10,0.31, 0.1),(0.01,2.3, 0.5), (0.1,0.72,0.2), (1.1,2,4),(0.1,2,4)), finish=None)
    opt= spo.fmin_l_bfgs_b(Kou_error_function, x0=p0,bounds=mybounds, approx_grad=True )
    return opt```


i otrzymalem inny blad:
---------------------------------------------------------------------------
```ValueError                                Traceback (most recent call last)
<timed eval> in <module>

<ipython-input-91-12065a63c562> in Kou_calibration_full()
      4     mybounds=[(0.10,0.31),(0.01,2.3), (0.1,0.72), (1.1,2),(0.1,2)]
      5     p0 = spo.brute(Kou_error_function, ((0.10,0.31, 0.1),(0.01,2.3, 0.5), (0.1,0.72,0.2), (1.1,2,4),(0.1,2,4)), finish=None)
----> 6     opt= spo.fmin_l_bfgs_b(Kou_error_function, x0=p0,bounds=mybounds, approx_grad=True )
      7     return opt

~\anaconda3\lib\site-packages\scipy\optimize\lbfgsb.py in fmin_l_bfgs_b(func, x0, fprime, args, approx_grad, bounds, m, factr, pgtol, epsilon, iprint, maxfun, maxiter, disp, callback, maxls)
    195             'maxls': maxls}
    196 
--> 197     res = _minimize_lbfgsb(fun, x0, args=args, jac=jac, bounds=bounds,
    198                            **opts)
    199     d = {'grad': res['jac'],

~\anaconda3\lib\site-packages\scipy\optimize\lbfgsb.py in _minimize_lbfgsb(fun, x0, args, jac, bounds, disp, maxcor, ftol, gtol, eps, maxfun, maxiter, iprint, callback, maxls, finite_diff_rel_step, **unknown_options)
    304             iprint = disp
    305 
--> 306     sf = _prepare_scalar_function(fun, x0, jac=jac, args=args, epsilon=eps,
    307                                   bounds=new_bounds,
    308                                   finite_diff_rel_step=finite_diff_rel_step)

~\anaconda3\lib\site-packages\scipy\optimize\optimize.py in _prepare_scalar_function(fun, x0, jac, args, bounds, epsilon, finite_diff_rel_step, hess)
    259     # ScalarFunction caches. Reuse of fun(x) during grad
    260     # calculation reduces overall function evaluations.
--> 261     sf = ScalarFunction(fun, x0, args, grad, hess,
    262                         finite_diff_rel_step, bounds, epsilon=epsilon)
    263 

~\anaconda3\lib\site-packages\scipy\optimize\_differentiable_functions.py in __init__(self, fun, x0, args, grad, hess, finite_diff_rel_step, finite_diff_bounds, epsilon)
     93 
     94         self._update_grad_impl = update_grad
---> 95         self._update_grad()
     96 
     97         # Hessian Evaluation

~\anaconda3\lib\site-packages\scipy\optimize\_differentiable_functions.py in _update_grad(self)
    169     def _update_grad(self):
    170         if not self.g_updated:
--> 171             self._update_grad_impl()
    172             self.g_updated = True
    173 

~\anaconda3\lib\site-packages\scipy\optimize\_differentiable_functions.py in update_grad()
     89                 self._update_fun()
     90                 self.ngev += 1
---> 91                 self.g = approx_derivative(fun_wrapped, self.x, f0=self.f,
     92                                            **finite_diff_options)
     93 

~\anaconda3\lib\site-packages\scipy\optimize\_numdiff.py in approx_derivative(fun, x0, method, rel_step, abs_step, f0, bounds, sparsity, as_linear_operator, args, kwargs)
    386         f0 = np.atleast_1d(f0)
    387         if f0.ndim > 1:
--> 388             raise ValueError("`f0` passed has more than 1 dimension.")
    389 
    390     if np.any((x0 < lb) | (x0 > ub)):

ValueError: `f0` passed has more than 1 dimension.```

1 użytkowników online, w tym zalogowanych: 0, gości: 1