Я пытаюсь минимизировать (A_m-B*C_m)**2
, где A - фиксированная матрица, а B и C - переменные матрицы.Матрицы имеют формы (3,3512,512), (3,3,512,1) и (1,1,512,512) соответственно.
Любой совет о том, где я иду не так, или любой совет о том, как выполнить эту оптимизацию, приветствуется.
Код
# objective function
def f(params, A):
total = 0
B, C = params
for k in range(0,512):
for m in range(0,512):
for n in range(0,9):
total += (A[k*m*n] - B[m*n] * C[k*m])**2
print(total)
return total
# create matrices
A = np.random.rand(3,3,512,512)
B = np.random.rand(3,3,512,1)
C = np.random.rand(1,1,512,512)
# flatten into 1d vectors
A = A.ravel()
B = B.ravel()
C = C.ravel()
# perform minimization
x = [B, C]
result = optimize.minimize(f, x, args=(A))
Выходные данные Я получаю числа для 'total' в течение нескольких итераций, а затем происходит сбой:
407783.32968906895
407783.3247324555
407783.3244573258
407783.32968906895
2988640.705408569
2988640.705408569
2988640.797336188
2988640.7918476323
358476.57749339886
358476.57749339886
358476.57633670256
358476.5758499606
Traceback (most recent call last):
File "minimize.py", line 148, in <module>
result = optimize.minimize(f, x, args=(A))
File "/anaconda3/lib/python3.6/site-packages/scipy/optimize/_minimize.py", line 481, in minimize
return _minimize_bfgs(fun, x0, args, jac, callback, **options)
File "/anaconda3/lib/python3.6/site-packages/scipy/optimize/optimize.py", line 994, in _minimize_bfgs
rhok = 1.0 / (numpy.dot(yk, sk))
ValueError: operands could not be broadcast together with shapes (4608,) (262144,)