张量分解后重新组合一个张量

Posted

技术标签:

【中文标题】张量分解后重新组合一个张量【英文标题】:Re-compose a Tensor after tensor factorization 【发布时间】:2017-02-06 11:31:01 【问题描述】:

我正在尝试使用 python 库 scikit-tensor 分解 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-tensor 库函数 cp_als 提供的规范分解。分解后的矩阵的预期维数是多少?

【问题讨论】:

cp.py 说:$A\approx\sum_r=1^rank \\vecu_r^(1) \outer \cdots \outer \\vec u_r^(N)$。你试过吗?这应该与“P.totensor()”相同 @Bort 你的意思是 cp.py 的第 145 和 146 行? 【参考方案1】:

例如 4 个矩阵的 CP 积

可以用Einstein notation表示为

或在 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

【讨论】:

嗨 Nils 感谢您的回复。你确定吗?我尝试重新组合矩阵,结果与初始张量不接近。 嗯,这首先取决于您分解张量的能力。如果您的 epsilon 很大,则两者会明显不同。 在cp_als算法的情况下,除了隐维数我能处理的参数还有哪些? 我不明白你的问题,对不起。 我试图弄清楚除了张量等级之外我可以在分解过程中调整哪些参数。

以上是关于张量分解后重新组合一个张量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Keras / Tensorflow 中将(无,)批量维度重新引入张量?

使用Tensorly的非负张量分解示例

将张量数据裁剪到包围体

在张量流检查点中修改张量的形状

张量tensor 和张量分解 tensor decomposition

基于张量分解的遥感图像恢复及常用高光谱遥感数据集