张量分解(二):CP分解

张量分解系列:
张量分解(一):基础知识
张量分解(二):CP分解
张量分解(三):Tucker分解
张量分解(四):Tensor-train Decomposition
张量分解(五):Tensorizing Neural Network
张量分解(六):TTRNN model for video classification

这一篇文章主要讲解CP分解算法(CANDECOMP/PARAFAC decomposition).
首先,我们必须明确,CP分解是做了什么工作,目的是想干什么。
我来自问自答:CP分解是将一个高维的张量,分解成多个核的和,每个核是由向量的外积组成;通过这样的分解,我们可以大大地降低参数的维度。
其实,不止CP分解,其他的张量分解算法都是同个道理,只是所采用的分解方法不同而已。当然,这样的分解只是原来张量的近似,没办法保证完全复原。
从以上角度来说,张量分解的目的跟矩阵分解是相同的,只是一个是在二维上的分解,另一个是在高维上的分解而已。
好了,开始进入正题。简单来说,CP分解其实就是多个rank-one tensors的和。rank-one tensors请参考上一篇文章:张量分解(一):基础知识
一个三维张量的CP分解如下图所示:
这里写图片描述
用公式表达如下:
这里写图片描述
当然,我们还可以将张量X矩阵化:
这里写图片描述
至于怎么转换的,可能要看一下上一篇文章的Khatri-Rao product,这里不细说。
我们可以使用向量 λ \lambda λ对三维向量 a , b , c a,b,c a,b,c进行归一化:
这里写图片描述
当然,这是当核是三维的情况下,当核是N维时,同个道理:
这里写图片描述
以上,就是CP分解的介绍。
接下来,我将讲一下CP分解的优化。上面我们已经有了CP分解的形式了,那么我们怎么去优化所有参数,使得分解后跟分解前尽可能的相似呢?
一个常用的方法是使用交替最小二乘法(the alternating least squares,ALS)去优化。我们以三维张量为例,如下所示:
这里写图片描述
其中, X X X为已知的张量, X ^ \hat X X^为待优化的参数,已经被分解成向量外积的形式。
我们这里的优化方法是:先固定 B , C B,C B,C,优化 A A A;接着固定 A , C A,C A,C,优化 B B B;固定 A , B A,B A,B,优化 C C C;然后继续迭代,直到达到终止条件(达到迭代次数或者损失不再降低等)。
对于参数 A A A,完整的优化过程如下图所示:
这里写图片描述
这里写图片描述
参数 B , C B,C B,C同理,然后不断迭代即可。
N维tensor完整的交替最小二乘法优化CP分解参数的过程如下图:
这里写图片描述
以上,便是关于CP分解的所有内容。

参考:tensor decompositions and application

  • 18
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
CP张量分解算法是一种常用的高维数据分析方法,用于将一个高维张量分解为多个低维张量的乘积形式。这种分解可以帮助我们理解和挖掘数据中的潜在结构和模式。在Python中,可以使用Tensorly库来实现CP张量分解算法。 Tensorly是一个用于张量操作和分解的Python库,它提供了丰富的功能和工具来处理高维数据。下面是使用Tensorly库进行CP张量分解的基本步骤: 1. 安装Tensorly库:可以使用pip命令在Python环境中安装Tensorly库,命令如下: ``` pip install tensorly ``` 2. 导入Tensorly库:在Python代码中导入Tensorly库,命令如下: ```python import tensorly as tl ``` 3. 加载数据:将需要进行CP张量分解的高维张量加载到Python中,可以使用NumPy数组或Tensorly库提供的张量对象。 4. 进行CP张量分解:使用`tl.decomposition.parafac`函数进行CP张量分解,该函数接受一个高维张量作为输入,并返回分解后的低维张量。 5. 获取分解结果:根据需要,可以获取分解后的低维张量,以及对应的权重和模式矩阵。 下面是一个简单的示例代码,演示了如何使用Tensorly库进行CP张量分解: ```python import tensorly as tl # 加载数据 tensor = tl.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) # 进行CP张量分解 factors = tl.decomposition.parafac(tensor, rank=2) # 获取分解结果 weights = factors[0] mode_matrices = factors[1:] # 打印分解结果 print("权重:", weights) for i, mode_matrix in enumerate(mode_matrices): print("模式矩阵", i+1, ":", mode_matrix) ``` 这是一个简单的示例,实际应用中可以根据具体需求进行参数设置和数据处理。希望对你有帮助!
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值