まぃふぇいばりっと

機械学習やってます.Julia大好きです.勉強したことの殴り書きです.

Julia 言語 タッカーランクが低いランダムテンソルを生成する

ランダムな低ランクテンソルが欲しいときってありますよね. テンソルのランクっていろいろありますが,とりあえずタッカーランクがひくいランダムテンソルを手に入れるコードをかきました.

もっとよい方法があったら知りたいです.

using LinearAlgebra
using TensorToolbox
function get_low_tucker_tensor(J,R)
    G = rand(R...)
    D = length(J)
    U = Vector{Matrix{Float64}}(undef,D)
    for d = 1:D
        U[d] = rand(J[d],R[d])
    end
    T = ttm(G, [U...], [1:D;])
    return T
end

ここで J が欲しいテンソルのサイズで,Rが欲しいタッカーランクです.どちらもベクトルで渡してください.たとえば,タッカーランクが(2,2,2)の3×4×5のテンソルが欲しい場合は以下のようにします.また,mrankを使うとタッカーランクが確認できます.

julia > J = [3,4,5]; R=[2,2,2];
julia > Y = get_low_tucker_tensor(J,R);
julia > mrank(Y)
(2,2,2)