10

UPDATE2: A better title (now that I understand the problem) would be: What is the proper syntax for input in scipy optimize.fmin?

UPDATE: runnable code was requested, so the function definitions have been replaced with runnable code. Sample input data has been hard-encoded as the numpy array 'data'.

I'm trying to optimize a function with scipy, but am really stuck, and must beg for help. A zero-length array is being passed to a method in the optimizer, and I cannot understand why, nor how to overcome this problem.

A brief outline of what this code is trying to do:

  • Given data set "data" composed of individual observations "r"
  • Estimate a value of parameter "m" which is most likely to have given rise to "data"
    • For a given m, calculate the probability p(r|m) for observing each "r" in "data"
    • For a given m, calculate the probability P(m|data) that "m" generated the data.
  • Define a helper function for use with optimize.fmin.
  • Use SciPy optimize.fmin to determine the m for which helper(m|data) is maximized.

The error I get when I run this code is: ValueError: zero-size array to reduction operation maximum which has no identity

Here is a runnable snippet of code which generates the error on my machine.

#!/usr/bin/env python2.7

import numpy as np
from scipy import optimize

def p_of_r(m, r): ## this calculates p(r|m) for each datum r
    r_range = np.arange(0, r+1, 1, dtype='int')
    p_r = []
    p_r = np.array([0.0 for a in r_range])
    for x in r_range:
        if x == 0:
            p_r[x] = np.exp(-1 * m)
        else:
            total = 0.0
            for y in np.arange(0, x, 1, dtype='int'):
                current = ( p_r[y] ) / (x - y  + 1)
                total = current + total
            p_r[x] = ( m / x ) * total
    return p_r

def likelihood_function(m, *data): # calculates P(m|data) using entire data set
    p_r = p_of_r(m, np.ma.max(data))
    p_r_m = np.array([p_r[y] for y in data])
    bigP = np.prod(p_r_m)
    return bigP

def main():
    data = np.array( [10, 10, 7, 19, 9, 23, 26, 7, 164, 16 ] )
    median_r = np.median(data)
    def Drake(m):
        return median_r / m - np.log(m)
    m_initial = optimize.broyden1(Drake, 1) 
    def helper(x, *args):
        helper_value = -1 * likelihood_function(x, *args)
        return helper_value 

    # here is the actual optimize.fmin    
    fmin_result = optimize.fmin(helper, x0=[m_initial], args=data)
    print fmin_result

#    for i in np.arange(0.0, 25.0, 0.1):
#        print i, helper(i, data)
if __name__ == "__main__" : main()

The error itself: ValueError: zero-size array to reduction operation maximum which has no identity

The traceback is provided below.

ValueError                                Traceback (most recent call last)
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/utils/py3compat.pyc in execfile(fname, *where)
    176             else:
    177                 filename = fname
--> 178             __builtin__.execfile(filename, *where)

/Users/deyler/bin/MSS-likelihood-minimal.py in <module>()
     43     print fmin_result
     44 
---> 45 if __name__ == "__main__" : main()

/Users/deyler/bin/MSS-likelihood-minimal.py in main()
     40 
     41 
---> 42     fmin_result = optimize.fmin(helper, x0=[m_initial], args=data)
     43     print fmin_result
     44 

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/optimize.pyc in fmin(func, x0, args, xtol, ftol, maxiter, maxfun, full_output, disp, retall, callback)
    371             'return_all': retall}
    372 
--> 373     res = _minimize_neldermead(func, x0, args, callback=callback, **opts)
    374     if full_output:
    375         retlist = res['x'], res['fun'], res['nit'], res['nfev'], res['status']

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/optimize.pyc 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

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/optimize.pyc in function_wrapper(*wrapper_args)
    279     def function_wrapper(*wrapper_args):
    280         ncalls[0] += 1
--> 281         return function(*(wrapper_args + args))
    282 
    283     return ncalls, function_wrapper

/Users/deyler/bin/MSS-likelihood-minimal.py in helper(x, *args)
     33     m_initial = optimize.broyden1(Drake, 1)
     34     def helper(x, *args):
---> 35         helper_value = -1 * likelihood_function(x, *args)
     36         return helper_value
     37 

/Users/deyler/bin/MSS-likelihood-minimal.py in likelihood_function(m, *data)
     21 
     22 def likelihood_function(m, *data):
---> 23     p_r = p_of_r(m, np.ma.max(data))
     24     p_r_m = np.array([p_r[y] for y in data])
     25     bigP = np.prod(p_r_m)

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/ma/core.pyc in max(obj, axis, out, fill_value)
   5899         # If obj doesn't have a max method,
   5900         # ...or if the method doesn't accept a fill_value argument
-> 5901         return asanyarray(obj).max(axis=axis, fill_value=fill_value, out=out)
   5902 max.__doc__ = MaskedArray.max.__doc__
   5903 

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/ma/core.pyc in max(self, axis, out, fill_value)
   5159         # No explicit output
   5160         if out is None:
-> 5161             result = self.filled(fill_value).max(axis=axis, out=out).view(type(self))
   5162             if result.ndim:
   5163                 # Set the mask

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/_methods.pyc in _amax(a, axis, out, keepdims)
      8 def _amax(a, axis=None, out=None, keepdims=False):
      9     return um.maximum.reduce(a, axis=axis,
---> 10                             out=out, keepdims=keepdims)
     11 
     12 def _amin(a, axis=None, out=None, keepdims=False):

ValueError: zero-size array to reduction operation maximum which has no identity
3
  • Please provide sample data you are processing while get your error Commented Dec 10, 2013 at 12:38
  • It looks like your data is empty. Unfortunately, we can't tell where data is coming from. Also, your error message does not match your code. When stripping down or simplifying code, please do your best to construct a minimal, runnable example that demonstrates your posted error when you run it. If you can't do that, please at least make it consistent with the error message. Commented Dec 10, 2013 at 13:02
  • 1
    @alko, @user2357112: Runnable, error-generating code is posted. data is explicitly defined. If data looks empty, then I am doing something wrong with my inputs to the optimizer. Commented Dec 10, 2013 at 15:37

1 Answer 1

6

Correct fmin syntax is:

args: tuple, optional

    Extra arguments passed to func, i.e. f(x,*args).
fmin_result = optimize.fmin(helper, x0=[m_initial], args=(data,))

Is next result expected?

Optimization terminated successfully.
         Current function value: -0.000000
         Iterations: 16
         Function evaluations: 32
[ 5.53610656]
Sign up to request clarification or add additional context in comments.

4 Comments

I see. args=(tuple), so the parentheses are required. Thanks, this had already cost me two days.
@dangenet to be precise, parentheses and comma to make a tuple
To be even more pedantically precise, commas are the part of Python syntax that creates tuples. The parentheses are sometimes unneccessary, but here they separate the values of the args tuple from the arguments to optimize.fmin.
The only time that I've found so far where the parentheses appear unnecessary but are actually required is in an except clause. For example, except IOError, ImportError: and except (IOError, ImportError): mean different things. The former actually means except IOError as ImportError:, which is almost certainly never what you want. Other than that, parentheses requirements for tuple creation should be as you'd expect.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.