【问题标题】:Reconstruction of tensor in sktensor/scikit-tensor after decomposition using HOSVD使用 HOSVD 重构 sktensor/scikit-tensor 中的张量
【发布时间】:2017-04-20 02:19:02
【问题描述】:

我目前正在分解一个 3-D 张量,例如 [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 返回的实际函数是什么以及如何从中重建张量???

【问题讨论】:

  • 回答迟了,但我涵盖了你所有的问题

标签: python tensor scikit-tensor


【解决方案1】:

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


函数如下:

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

可视化


编辑 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

【讨论】:

  • 很好地解释了塔克分解。 CP分解呢?对于非常大且稀疏的张量是否有有效的解决方案?谢谢。
  • @seralouk 所以要从它的分解形式回到我的张量T,我应该做T = core_S.dot(U1).dot(U2).dot(U3)。但不幸的是,它不起作用。我错过了什么?谢谢!
  • 如何确定排名为[2, 3, 1]?有没有什么具体的方法可以做到这一点?我遇到了 Percentage of Variance Explained 决定选择排名。有什么方法可以实现吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2020-07-17
  • 2016-02-15
  • 2019-06-06
  • 2020-12-12
  • 2017-08-10
相关资源
最近更新 更多