张量展开和Tensorly使用

本文深入探讨了张量的切片、展开、模态积、克罗内克积及内积等基本操作,并通过Tensorly库实践了四阶张量的定义与操作,展示了CP与Tucker分解的原理及应用,最后验证了分解后的张量能完美还原。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先介绍一下张量的切片
张量的切片
三阶张量展开公式
三阶张量展开展示图
例子:https://zhuanlan.zhihu.com/p/24824550

从例子中感觉这么展开就是为了满足:三阶张量为X是n1×n2×n3阶的,如果按mode-2展开,矩阵就是n2×(n1×n3)的,具体为什么要这么转置,这个还需要思考,而且还有更高阶的怎么推到展开也需要思考。说一个实际的问题,我发现在Tensorly里面除了好象展开的方法和这个说的不太一样,不过最后得到的展开维度是一样的(别问我,我也不知道为啥)···············

下面给一些自己尝试使用Tensorly库的代码:

import numpy as np
import tensorly as tl
from tensorly.tenalg import *

#下面这是kronecker积,注意要把两个tensor放在一个list里面
arr1 = tl.tensor(np.array([[1,2],[3,4]]))
arr2 = tl.tensor(np.array([[5,6,7],[8,9,10]]))
arr3 = [arr1,arr2]
arr4 = kronecker(arr3)
print(arr4)

#内积的inner函数我总是报错,但是下面这个方法和内积效果是一样的
arr5 = tl.tensor(np.arange(12).astype(np.float64).reshape(3,2,2))
arr6 = tl.tensor(np.arange(12).astype(np.float64).reshape(3,2,2))
print(arr5)
print(arr5*arr6)
print(tl.sum(arr5*arr6))

#下面这是一个2*2*2*2的四阶张量,我觉得这玩应如果不用reshape定义就得这么一层一层写,不然能写懵了,注意在numpy里维度的顺序,可以看看三维的就懂了
arr = tl.tensor(np.array([
    [
        [[1,2],[3,4]],
        [[5,6],[7,8]]
    ],
    [
        [[9,10],[11,12]],
        [[13,14],[15,16]]
    ]
]))

#接下来就是按mode展开,,注意第一个mode是0,而不是1
arr = tl.tensor(np.arange(2*4*3).reshape(3,4,2))
print(arr)
print(tl.unfold(arr, mode=0))
print(tl.unfold(arr, mode=1))
print(tl.unfold(arr, mode=2))
M1 = tl.tensor(np.arange(20).reshape(5, 4))
M2 = tl.tensor(np.arange(18).reshape(6, 3))
M3 = tl.tensor(np.arange(14).reshape(7, 2))

#首先是张量和矩阵的模态积
result1 = mode_dot(arr,M1,1)
print(result1)
print(tl.shape(result1))
M_list = [M1,M2,M3]
mode_list = [1,0,2]

#一个张量和多个矩阵的模态积,注意把矩阵们放在list里,然后把每个矩阵对应的mode放在另一个list里
result2 = multi_mode_dot(arr,M_list,mode_list)
print(result2)
print(tl.shape(result2))

关于CP分解部分已经在之前的介绍过了,不过这个CP分解还是可以还原的(不过这个函数具体我自己并没尝试,可以以后试试)
CP分解还原
下面尝试一下tucker分解:

X = tl.tensor(np.arange(24).astype(np.float64).reshape(3, 4, 2))
print(X)
#rank中的list也是core的维度
core, factors = tucker(X, rank=[2, 2, 2])
print(core)
print(core.shape)
f1,f2,f3 = factors
print(f1.shape)
print(f2.shape)
print(f3.shape)
#根据性质把分解出来的核张量和矩阵还原回去
result = multi_mode_dot(core,factors,[0,1,2])
np.set_printoptions(suppress=True)
print(result)

下面展示一下输出的结果:
X:
[[[ 0. 1.]
[ 2. 3.]
[ 4. 5.]
[ 6. 7.]]

[[ 8. 9.]
[10. 11.]
[12. 13.]
[14. 15.]]

[[16. 17.]
[18. 19.]
[20. 21.]
[22. 23.]]]
core和他的shape:
core
f1,f2,f3:
f1
还原回来的result:
[[[ 0. 1.]
[ 2. 3.]
[ 4. 5.]
[ 6. 7.]]

[[ 8. 9.]
[10. 11.]
[12. 13.]
[14. 15.]]

[[16. 17.]
[18. 19.]
[20. 21.]
[22. 23.]]]

发现是一样的,基础部分完结撒花

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值