Минимизация норм матрицы с помощью scipy.minimize - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь минимизировать (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,) 
...