Scipy.minimize - "TypeError: numpy.float64'объект не может быть запущен"

Запуск функции scipy.minimize "Я получаю TypeError: объект 'numpy.float64' не вызывается". В частности, во время выполнения:

    .../scipy/optimize/optimize.py", line 292, in function_wrapper
return function(*(wrapper_args + args))

Я уже рассмотрел предыдущие подобные темы здесь, и обычно эта проблема возникает из-за того, что в качестве первого входного параметра.minimize не является функцией. У меня есть трудности, чтобы понять это, потому что "а" является функцией. Как вы думаете?

    ### "data" is a pandas data frame of float values
    ### "w" is a numpy float array i.e. [0.11365704 0.00886848 0.65302202 0.05680696 0.1676455 ]

    def a(data, w):
        ### Return a negative float value from position [2] of an numpy array of float values calculated via the "b" function i.e -0.3632965490830499 
        return -b(data, w)[2]

    constraint = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})

    ### i.e ((0, 1), (0, 1), (0, 1), (0, 1), (0, 1))
    bound = tuple((0, 1) for x in range (len(symbols)))

    opts = scipy.minimize(a(data, w), len(symbols) * [1. / len(symbols),], method = 'SLSQP', bounds = bound, constraints = constraint)

2 ответа

Короткий ответ

Вместо этого должно быть:

opts = scipy.minimize(a, len(symbols) * [1. / len(symbols),], args=(w,), method='SLSQP', bounds=bound, constraints=constraint)

подробности

a(data, w) это не функция, это вызов функции. Другими словами a(data, w) эффективно имеет значение и тип возвращаемого значения функции a, minimize нужна фактическая функция без вызова (т.е. без скобок (...) и все промежуточное), как его первый параметр.

От scipy.optimize.minimize документы:

scipy.optimize.minimize (весело, x0, args=(), метод = нет, jac= нет, hess = нет, hessp = нет, границы = нет, ограничения =(), tol= нет, обратный вызов = нет, параметры = Никто)

...

веселье

Целевая функция должна быть минимизирована. Должен быть в форме f(x, *args). Оптимизирующий аргумент x - это одномерный массив точек, а args - это кортеж любых дополнительных фиксированных параметров, необходимых для полного указания функции.

...

args: tuple, необязательно

Дополнительные аргументы переданы целевой функции...

Итак, предполагая w фиксированный (по крайней мере, относительно желаемой минимизации), вы бы передали его minimize через args параметр, как я сделал выше.

Вы не передаете функцию, но оцените результат, чтобы минимизировать.

opts = scipy.minimize(a,  len(symbols) * [1. / len(symbols),], method = 'SLSQP', bounds = bound, constraints = constraint, args = (data,w))

Должно сработать.

Редактировать: Исправлена ​​глупая синтаксическая ошибка.

Другие вопросы по тегам