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))
Должно сработать.
Редактировать: Исправлена глупая синтаксическая ошибка.