Перекомпонуйте тензор после факторизации тензора

Я пытаюсь разложить трехмерную матрицу, используя библиотеку python scikit-tensor. Мне удалось разложить свой Tensor (с размерами 100x50x5) на три матрицы. Мой вопрос: как я могу снова составить исходную матрицу, используя разложенную матрицу, созданную с помощью тензорной факторизации? Я хочу проверить, имеет ли разложение какое-либо значение. Мой код следующий:

import logging
from scipy.io.matlab import loadmat
from sktensor import dtensor, cp_als
import numpy as np

//Set logging to DEBUG to see CP-ALS information
logging.basicConfig(level=logging.DEBUG)
T = np.ones((400, 50))
T = dtensor(T)
P, fit, itr, exectimes = cp_als(T, 10, init='random')
// how can I re-compose the Matrix T? TA = np.dot(P.U[0], P.U[1].T)

Я использую каноническую декомпозицию, предоставленную библиотечной функцией scikit-tensor cp_als. Также какова ожидаемая размерность разложенных матриц?


person Jose Ramon    schedule 28.09.2016    source источник
comment
cp.py говорит: $A\приблизительно\sum_{r=1}^{rank} \\vec{u}_r^{(1)} \outer \cdots \outer \\vec{u}_r^{(N )}$. Вы пробовали это? Это должно быть идентично P.totensor()   -  person Bort    schedule 30.09.2016
comment
@Bort, вы имеете в виду строки 145 и 146 файла cp.py?   -  person Jose Ramon    schedule 30.09.2016


Ответы (1)


Произведение CP, например, 4 матриц

X_{abcd} = \displaystyle\sum_{z=0}^{Z}  {A_{az} B_{bz} C_{cz} D_{dz} + \epsilon_{abcd}}

может быть выражено с использованием обозначения Эйнштейна как

X_{abcd} = A_{az} B_{bz} C_{cz} D_{dz} + \epsilon_{abcd}

или в numpy как

numpy.einsum('az,bz,cz,dz -> abcd', A, B, C, D)

так что в вашем случае вы бы использовали

numpy.einsum('az,bz->ab', P.U[0], P.U[1])

или, в вашем 3-матричном случае

numpy.einsum('az,bz,cz->abc', P.U[0], P.U[1], P.U[2])

sktensor.ktensor.ktensor также есть метод totensor(), который делает именно это:

np.allclose(np.einsum('az,bz->ab', P.U[0], P.U[1]), P.totensor())
>>> True
person Nils Werner    schedule 30.09.2016
comment
Привет, Нильс, спасибо за ответ. Вы в этом уверены? Я попытался перекомпоновать матрицу, и результат не был близок к исходному тензору. - person Jose Ramon; 30.09.2016
comment
Ну, в первую очередь это зависит от того, насколько хорошо вы можете разложить тензор. Если ваш эпсилон большой, они будут заметно отличаться. - person Nils Werner; 30.09.2016
comment
Какие параметры, кроме количества скрытых измерений, я могу обрабатывать в случае алгоритма cp_als? - person Jose Ramon; 30.09.2016
comment
Я не понимаю вашего вопроса, извините. - person Nils Werner; 30.09.2016
comment
Я пытаюсь выяснить, какие параметры я могу настроить во время разложения, кроме ранга тензора. - person Jose Ramon; 30.09.2016
comment
Параметры в строке документации. - person Nils Werner; 02.10.2016
comment
Отвечает ли это на ваш вопрос? - person Nils Werner; 05.10.2016