python - 在张量分解后重新组合张量

标签 python math data-science scikits

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

最佳答案

例如4个矩阵的CP积

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

可以用Einstein notation表示作为

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

关于python - 在张量分解后重新组合张量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39748285/

相关文章:

machine-learning - 机器学习,不平衡的非数字变量类重要吗

python - Python 中的并行.For

python - 为什么 fetchone()[0] 返回 'Nonetype'

math - 矩阵运算可枚举n部分图的所有路径

c# - C# 中的简单数学问题

java - 如何在一定比例的时间内生成随机数

python - 如何将 'cluster'和 'pylab'导入Pycharm

R : knnImputation Giving Error

python - Tensorflow Dataset API shuffle 将性能降低 9 倍

python - Abaqus 中的 Scipy