В моей ситуации целевая функция представляет собой числовой процесс, содержащий процесс поиска корня для уравнения методом деления пополам.При определенном наборе параметров уравнение не имеет корня для промежуточной переменной.Я думал, что выполнение процедуры поиска корня бисексуального возврата None
может решить такую проблемуПоскольку объектная функция с набором дат, регрессируемых на scipy.optimize.curve_fit
с p0
, разделенными этой промежуточной ситуацией, ошибка затем останавливает процесс.
Для изучения этого случая показан упрощенный случай.
import numpy as np
#Define object function:
def f(x,a1,a2):
if a1 < 0:
return None
elif a2 < 0:
return np.inf
else:
return a1 * x**2 + a2
#Making data:
x = np.linspace(-5,5,10)
i = 0
y = np.empty_like(x)
for xi in x:
y[i] = f(xi,1,1)
i += 1
import scipy.optimize as sp
para,pvoc = sp.curve_fit(f,x,y,p0=(-1,1))
#TypeError: unsupported operand type(s) for -: 'NoneType' and 'float'
para,pvoc = sp.curve_fit(f,x,y,p0=(1,-1))
#RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 600.
Я также пытался inf
, и это, очевидно, не работает.Что я должен вернуть, чтобы продолжить процесс curve_fit
?Представьте, что он пытается сойтись, что происходит с curve_fit
, когда он сталкивается с такой ситуацией.
Дополнительное мышление: я пытался try...except...
игнорировать ошибку, а также имитировать случай, когда p0
находится в разрешаемом диапазоне, но передаст неразрешимый сегмент в истинное соответствие.
import numpy as np
def f(x,a1,a2):
if a1 < 0:
return None
elif a1 < 2:
return a1 * x**2 + a2
elif a2 < 0:
return np.inf
else:
return a1 * x**2 + a2
def ff(x,a1,a2):
output = f(x,a1,a2)
if output == None:
return 0
else:
return output
x = np.linspace(-5,5,10)
i = 0
y = np.empty_like(x)
for xi in x:
y[i] = f(xi,1,1)
i += 1
import scipy.optimize as sp
#para,pvoc = sp.curve_fit(f,x,y,p0=(-1,1))
#TypeError: unsupported operand type(s) for -: 'NoneType' and 'float':
#para,pvoc = sp.curve_fit(f,x,y,p0=(1,-1))
try:
para,pvoc = sp.curve_fit(f,x,y,p0=(-3,1))
except TypeError:
pass
Очевидно, что при сближении произошла ошибка, о которой было сообщено и что она была исключена.Что я должен сделать, чтобы продолжить curve_fit
с исходным направлением схождения?Даже если я могу пойти на уступку, как я могу сказать curve_fit
вернуть последнюю попытку a1
?
С другой стороны, я попытался поместить это try... except...
в объектную функцию, чтобы вернуть 0когда есть ошибка.Результат, как я и ожидал:
para,pvoc = sp.curve_fit(ff,x,y,p0=(-3,1))
#OptimizeWarning: Covariance of the parameters could not be estimated
category=OptimizeWarning)