朱莉娅的 ST-HOSVD
ST-HOSVD in Julia
我正在尝试在 Julia 中实现 ST-HOSVD 算法,因为我找不到包含 ST-HOSVD 的库。
请参阅第 7 页算法 1 中的这篇论文。
https://people.cs.kuleuven.be/~nick.vannieuwenhoven/papers/01-STHOSVD.pdf
我无法通过 tucker 秩为 (2,2,2,2) 的近似张量来再现输入 (4,4,4,4) 张量。
我想我在矩阵或张量元素的索引中有一些错误,但我找不到它。
如何解决?
如果你知道 ST-HOSVD 的库,请告诉我。
ST-HOSVD 是减少信息的常用方法。我希望这个问题对许多 Julia 用户有帮助。
using TensorToolbox
function STHOSVD(A, reqrank)
N = ndims(A)
S = copy(A)
Sk = undef
Uk = []
for k = 1:N
if k == 1
Sk = tenmat(S, k)
end
Sk_svd = svd(Sk)
U1 = Sk_svd.U[ :, 1:reqrank[k] ]
V1t = Sk_svd.V[1:reqrank[k], : ]
Sigma1 = diagm( Sk_svd.S[1:reqrank[k]] )
Sk = Sigma1 * V1t
push!(Uk, U1)
end
X = ttm(Sk, Uk[1], 1)
for k=2:N
X = ttm(X, Uk[k], k)
end
return X
end
A = rand(4,4,4,4)
X = X_STHOSVD(A, [2,2,2,2])
编辑
这里,Sk = tenmat(S, k)
是张量S的n阶矩阵化。
S∈R^{I_1×I_2×…×I_N}, S_k∈R^{I_k×(Π_{m≠k}^{ N}I_m)}
函数包含在TensorToolbox.jl中。请参阅自述文件中的“基础”。
mode-k矩阵化的定义可以在the paper第460页看到。
有效。
我在 this slide
中看到了 26 页
using TensorToolbox
using LinearAlgebra
using Arpack
function STHOSVD(T, reqrank)
N = ndims(T)
tensor_shape = size(T)
for i = 1 : N
T_i = tenmat(T, i)
if reqrank[i] == tensor_shape[i]
USV = svd(T_i)
else
USV = svds(T_i; nsv=reqrank[i] )[1]
end
T = ttm( T, USV.U * USV.U', i)
end
return T
end
我正在尝试在 Julia 中实现 ST-HOSVD 算法,因为我找不到包含 ST-HOSVD 的库。
请参阅第 7 页算法 1 中的这篇论文。 https://people.cs.kuleuven.be/~nick.vannieuwenhoven/papers/01-STHOSVD.pdf
我无法通过 tucker 秩为 (2,2,2,2) 的近似张量来再现输入 (4,4,4,4) 张量。 我想我在矩阵或张量元素的索引中有一些错误,但我找不到它。 如何解决?
如果你知道 ST-HOSVD 的库,请告诉我。 ST-HOSVD 是减少信息的常用方法。我希望这个问题对许多 Julia 用户有帮助。
using TensorToolbox
function STHOSVD(A, reqrank)
N = ndims(A)
S = copy(A)
Sk = undef
Uk = []
for k = 1:N
if k == 1
Sk = tenmat(S, k)
end
Sk_svd = svd(Sk)
U1 = Sk_svd.U[ :, 1:reqrank[k] ]
V1t = Sk_svd.V[1:reqrank[k], : ]
Sigma1 = diagm( Sk_svd.S[1:reqrank[k]] )
Sk = Sigma1 * V1t
push!(Uk, U1)
end
X = ttm(Sk, Uk[1], 1)
for k=2:N
X = ttm(X, Uk[k], k)
end
return X
end
A = rand(4,4,4,4)
X = X_STHOSVD(A, [2,2,2,2])
编辑
这里,Sk = tenmat(S, k)
是张量S的n阶矩阵化。
S∈R^{I_1×I_2×…×I_N}, S_k∈R^{I_k×(Π_{m≠k}^{ N}I_m)}
函数包含在TensorToolbox.jl中。请参阅自述文件中的“基础”。
mode-k矩阵化的定义可以在the paper第460页看到。
有效。 我在 this slide
中看到了 26 页using TensorToolbox
using LinearAlgebra
using Arpack
function STHOSVD(T, reqrank)
N = ndims(T)
tensor_shape = size(T)
for i = 1 : N
T_i = tenmat(T, i)
if reqrank[i] == tensor_shape[i]
USV = svd(T_i)
else
USV = svds(T_i; nsv=reqrank[i] )[1]
end
T = ttm( T, USV.U * USV.U', i)
end
return T
end