Мой вопрос касается подбора параметров сложной модели, состоящей из различных параметрических функций.
Точнее, хочу описать сложный эксперимент. В ходе эксперимента создается одномерный массив измеренных данных data
, где каждая его запись соответствует (набору) экспериментальных контрольных переменных x
.
Теперь у меня теоретическая модель (на самом деле несколько моделей, см. Ниже) model(x,pars)
, которая принимает x
и множество параметров pars
, чтобы дать прогноз для data
. Однако не все параметры известны, и мне нужно их подогнать.
Более того, некоторые детали модели пока не определены. Из-за этого у меня фактически есть семейство из нескольких моделей, которые в некоторых частях очень похожи, но в которых некоторые внутренние компоненты модели отличаются (но большая часть модели такая же).
К сожалению, переключение одного компонента на другой может привести к появлению новых (неизвестных) параметров, то есть теперь у нас есть modelA(x,parsA)
и modelB(x,parsB)
, которые имеют разные параметры.
По сути, модель состоит из функций f(x, pars, vals_of_subfuncs)
, где x
- независимая переменная, pars
- некоторые явные параметры f
, а vals_of_subfuncs
- результаты оценки некоторых функций нижнего уровня, которые сами зависят от своих собственных параметров (и, возможно, результатов их собственные функции нижнего уровня и т. д.) Очевидно, что рекурсии невозможны, и есть функции нижнего уровня, которые не зависят от значений других функций.
Ситуацию лучше всего иллюстрирует этот рисунок:
Независимая переменная - x
(синий), параметры - a,b,c,d
(красный), а значения подфункций отображаются в виде зеленых стрелок в узлах, представляющих функции.
В (1) у нас есть функция нижнего уровня G(x; (a,b); {})
без подфункций и функция верхнего уровня F(x; c; G(x; (a,b))
, оценка которой дает результат модели, который зависит от x
и pars=(a,b,c)
.
В (2) и (3) мы меняем компонент модели (F->F'
) и (G->G'
) соответственно. Это изменяет зависимость параметров окончательной модели.
Теперь я ищу наиболее питонический / модульный способ подойти к проблеме реализации подбора параметров в этой ситуации без необходимости переписывать функцию подгонки каждый раз, когда я меняю местами / изменяю компонент моей модели, тем самым, возможно, вводя новый параметр.
На данный момент я пытаюсь найти решение этой проблемы с помощью lmfit
. Я также подумал, может быть, попытаться использовать sympy
для работы с символическими «параметрами», но я не думаю, что все появляющиеся функции можно легко записать в виде выражений, которые могут быть оценены asteval
.
Кто-нибудь знает естественный способ подойти к такой ситуации?