朱莉娅的 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