Сципи минимизирует цель поэтапно - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь применить минимизатор scipy к векторизованной целевой функции, которая принимает несколько аргументов np.arrays.В этом примере я хочу поэлементно минимизировать obj(x,p) относительно x, принимая p как фиксированное значение.При p = np.array([2,3,4]) минимумы должны быть 2, 3 и 4.

Но

import numpy as np
from numba import vectorize, float64
from scipy.optimize import minimize
xinit = np.array([1,1,1])
p = np.array([2,3,4])

@vectorize([float64(float64,float64)])
def obj(x,p):
    return((x-p)**2)

minimize(obj, x0 = xinit,args = p, method='Nelder-Mead')

возвращает ValueError: setting an array element with a sequence.

Кто может помочь?

Большое спасибо заранее!

1 Ответ

0 голосов
/ 16 декабря 2018

Не сразу понятно, чего вы пытаетесь достичь: (x-p)**2 - это массив, поэтому использование его в качестве цели не является четко определенной операцией (поскольку нет разумного порядка использования).Возможно, вы действительно хотите получить квадрат расстояния между двумя параметрами?Т.е. что составляет

def obj(x, p):
    return np.linalg.norm(x-p)**2

Это сработает и найдет нужный минимум, но в этот момент подпись vectorize больше не действительна;однако, вызываемый объект все еще может быть скомпилирован с Numba JIT.

...