在张量因子分解后重新构成张量

Jos*_*mon 13 python math scikits data-science

我正在尝试使用python库scikit-tensor分解3D矩阵.我设法将我的Tensor(尺寸为100x50x5)分解为三个矩阵.我的问题是如何使用Tensor分解产生的分解矩阵再次组合初始矩阵?我想检查分解是否有任何意义.我的代码如下:

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)
Run Code Online (Sandbox Code Playgroud)

我正在使用scikit-tensor库函数cp_als提供的规范分解.此外,分解矩阵的预期维数是多少?

Nil*_*ner 7

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)
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下你会使用

numpy.einsum('az,bz->ab', P.U[0], P.U[1])
Run Code Online (Sandbox Code Playgroud)

或者,在你的3矩阵情况下

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

sktensor.ktensor.ktensor还有一个方法totensor()可以做到这一点:

np.allclose(np.einsum('az,bz->ab', P.U[0], P.U[1]), P.totensor())
>>> True
Run Code Online (Sandbox Code Playgroud)