Например, у меня есть функция f зависит от q, который, в свою очередь, зависит от x.
Хорошим свойством f является то, что его якобиан g и прогнозируемый гессиан hv все зависят от q напрямую.
Поэтому я могу вычислить q из x один раз и получить все f, g и hv, тем временем.
В python/scipy я могу установить q как глобальную переменную. На каждой итерации оптимизации при оценке f с помощью myfunc q автоматически обновляется на основе текущего x; при оценке g и hv вместо работы с x функции myjac и myhessp считывают глобальный q и возвращают значение соответствующие производные.
Что-то вроде
Код: Выделить всё
q=0
def myfunc(x):
global q
q=foo(x)
return bar0(q)
def myjac(x):
# do nothing with x
return bar1(q)
def myhessp(x):
# do nothing with x
return bar2(q)
scipy.optimize.minimize(myfunc,initial_guess_x0,method="blablabla",jac=myjac,hessp=myhessp)
Однако некоторые оптимизаторы оценивают эти значения с помощью более одного x за одну итерацию.
Когда оптимизаторы пытаются оценить g и hv с помощью x_prime< /code> кроме текущего x, который используется для оценки f, x_prime на самом деле не имеет значения, и вместо этого q получен из x читается по ошибке.
Конечно, множественное вычисление f допустимо, поскольку в myfunc f получается после того, как q получается из x.
Одним из примеров является использование числового гессиана с конечной разностью.
Чтобы оценить числовой гессиан, оптимизатору потребуется вызвать myjac со многими различными xs.
Поскольку myjac читает только неизмененный q вместо x, все якобианы будут абсолютно одинаковыми.
Я пробовал позволить myjac и myhessp вычислять g и hv по x вместо q, но в моем случае вычисление q занимает очень много времени.
Напротив, получение g и hv из q происходит довольно быстро.
Поэтому я хочу придерживаться стратегии, и мне интересно, работает ли с ней какой-нибудь оптимизатор.
Лучше, чтобы оптимизатор был второго порядка, чтобы сходимость была легкой.
Он также должен быть основан на алгоритм со сдвигом уровня и радиусом доверия, потому что у меня под рукой есть хороший предобуславливатель.
Заранее большое спасибо!
Подробнее здесь: https://stackoverflow.com/questions/786 ... n-and-proj