首页 > 编程语言 >2.3Tucker分解HOSVD、HOOI算法推导和python实现

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

时间:2023-05-26 22:02:28浏览次数:36  
标签:Tensor python range rank Tucker tl HOOI mode HOSVD


HOSVD参考论文:A MULTILINEAR SINGULAR VALUE DECOMPOSITION

HOSVD虽然不能保证给Tucker分解给出最优拟合,但是可以提供一个好的初始化的解

这些矩阵都是正交的。之所以求前R最大特征值,可以在下文的HOOI看到,目的是最大化目标函数UW

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


HOSVD的最后一行证明如下:

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

HOOI:

2.3Tucker分解HOSVD、HOOI算法推导和python实现_特征值_03

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

故此,优化目标可以化为:

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


因此HOOI算法如下:

2.3Tucker分解HOSVD、HOOI算法推导和python实现_张量_05


注意,左特征值向量是横向量

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<max_err:
                break

    G = tl.tenalg.multi_mode_dot(Tensor, U, list(range(len(rank))), transpose=True)
    return U,G

# A = tl.tensor([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
#                 [ 0.,  0.,  0.,  0.,  1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.],
#                 [ 0.,  0.,  0.,  0.,  1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.],
#                 [ 0.,  0.,  0.,  0.,  1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.],
#                 [ 0.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  0.],
#                 [ 0.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  0.],
#                 [ 0.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  0.],
#                 [ 0.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  0.],
#                 [ 0.,  0.,  0.,  0.,  1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.],
#                 [ 0.,  0.,  0.,  0.,  1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.],
#                 [ 0.,  0.,  0.,  0.,  1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.],
#                 [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])
# rank = [2,2]
rank = [2,3,2]
A = tl.tensor(np.array([[[1.0,14,15],[23,6,20],[24,18,8],[24,18,8]],
                        [[15,8,7],[28,12,17],[21,29,23],[24,18,8]],
                        [[9,5,3],[7,22,26],[21,1,19],[24,18,8]]]))

core, factors = tucker(A, rank=rank)
Ahat0 = tl.tenalg.multi_mode_dot(core,factors,list(range(len(rank))))

U,G = HOSVD(A,rank)
Ahat1 = tl.tenalg.multi_mode_dot(G,U,list(range(len(rank))))

U, G = HOOI(A,rank,500,1e5)
Ahat2 = tl.tenalg.multi_mode_dot(G,U,list(range(len(rank))))


标签:Tensor,python,range,rank,Tucker,tl,HOOI,mode,HOSVD
From: https://blog.51cto.com/u_16131692/6359380

相关文章

  • python md5源码
    importbinasciiimportsysimportos.pathSV=[0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40......
  • python day3
    上篇案例  #我写的importrandomnum=random.randint(1,10)print(num)a=int(input("请输入数字"))ifa==num:print("bingo!")elifa>num:b=int(input("大了,还有两次机会,重新输入"))ifb>num:c=int(input(&qu......
  • Python 使用Seaborn画图,代码正常不出图
    不得不说,这个库画出来的图也太好看了。目前还没有很懂这个库,但是需要注意的是我在用完plt之后引入这个,图片一直出不来真的困扰我很久啊。终于找到了救命的办法参考链接:https://blog.csdn.net/qq_56039091/article/details/124024286......
  • 【python基础】变量
    1.初识变量编程本质就是通过一定的规则,去操纵数据,变量作为数据的载体,在程序中经常会被用到。与变量相联系的还有一个名词叫数据类型,我们可以举一个生活中的例子,来理解数据类型-变量-数据三者之间的关系红色的1号杯子中装满了水,其中红色就代表数据类型,1号杯子就代表变量,而水就代......
  • 使用 OpenCV 进行轮廓检测 (Python/C++)第一部分
    什么是轮廓当我们连接一个对象边界上的所有点时,我们得到一个轮廓。通常,特定轮廓是指具有相同颜色和强度的边界像素。OpenCV使得在图像中查找和绘制轮廓变得非常容易。它提供了两个简单的功能:findContours()drawContours()此外,它有两种不同的轮廓检测算法:CHAIN_APPROX_SIMPLECHAIN_......
  • Python Web开发:深入剖析Web框架及其实现方式
    1.引言在现代Web应用程序开发中,Python是最受欢迎的编程语言之一。它是一种高级、通用、解释性的语言,被广泛应用于开发Web应用程序、科学计算、数据分析、视觉化和人工智能等领域。Python语言旨在提高开发者的生产力,并让他们以更少的代码实现更多的功能。在本文中,我们将讨论Python......
  • Numpy_矩阵的multiply_python的属性以及类特性_装饰器——@property_@classmethod_@st
    Python类中有三个常用的装饰器分别是@property(使一个方法可以被当成属性调用,常用于直接返回某一不想被修改的属性)@classmethod(将一个方法定义为类方法,其中第一个参数要修改为cls,使得该方法可以不用实例化即可被调用)@staticmethod(静态方法,类似于类方法,也可以不用实例化,......
  • python操作mysql数据pymysql-执行语句select查询返回值直接返回dict字典类型或者list
    一、返回tuple元组类型(默认)fetchall()将结果放在二维数组里面,每一行的结果在元组里面importpymysqldefexport(table_name):conn=pymysql.connect(host='118.24.3.40',user='jxz',password='123456',db......
  • python基础day12 函数的参数
    函数参数的两大分类1.形式参数在函数定义阶段括号内一次写入的变量名就叫形式参数,简称“形参”defindex(a,b,c,d)pass#a,b,c,d就称之为是函数的形参2.实际参数在函数调用阶段括号内一次传入的变量值就叫实际参数,简称“实参”index(1,2,3,4)#1,2,3,4就称之为......
  • python中re正则一些用法及其常用正则表达式
    re.findall(pattern,string[,flags])re.findall(pattern,string[,flags])是Pythonre模块中的函数,用于在字符串中查找所有与正则表达式模式匹配的非重叠子字符串,并将它们作为列表返回。具体参数解释如下:pattern:一个正则表达式模式,用于指定要匹配的模式。string:要在其......