我想用SVD分解一个三维Tensor。
我不太确定是否以及如何实现以下分解。
从本教程中,我已经知道如何水平分割Tensor:tensors.org Figure 2.2b
d = 10; A = np.random.rand(d,d,d)
Am = A.reshape(d**2,d)
Um,Sm,Vh = LA.svd(Am,full_matrices=False)
U = Um.reshape(d,d,d); S = np.diag(Sm)
我想用SVD分解一个三维Tensor。
我不太确定是否以及如何实现以下分解。
从本教程中,我已经知道如何水平分割Tensor:tensors.org Figure 2.2b
d = 10; A = np.random.rand(d,d,d)
Am = A.reshape(d**2,d)
Um,Sm,Vh = LA.svd(Am,full_matrices=False)
U = Um.reshape(d,d,d); S = np.diag(Sm)
2条答案
按热度按时间gojuced71#
矩阵方法可以自然地扩展到更高阶。例如,SVD可以推广到Tensor,例如Tucker decomposition,有时称为高阶SVD。
我们维护了一个用于Tensor方法TensorLy的Python库,它可以让你轻松地完成这个任务。在这个例子中,你需要一个部分Tucker,因为你想让其中一个模式不被压缩。
让我们导入必要的零件:
为了进行测试,让我们创建大小为(10,10,10)的三阶Tensor:
现在,你可以使用Tensor分解来分解Tensor。在你的例子中,你想保留其中一个维度不变,所以你只有两个因子(U和V)和一个核心Tensor(S):
您可以使用一系列n模式乘积从近似值中重构原始Tensor,以使核心与因子收缩:
在我的情况下,我得到
hzbexzde2#
您也可以使用Python中的“tensorlearn”包,例如使用Tensor训练(TT)SVD算法。https://github.com/rmsolgi/TensorLearn/tree/main/Tensor-Train%20Decomposition