Я столкнулся с серьезной проблемой, связанной с подгонкой функции к моим данным. Чтобы объяснить задачу, вот график данных с ранней подходящей версией:
похоже, чтобы опубликовать изображение, нужно как минимум 10 репутаций, поэтому вот ссылка на изображение... ---> Изображение здесь ‹---
Зеленая линия — это подогнанная функция в той области, где она была подогнана, а красная — та же самая функция, экстраполированная, чтобы увидеть, куда она пойдет. Последний бит при x>0 не имеет значения для подбора и может быть проигнорирован. Важна только S-образная кривая и два наклона по обе стороны от нее.
Я использую python и curve_fit для соответствия функциям. Что я хочу сделать сейчас, так это подогнать функцию, которая выглядит так:
f(x) = s*g(x) + t*(1-h(x))
с:
g(x) = (m1*x + n1) / (1-10^(a1*x - b1))
h(x) = (m2*x + n2) / (1-10^(-a2*x - b2))
Но поскольку эта функция имеет всего 10 переменных, она очень нестабильна. Прямо сейчас я очень обычно подгоняю его с помощью curve_fit:
def function(x, a1, a2, b1, b1, m1, m2, n1, n2, s, t):
g = (m1*x + n1) / (1-10^(a1*x - b1))
h = (m2*x + n2) / (1-10^(-a2*x - b2))
f = s*g + t*(1-h)
return f
...
popt, pcov = curve_fit(function, xdata, ydata, maxfev=100000)
Теперь мой актуальный вопрос: возможно ли установить эти функции отдельно? Например:
1: fit left slope. m1*x + n1
2: fit right slope. m2*x + n2
3: fit g(x) according to the pre-fitted slopes
4: fit h(x) according to the pre-fitted slopes
5: fit f(x)
Набрав это, я просто подумал о какой-то рекурсии для этого, но я не знаю, как передать предварительно фиксированные параметры одного шага другому и сохранить фиксированное значение, так что кривая_fit должна каждый раз соответствовать только очень небольшому количеству переменных.
Буду очень признателен за любую помощь в решении этой проблемы. Может быть, кто-то даже знает совершенно другой подход к этому или что-то, что я мог бы сделать лучше.
f(x)
, разве он не даст вам окончательную подобранную кривую в соответствии с уравнениямиg(x)
иh(x)
вместе?? вы также можете попробовать посмотреть этот ответ, если это то, что вы хотите. - person Srivatsan   schedule 07.12.2014