Неудачный случай и, возможно, ошибка в Curve_fit. Curve_fit использует inspect для определения количества начальных значений, которое может быть сбито с толку или введено в заблуждение при наличии дополнительного self
.
Так что, задавая начальное значение, следует избегать проблемы, подумал я. Тем не менее, в этом состоянии также есть isscalar (p0), я понятия не имею, почему, и я думаю, что было бы хорошо сообщить об этом как о проблеме или ошибке:
if p0 is None or isscalar(p0):
# determine number of parameters by inspecting the function
import inspect
args, varargs, varkw, defaults = inspect.getargspec(f)
edit: избегать скаляра в качестве начального значения
>>> np.isscalar([2])
False
означает, что пример только с одним параметром работает, если начальное значение определено как [...], например, как в примере ниже:
mc.optimize([2])
Пример с двумя аргументами и заданным начальным значением позволяет избежать вызова inspect, и все в порядке:
import numpy as np
from scipy.optimize import curve_fit
class MyClass(object):
def get_flow(self, pressure_drop, coeff, coeff2):
"""Sets flow based on coefficient and pressure drop."""
flow = coeff * pressure_drop**0.5 + coeff2
return flow
def optimize(self, start_value=None):
coeff = 1
pressure_drop = np.arange(20.)
flow = coeff * pressure_drop**0.5 + np.random.randn(20)
return curve_fit(self.get_flow, pressure_drop, flow, p0=start_value)
mc = MyClass()
print mc.optimize([2,1])
import inspect
args, varargs, varkw, defaults = inspect.getargspec(mc.get_flow)
print args, len(args)
РЕДАКТИРОВАТЬ: эта ошибка была исправлена, поэтому связанные методы теперь могут быть переданы в качестве первого аргумента для curve_fit, если у вас достаточно новая версия scipy.
Подтверждение отправки исправления ошибки на github