#python #python-3.x #scipy #scipy-optimize-minimize
#python #python-3.x #scipy #scipy-оптимизация-минимизация
Вопрос:
Я использовал следующий код:
options = {'maxiter':50, 'disp':True}
res = optimize.minimize(
fun=lrCostFunction,
x0=theta_k,
args=(X, y_k, lambda_),
method='CG',
options=options
)
И это дает мне следующую ошибку:
TypeError: only size-1 arrays can be converted to Python scalars
The above exception was the direct cause of the following exception:
ValueError: setting an array element with a sequence.
Но когда я установил jac = True
следующее:
options = {'maxiter':50, 'disp':True}
res = optimize.minimize(
fun=lrCostFunction,
x0=theta_k,
jac=True,
args=(X, y_k, lambda_),
method='CG',
options=options
)
Все работает нормально, но в документации не указано, что мы должны установить jac = True
, так что здесь не так?
Ответ №1:
Я предполагаю, что целевая функция lrCostFunction
возвращает как значения функции, так и градиенты. Согласно документации minimize
Предполагается, что If
jac
является логическим значением и имеет значение True,fun
возвращает градиент вместе с целевой функцией. Если значение равно False, градиент будет оцениваться с использованием «2-точечной» оценки конечных разностей.
Поэтому, если jac=False
в то время как целевая функция возвращает также градиент, вы получите некоторую ошибку. Например
# objective function
def obj_func(x,a,b,c):
func_val = a*x[0]**2 b*x[1] c
func_grad = 2*a*x[0] b
return func_val,func_grad
x0 = np.random.rand(3)
res = minimize(obj_func,x0,args=(1,2,3),method='CG')
Если я выполню этот код, я получу TypeError
. Если я установил jac=True
, все работает нормально.