Я выполняю кривую с scipy.optimize.leastsq
. Например. для гауссовых:Scipy.optimize - подгонка кривой с фиксированными параметрами
def fitGaussian(x, y, init=[1.0,0.0,4.0,0.1]):
fitfunc = lambda p, x: p[0]*np.exp(-(x-p[1])**2/(2*p[2]**2))+p[3] # Target function
errfunc = lambda p, x, y: fitfunc(p, x) - y # Distance to the target function
final, success = scipy.optimize.leastsq(errfunc, init[:], args=(x, y))
return fitfunc, final
Теперь я хочу по желанию исправить значения некоторых параметров в подгонке. Я нашел, что предложения должны использовать другой пакет lmfit, которого я хочу избежать, или очень общие, например here. Так как мне нужно решение, которое
- работы с Numpy/SciPy (без каких-либо дополнительных пакетов и т.д.)
- не зависит от самих параметров,
- является гибким, в котором параметры фиксированные или нет,
я придумал следующее, используя условие по каждому из параметров:
def fitGaussian2(x, y, init=[1.0,0.0,4.0,0.1], fix = [False, False, False, False]):
fitfunc = lambda p, x: (p[0] if not fix[0] else init[0])*np.exp(-(x-(p[1] if not fix[1] else init[1]))**2/(2*(p[2] if not fix[2] else init[2])**2))+(p[3] if not fix[3] else init[3])
errfunc = lambda p, x, y: fitfunc(p, x) - y # Distance to the target function
final, success = scipy.optimize.leastsq(errfunc, init[:], args=(x, y))
return fitfunc, final
Пока это прекрасно работает, это не практично, не красиво. Итак, мой вопрос: есть ли лучшие способы выполнения кривой в scipy для фиксированных параметров? Или есть обертки, которые уже включают такую фиксацию параметра?
Было бы неплохо иметь эту функциональность в scipy, но я не уверен, существует ли она. Из любопытства, почему вы хотите избежать lmfit? Это очень просто использовать в моем опыте. –
Причина, по которой я хочу избежать других пакетов, заключается в том, что мне нужно будет убедиться, что они правильно установлены на любом из компьютеров, на которых выполняется эта программа. – ImportanceOfBeingErnest