Python 在张量分解后重新合成张量

Python 在张量分解后重新合成张量,python,math,data-science,scikits,Python,Math,Data Science,Scikits,我正在尝试使用python库分解3D矩阵。我设法将我的张量(维度为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 inf

我正在尝试使用python库分解3D矩阵。我设法将我的张量(维度为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张量库函数cp_als提供的正则分解。此外,分解矩阵的预期维数是多少?

例如,4个矩阵的CP乘积

可以用as表示

或者在努比作为

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

cp.py说:$A\approx\sum{r=1}{rank}\\vec{u}{r^{(1)}\outer\cdots\outer\\vec{u}{r^{(N)}$。你试过了吗?这应该与“P.totensor()”相同@Bort你是指cp.py的第145行和第146行吗?嘿,尼尔斯,谢谢你的回复。你确定吗?我试着重新组合矩阵,结果不接近初始张量,这取决于你能把张量分解得多好。如果你的ε是大的,那么这两个参数会有明显的不同。在cp_als算法的情况下,除了可以处理的潜在维数之外,其他参数是什么?对不起,我不理解你的问题。我试图找出除了张量秩之外,在分解过程中可以调整的参数是什么。