使用HOSVD分解sktensor / scikit-tensor中张量的重建

时间:2017-04-20 02:19:03

标签: python tensor scikit-tensor

我目前正在分解像[user,item,tags] = rating这样的三维张量。我在python中使用sktensor库进行分解。对于前。

T = np.zeros((3, 4, 2))
T[:, :, 0] = [[ 1,  4,  7, 10], [ 2,  5,  8, 11], [3,  6,  9, 12]]
T[:, :, 1] = [[13, 16, 19, 22], [14, 17, 20, 23], [15, 18, 21, 24]]
T = dtensor(T) 
Y = hooi(T, [2, 3, 1], init='nvecs')

现在实际上函数hooi正在返回以及如何从那个重构张量

1 个答案:

答案 0 :(得分:5)

首先,函数tucker_hooi使用高阶正交计算张量的Tucker分解     迭代。

该功能如下:

hooi(X, rank, init)

其中:

  • X是要分解的张量
  • rank是张量的每种模式的分解等级
  • init: {'random', 'nvecs'}是要使用的初始化方法(随机或HOSVD)

示例:

from sktensor.tucker import hooi
import numpy as np
from sktensor import dtensor

T = np.zeros((3, 4, 2))
T[:, :, 0] = [[ 1,  4,  7, 10], [ 2,  5,  8, 11], [3,  6,  9, 12]]
T[:, :, 1] = [[13, 16, 19, 22], [14, 17, 20, 23], [15, 18, 21, 24]]
T = dtensor(T) 
print(T.shape)
#(3, 4, 2)

Y = hooi(T, [2, 3, 1], init='nvecs')

core_S = Y[0]
core_S = np.array(core_S)
print(core_S.shape)
#(2, 3, 1)

U1 = Y[1][0]
U2 = Y[1][1]
U3 = Y[1][2]

print(U1)

[[ 0.54043979  0.7357025 ]
 [ 0.57659506  0.02952065]
 [ 0.61275033 -0.67666119]]

结果解释

  • core_S是核心张量S
  • Ux是模式x
  • 的左奇异矩阵Ux

可视化

enter image description here

编辑1:

要重建原始张量T,请执行以下操作:

from sktensor.core import ttm

core, U = hooi(T,rank= [2, 3, 1])
Trec = ttm(core, U)

print(Trec.shape)
#(3, 4, 2)

来源:https://github.com/mnick/scikit-tensor/blob/master/sktensor/tests/test_tucker_hooi.py