Чтобы минимизировать 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
costFunc
не зависит отx0
. Его нельзя свести к минимуму относительноx0
, если изменениеx0
не влияет? Вам нужно изменить свою функцию так, чтобы параметр, который вы хотите изменить, был первым (x0
) аргументом. - person askewchan   schedule 06.09.2015