t-SVD分解原理和python代码实现

首先应该知道t乘积的概念
在这里插入图片描述
从下面可以看到,这是对A和B的前切面做循环卷积,其中,第一个前切面
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
先证明该式:
在这里插入图片描述
在这里插入图片描述

因此,
在这里插入图片描述
证明如下:
在这里插入图片描述
因此t-SVD算法如下:

在这里插入图片描述
matlab版本代码
python代码如下:

import numpy as np
import tensorly as tl
import t_tools

tl.set_backend('numpy')

def t_svd(A):
    Af = np.fft.fft(A,axis=2)
    U = np.zeros(tuple([A.shape[0],A.shape[0],A.shape[2]]), dtype=complex)
    S = np.zeros(tuple(A.shape), dtype=complex)
    V = np.zeros(tuple([A.shape[1],A.shape[1],A.shape[2]]), dtype=complex)

    for i3 in range(A.shape[2]):
        uf,sf,vf = np.linalg.svd(Af[:,:,i3])
        sf = np.diag(sf)

        U[:,:,i3] = uf
        S[:, :, i3] = sf
        V[:, :, i3] = vf
    U = np.fft.ifft(U,axis=2)
    S = np.fft.ifft(S,axis=2)
    V = np.fft.ifft(V,axis=2)

    Ahat = t_tools.t_prod(t_tools.t_prod(U,S),V)
    return U,S,V,Ahat
A = tl.tensor(np.random.random((5,5,3)))

U,S,V,Ahat = t_svd(A)

注意,Af = np.fft.fft(A,axis=2)
tf = np.fft.fft(A[1:,2:,:])
Af[1,2:]==tf,即沿着第三维度进行t-SVD

算法8,利用类似于FFT,可以只计算一半的SVD
在这里插入图片描述

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值