栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

2.3Tucker分解HOSVD、HOOI算法推导和python实现

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2.3Tucker分解HOSVD、HOOI算法推导和python实现

HOSVD参考论文:A MULTILINEAR SINGULAR VALUE DECOMPOSITION
HOSVD虽然不能保证给Tucker分解给出最优拟合,但是可以提供一个好的初始化的解
这些矩阵都是正交的。之所以求前R最大特征值,可以在下文的HOOI看到,目的是最大化目标函数UW

HOSVD的最后一行证明如下:

HOOI:

黄色之所以可以化过去,是因为原张量X其实是核张量G在高维空间的映射,而这个映射矩阵是单位正交矩阵,也就是说,只是旋转但不改变长度。因此F范数不变。
故此,优化目标可以化为:

因此HOOI算法如下:

注意,左特征值向量是横向量
skip是什么

python实现为:

import numpy as np
import tensorly as tl
from tensorly.decomposition import tucker
tl.set_backend('numpy')

def HOSVD(Tensor, rank):
    U = []
    for i in range(len(rank)):
        tmpU,_,_ = np.linalg.svd(tl.unfold(Tensor,mode=i))
        U.append(tmpU[0:rank[i]].T)
    G = tl.tenalg.multi_mode_dot(Tensor,U,list(range(len(rank))),transpose=True)
    return U,G



def HOOI(Tensor,rank,max_iter,max_err=1e5):
    U,G = HOSVD(Tensor,rank)
    for epoch in range(max_iter):
        for i in range(len(rank)):
            Y = tl.tenalg.multi_mode_dot(Tensor,U,skip=i, modes=list(range(len(rank))),transpose=True)
            tmpU, _, _ = np.linalg.svd(tl.unfold(Y, mode=i))
            U[i] = tmpU[0:rank[i]].T
            # cal error
            T_hat = tl.tenalg.multi_mode_dot(G,U,list(range(len(rank))))
            error = tl.norm(Tensor - T_hat)
            print("epoch:", epoch, ",error:", error)
            if error
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/980505.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号