Оптимизация требует 1D-вектора для оптимизации. Ты на правильном пути. Вам нужно сгладить ваш аргумент до minimize
, а затем в f
, начните с x = np.reshape(x, (2, m, n))
, затем вытащите w
и z
, и вы должны быть в бизнесе.
Я столкнулся с этим вопросом раньше. Например, оптимизация частей векторов в нескольких разных классах одновременно. Обычно я завершаю функцию, которая сопоставляет вещи с 1D-вектором, а затем другую функцию, которая выводит данные обратно в объекты, поэтому я могу оценить функцию стоимости. Как и в случае:
def toVector(w, z):
assert w.shape == (2, 4)
assert z.shape == (2, 4)
return np.hstack([w.flatten(), z.flatten()])
def toWZ(vec):
assert vec.shape == (2*2*4,)
return vec[:2*4].reshape(2,4), vec[2*4:].reshape(2,4)
def doOptimization(f_of_w_z, w0, z0):
def f(x):
w, z = toWZ(x)
return f_of_w_z(w, z)
result = minimize(f, toVec(w0, z0))
# Different optimize functions return their
# vector result differently. In this case it's result.x:
result.x = toWZ(result.x)
return result