Приведенный ниже код предназначен для поиска минимальных ошибок при аппроксимации тензорного развертывания с тремя матрицами a, b, c. Оптимизация проводится с использованием переменных a, b, c.
Я новичок в оптимизации, поэтому, пожалуйста, помогите мне разобраться в этом. Мои запросы:
khatri_rao
, используя a, b, c для каждой итерации.params[0]/[1]/[2]
не являются значениями 2D-массива. Не видны даже начальные значения? Ошибка моего кода говорит о том, какой кортеж?Любая помощь приветствуется. Спасибо
import scipy.optimize as optimize
import numpy as np
import sys
sys.path.append("../tensorly-master/")
import tensorly as tl
def f(params, t0, t1, t2):#arguments are tensor unfold
a, b, c= params[0], params[1], params[2]#multi variables in optimization
#norm of tensor unfold mode0 minus "a" matrix multiplied with transpose of ' khatri rao product of "c" & "b" '
value0= t0 - np.matmul(a, tl.tenalg.khatri_rao([c, b], reverse=False).T)
value1= t1 - np.matmul(b, tl.tenalg.khatri_rao([a, c], reverse=False).T)
value2= t2 - np.matmul(c, tl.tenalg.khatri_rao([b, a], reverse=False).T)
#sum of all norms
values=np.linalg.norm(value0, "fro")+np.linalg.norm(value1, "fro")+np.linalg.norm(value2, "fro")
#optimizing the sum of all norms be minimum
return values
#randomly initialinzing tensor , three arrays and unfolding tensor
tn=np.random.uniform(low=0, high=100, size=(3,3,3))
a=np.random.uniform(low=0, high=100, size=(3,2))
b=np.random.uniform(low=0, high=100, size=(3,2))
c=np.random.uniform(low=0, high=100, size=(3,2))
t0=tl.unfold(tn, 0)
t1=tl.unfold(tn, 1)
t2=tl.unfold(tn, 2)
#optimization
result=optimize.minimize(f, [a, b, c], args=(t0, t1, t2))
if result.success:
fitted_params = result.x
print(fitted_params)
else:
raise ValueError(result.message)
ошибка:
error:-
Using numpy backend.
Traceback (most recent call last):
File "stc.py", line 27, in <module>
result=optimize.minimize(f, [a, b, c], args=(t0, t1, t2))
File "/home/manish/.local/lib/python2.7/site-packages/scipy/optimize/_minimize.py", line 597, in minimize
return _minimize_bfgs(fun, x0, args, jac, callback, **options)
File "/home/manish/.local/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 963, in _minimize_bfgs
gfk = myfprime(x0)
File "/home/manish/.local/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 293, in function_wrapper
return function(*(wrapper_args + args))
File "/home/manish/.local/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 723, in approx_fprime
return _approx_fprime_helper(xk, f, epsilon, args=args)
File "/home/manish/.local/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 657, in _approx_fprime_helper
f0 = f(*((xk,) + args))
File "/home/manish/.local/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 293, in function_wrapper
return function(*(wrapper_args + args))
File "stc.py", line 10, in f
value0= t0 - np.matmul(a, tl.tenalg.khatri_rao([c, b], reverse=False).T)
File "../tensorly-master/tensorly/tenalg/_khatri_rao.py", line 70, in khatri_rao
n_columns = matrices[0].shape[1]
IndexError: tuple index out of range
min || t0 - a (c * b) ^ T || _f + || t1 - b (a * c) ^ T || _f + || t2 - c (b * a) ^ T || _f где a , b, c - переменные, а матрицы 3X2 и t0, t1, t2 - матрицы 3X9, * - произведение khatri-rao (не умножение), ^ T - транспонирование, а _f - норма Фробениуса. Я новичок в написании функции оптимизации для этого, где функция содержит вызов функции для khatri-rao на каждой итерации. Автономная эта функция "f" дает результат. Я неправильно моделирую математическое уравнение в коде?
Я бы добавил диагностическую распечатку к f
, чтобы проверить природу переменных a
, b
, c
, которые он получает. Какая у них форма? dtype
? Другими словами, убедитесь, что вы понимаете, что minimize
передает вашей функции.
Спасибо за предложение, params - это одномерный массив, который необходимо соответствующим образом изменить перед присвоением a, b, c.
optimize
вызывает функцию f
, передавая одномерный массив (shape (n,)), даже если данное исходное предположение не является этой формой (см., Например, в _minimize_bfgs
). Вы можете использовать reshape
и numpy.split
для восстановления правильных 2D-массивов a
, b
и c
из 1D-массива params
:
import scipy.optimize as optimize
import numpy as np
import tensorly as tl
def f(params, t0, t1, t2): # arguments are tensor unfold
a, b, c = np.split(x0.reshape(3, 6), 3, axis=1) # unpack the variables
# norm of tensor unfold mode0 minus "a" matrix
# multiplied with transpose of ' khatri rao product of "c" & "b" '
value0= t0 - np.matmul(a, tl.tenalg.khatri_rao([c, b], reverse=False).T)
value1= t1 - np.matmul(b, tl.tenalg.khatri_rao([a, c], reverse=False).T)
value2= t2 - np.matmul(c, tl.tenalg.khatri_rao([b, a], reverse=False).T)
#sum of all norms
values = np.linalg.norm(value0, "fro") + \
np.linalg.norm(value1, "fro") + \
np.linalg.norm(value2, "fro")
# optimizing the sum of all norms be minimum
return values
# randomly initializing tensor, three arrays and unfolding tensor
tn = np.random.uniform(low=0, high=100, size=(3,3,3))
t0 = tl.unfold(tn, 0)
t1 = tl.unfold(tn, 1)
t2 = tl.unfold(tn, 2)
# Initial guess :
a = np.random.uniform(low=0, high=100, size=(3,2))
b = np.random.uniform(low=0, high=100, size=(3,2))
c = np.random.uniform(low=0, high=100, size=(3,2))
x0 = np.hstack([a, b, c]).ravel()
# optimization
result = optimize.minimize(f, x0, args=(t0, t1, t2))
if result.success:
fitted_params = result.x
print(fitted_params)
else:
raise ValueError(result.message)
Приятно иметь "бесплатный" решатель. При этом обручи настоящие ...: D
1.shape` - это кортеж. То, что
shape[1]
вызывает эту ошибку, означает, что форма имеет только один элемент, поэтомуmatrices[0]
должен быть 1d (или даже 0d). Я ничего не знаю оtensorly
,tl.tenalg.khatri_rao
получает входные данные неправильного размера. Вы тестировалиf()
, чтобы убедиться, что он может быть вызван с начальными параметрами?