Как я могу обновить значение аргументов в функции scipy.optimize.minimize?

В моей проблеме мне нужно обновить значение args внутри функции стоимости, но args является аргументом функции и также имеет структуру кортежа. Мне было интересно, есть ли способ изменить элемент args и обновить его, чтобы использовать его с помощью функции jac? Например, в приведенных ниже кодах

paraList = [detValVec, projTrans, MeasVec, 
            coeMat, resVec, absCoeRec]
res = optimize.minimize(costFunc, x0, args=(paraList,), method='BFGS', jac=gradientFunc, options={'gtol': 1e-6, 'disp': True}) 
def costFunc(x0,arg):
    para = list(arg)
    para[3], para[4], para[5] = forwardModelFunc(para[0], para[1], para[2]) 
    return para[5]

Я хотел бы обновить para[3], para[4], para[5] в аргументе args.


person VahidEtt    schedule 04.09.2015    source источник
comment
Ваш costFunc не зависит от x0. Его нельзя свести к минимуму относительно x0, если изменение x0 не влияет? Вам нужно изменить свою функцию так, чтобы параметр, который вы хотите изменить, был первым (x0) аргументом.   -  person askewchan    schedule 06.09.2015


Ответы (1)


Чтобы минимизировать costFunc, вы должны иметь возможность изменять входные параметры (иначе они всегда будут иметь одно и то же значение!). Функция optimize.minimize будет изменять ("обновлять") x, но оставит args нетронутым, так как вызовет costFunc, а это означает, что ваш paraList действительно должен быть задан как x, а не args.

Поскольку costFunc зависит только от первых трех значений в вашем списке параметров para[:3], обновление трех последних para[3:] не будет иметь никакого эффекта, поэтому вы можете использовать x = para[:3] и args = para[3:]. На самом деле вам даже не нужен args, так как он не имеет никакого эффекта.

Что-то типа:

paraList = [detValVec, projTrans, MeasVec, coeMat, resVec, absCoeRec]

def costFunc(x):
    out = forwardModelFunc(x[0], x[1], x[2]) 
    return out[2]

x0 = paraList[:3] # the initial guess
res = optimize.minimize(costFunc, x0, method='BFGS', jac=gradientFunc,
                        options={'gtol': 1e-6, 'disp': True}) 

Таким образом, оптимальный результат, который вы получите (возвращенный в res.x), будет лучшим значением для первых трех параметров в paraList: detValVec, projTrans и MeasVec. Если вы хотите получить последние три значения, которые они подразумевают, вы можете просто вызвать forwardModelFunc на res.x:

paraList_opt = list(res.x) + list(forwardModelFunc(*res.x)

Конечно, важно понимать ограничения optimize.minimize: он может минимизировать только массив x, если это одномерный массив скаляров, поэтому, надеюсь, значения в вашем paramList являются скалярами. Если нет, вам придется сгладить и объединить их. Кроме того, он передаст те же x и args якобиану gradientFunc, поэтому убедитесь, что он также правильно отформатирован.

person askewchan    schedule 06.09.2015