CP张量分解概述

news/2024/11/19 19:26:08/

1. 前置知识

图片

秩为 1 1 1 的张量是指由一个向量的外积所生成的张量。对于一个向量 v ∈ R n \mathbf{v} \in \mathbb{R}^n vRn,它的秩为 1 1 1 的张量【张量习惯性使用欧拉粗体字母表示】可以表示为 T = v ∘ v \mathcal{T} = \mathbf{v} \circ \mathbf{v} T=vv。这个张量的维度是 n × n n \times n n×n,其中每个元素 T i j \mathcal{T}_{ij} Tij 都等于 v i ⋅ v j \mathbf{v}_i \cdot \mathbf{v}_j vivj,即向量 v \mathbf{v} v 的第 i i i 个分量和第 j j j 个分量的乘积。秩为1的张量表示了向量 v \mathbf{v} v 在多个维度上的线性关系,它可以用于描述一些特定的模式或结构。

假设我们有 3 3 3 个秩为 1 1 1 的张量:

张量 A A A a = [ 1 , 2 ] T \mathbf{a} = [1, 2]^T a=[1,2]T
张量 B B B b = [ 3 , 4 ] T \mathbf{b} = [3, 4]^T b=[3,4]T
张量 C C C c = [ 5 , 6 ] T \mathbf{c} = [5,6]^T c=[5,6]T

它们的外积可以通过求乘积和组合得到。外积的结果是一个 3 3 3 维张量,其维度为 2 × 2 × 2 2\times 2\times 2 2×2×2

外积计算如下:

X = a ∘ b ∘ c \mathcal{X} = \mathbf{a} \circ \mathbf{b} \circ \mathbf{c} X=abc

其中, ∘ \circ 表示张量的外积运算。

张量的外积(tensor outer product)是一种张量运算,用于将两个张量相乘生成一个新的张量。它涉及对两个张量的每个元素进行乘积运算,并将结果按照一定规则组合形成新的张量。外积的结果张量的维度是原始张量维度的乘积

最终得到的三阶张量 X \mathcal{X} X 的元素为:
X i j k = a i ⋅ b j ⋅ c k X = [ [ [ 1 × 3 × 5 , 1 × 3 × 6 ] [ 1 × 4 × 5 , 1 × 4 × 6 ] ] [ [ 2 × 3 × 5 , 2 × 3 × 6 ] [ 2 × 4 × 5 , 2 × 4 × 6 ] ] ] [ [ [ 15 , 18 ] [ 20 , 24 ] ] [ [ 30 , 36 ] [ 40 , 48 ] ] ] \mathcal{X}_{ijk} = a_i \cdot b_j \cdot c_k\\ \mathcal{X}= \begin{bmatrix} \begin{bmatrix} \begin{bmatrix} 1\times3\times5,1\times3\times6 \end{bmatrix}\\ \begin{bmatrix} 1\times4\times5,1\times4\times6 \end{bmatrix} \end{bmatrix}\\ \begin{bmatrix} \begin{bmatrix} 2\times3\times5,2\times3\times6 \end{bmatrix}\\ \begin{bmatrix} 2\times4\times5,2\times4\times6 \end{bmatrix} \end{bmatrix} \end{bmatrix} \begin{bmatrix} \begin{bmatrix} \begin{bmatrix} 15,18 \end{bmatrix}\\ \begin{bmatrix} 20,24 \end{bmatrix} \end{bmatrix}\\ \begin{bmatrix} \begin{bmatrix} 30,36 \end{bmatrix}\\ \begin{bmatrix} 40,48 \end{bmatrix} \end{bmatrix} \end{bmatrix} Xijk=aibjckX= [[1×3×5,1×3×6][1×4×5,1×4×6]][[2×3×5,2×3×6][2×4×5,2×4×6]] [[15,18][20,24]][[30,36][40,48]]
在这个例子中,外积结果的维度是 2 × 2 × 2 2\times 2\times 2 2×2×2 ,每个元素是对应位置上张量 A , B , C A,B,C A,B,C 对应元素的乘积。

2. CP分解介绍

CP(Canonical Polyadic)分解,也称为PARAFAC(Parallel Factors)分解,是一种常用的高阶张量分解方法。它的基本思想是将一个 N N N 阶张量表示为若干个秩为 1 1 1 的张量之和的形式。

具体来说,对于一个 N N N 阶张量 X \mathcal{X} XCP分解将它表示为 N N N 个秩为 1 1 1 的张量的线性组合,即:

X ≈ ∑ r = 1 R u r ∘ v r ∘ w r ∘ ⋯ ∘ z r \mathcal{X} \approx \sum_{r=1}^{R} \mathbf{u}_r \circ \mathbf{v}_r \circ \mathbf{w}_r \circ \dots \circ \mathbf{z}_r Xr=1Rurvrwrzr

其中, u r , v r , w r , … , z r \mathbf{u}_r, \mathbf{v}_r, \mathbf{w}_r, \dots, \mathbf{z}_r ur,vr,wr,,zr 是秩为 1 1 1 的张量, R R R 是分解的秩(或称为因子个数,即拆分为几个张量)。

假设我们有一个三阶张量 χ \boldsymbol{\chi} χ,其维度为 I × J × K I \times J \times K I×J×K。通过CP分解,我们得到了三个因子矩阵 A \boldsymbol{A} A B \boldsymbol{B} B C \boldsymbol{C} C,分别具有维度 I × R I \times R I×R J × R J \times R J×R K × R K \times R K×R

CP分解的目标是找到一组最优的秩为 1 1 1 的张量,使得它们的线性组合与原始张量 X \mathcal{X} X 的逼近误差最小。通过CP分解,我们可以将原始的 N N N 阶张量转化为一组低秩张量的叠加,从而实现对高阶数据的降维和表示。

因此,CP分解的思想是将一个 N N N 阶张量分解为若干个秩为 1 1 1 的张量之和的形式,以此来表示和近似原始张量。这种分解方式可以提取出张量的特定模式和结构信息,并广泛应用于高阶数据的分析和处理领域。

χ ≈ [ A , B , C ] ≈ ∑ r = 1 R λ r a r ∘ b r ∘ c r \boldsymbol{\chi} \approx[\boldsymbol{A}, \boldsymbol{B}, \boldsymbol{C}] \approx \sum_{r=1}^{R} \boldsymbol{\lambda}_{r} \boldsymbol{a}_{r}\circ \boldsymbol{b}_{r} \circ\boldsymbol{c}_{r} χ[A,B,C]r=1Rλrarbrcr
这个数学公式是关于CP分解(CANDECOMP/PARAFAC分解)的表示方式。CP分解是一种用于对张量进行低秩近似的方法。

在该公式中,我们有一个原始张量 χ \boldsymbol{\chi} χ,它被近似表示为三个因子矩阵 A \boldsymbol{A} A B \boldsymbol{B} B C \boldsymbol{C} C 的叠加。符号 ≈ \approx 表示近似关系。

公式右侧的第一个近似项 [ A , B , C ] [\boldsymbol{A}, \boldsymbol{B}, \boldsymbol{C}] [A,B,C] 表示将因子矩阵 A \boldsymbol{A} A B \boldsymbol{B} B C \boldsymbol{C} C 直接叠加在一起。这相当于在原始张量的每个位置上进行了一次张量积(outer product),得到一个低秩张量的近似。

公式右侧的第二个近似项 ∑ r = 1 R λ r a r ∘ b r ∘ c r \sum_{r=1}^{R} \boldsymbol{\lambda}_{r} \boldsymbol{a}_{r}\circ \boldsymbol{b}_{r} \circ\boldsymbol{c}_{r} r=1Rλrarbrcr 表示对于每个秩 r r r,我们有一个系数 λ r \boldsymbol{\lambda}_{r} λr 和三个向量 a r \boldsymbol{a}_{r} ar b r \boldsymbol{b}_{r} br c r \boldsymbol{c}_{r} cr,代表因子矩阵 A \boldsymbol{A} A B \boldsymbol{B} B C \boldsymbol{C} C 的第 r r r 列,将张量外积配合权重计算得到重构张量 X recon \mathcal{X}_\text{recon} Xrecon

总之,这个公式表示了将原始张量近似表示为多个秩为 1 1 1 的张量的线性组合,其中每个秩为 1 1 1 的张量由一个系数和三个因子向量的逐元素相乘得到。CP分解通过调整因子矩阵和系数来找到最佳的近似结果。

上边式子是以一维张量为单位进行的操作,若是不好理解可以看如下👇公式,二者等价:
χ i , j , k = ∑ r = 1 R λ r ⋅ a i r ⋅ b j r ⋅ c k r \chi_{i,j,k} = \sum_{r=1}^{R} \lambda_{r} \cdot a_{ir} \cdot b_{jr} \cdot c_{kr} χi,j,k=r=1Rλrairbjrckr
其中, a i r a_{ir} air 表示因子矩阵 A \boldsymbol{A} A 在第 i i i 行、第 r r r 列的元素, b j r b_{jr} bjr 表示因子矩阵 B \boldsymbol{B} B 在第 j j j 行、第 r r r 列的元素, c k r c_{kr} ckr 表示因子矩阵 C \boldsymbol{C} C 在第 k k k 行、第 r r r 列的元素, λ r \lambda_{r} λr 表示权重向量 λ \boldsymbol{\lambda} λ 的第 r r r 个元素。

按照上述公式,我们可以依次计算重构张量 X recon \mathcal{X}_{\text{recon}} Xrecon 中的每个元素。最终,得到的重构张量 χ recon \boldsymbol{\chi}_{\text{recon}} χrecon 的维度应与原始张量 χ \boldsymbol{\chi} χ 的维度相同。

请注意,由于CP分解是一种近似方法,重构张量 χ recon \boldsymbol{\chi}_{\text{recon}} χrecon 可能无法完全恢复原始张量 χ \boldsymbol{\chi} χ 中的所有信息。分解的准确性取决于 R R R 的值和分解算法的性能。

3. CP分解例子

因子矩阵的求法通常交由计算机完成,也不是此处的重点,这里的重点在于已知因子矩阵,如何求重构张量 χ recon \boldsymbol{\chi}_{\text{recon}} χrecon

假设我们有一个三阶张量 χ \boldsymbol{\chi} χ,维度为 2 × 3 × 4 2 \times 3 \times 4 2×3×4,进行 CP 分解,选择 R = 2 R = 2 R=2。那么我们得到三个因子矩阵 A \boldsymbol{A} A B \boldsymbol{B} B C \boldsymbol{C} C,它们的维度分别为 2 × 2 2 \times 2 2×2 3 × 2 3 \times 2 3×2 4 × 2 4 \times 2 4×2

假设得到的因子矩阵如下:
A = [ 0.7 0.2 0.4 0.6 ] , B = [ 0.1 0.9 0.3 0.7 0.5 0.5 ] , C = [ 0.7 0.3 0.2 0.8 0.9 0.1 1.0 1.0 ] . \boldsymbol{A} = \begin{bmatrix} 0.7 & 0.2 \\ 0.4 & 0.6 \end{bmatrix}, \quad \boldsymbol{B} = \begin{bmatrix} 0.1 & 0.9 \\ 0.3 & 0.7 \\ 0.5 & 0.5 \end{bmatrix}, \quad \boldsymbol{C} = \begin{bmatrix} 0.7 & 0.3 \\ 0.2 & 0.8 \\ 0.9 & 0.1 \\ 1.0 & 1.0 \end{bmatrix}. A=[0.70.40.20.6],B= 0.10.30.50.90.70.5 ,C= 0.70.20.91.00.30.80.11.0 .

现在我们可以根据 CP 分解的公式计算重构后的张量 χ recon \boldsymbol{\chi}_{\text{recon}} χrecon。计算过程如下:

χ recon , i , j , k = ∑ r = 1 R λ r ⋅ a i , r ⋅ b j , r ⋅ c k , r \boldsymbol{\chi}_{\text{recon}, i, j, k} = \sum_{r=1}^{R} \lambda_r \cdot a_{i, r} \cdot b_{j, r} \cdot c_{k, r} χrecon,i,j,k=r=1Rλrai,rbj,rck,r

其中, λ r \lambda_r λr 是因子权重, a i , r a_{i, r} ai,r b j , r b_{j, r} bj,r c k , r c_{k, r} ck,r 是因子矩阵的元素。

假设我们选择 λ 1 = 0.5 \lambda_1 = 0.5 λ1=0.5 λ 2 = 0.8 \lambda_2 = 0.8 λ2=0.8

现在,我们可以计算重构后的张量 χ recon \boldsymbol{\chi}_{\text{recon}} χrecon 的元素。

3.1 计算方法1

若是一个一个元素求,则有:
χ recon , 1 , 1 , 1 = 0.5 ⋅ 0.7 ⋅ 0.1 ⋅ 0.7 + 0.8 ⋅ 0.2 ⋅ 0.9 ⋅ 0.3 = 0.0677 χ recon , 1 , 1 , 2 = 0.5 ⋅ 0.7 ⋅ 0.1 ⋅ 0.2 + 0.8 ⋅ 0.2 ⋅ 0.9 ⋅ 0.8 = 0.1222 ⋮ χ recon , 2 , 3 , 4 = 0.5 ⋅ 0.4 ⋅ 0.5 ⋅ 1.0 + 0.8 ⋅ 0.6 ⋅ 0.5 ⋅ 1.0 = 0.34 \boldsymbol{\chi}_{\text{recon}, 1, 1, 1} = 0.5 \cdot 0.7 \cdot 0.1 \cdot 0.7 + 0.8 \cdot 0.2 \cdot 0.9 \cdot 0.3 = 0.0677\\ \boldsymbol{\chi}_{\text{recon}, 1, 1, 2} = 0.5 \cdot 0.7 \cdot 0.1 \cdot 0.2 + 0.8 \cdot 0.2 \cdot 0.9 \cdot 0.8 = 0.1222\\ \vdots\\ \boldsymbol{\chi}_{\text{recon}, 2, 3, 4} = 0.5 \cdot 0.4 \cdot 0.5 \cdot 1.0 + 0.8 \cdot 0.6 \cdot 0.5 \cdot 1.0 = 0.34 χrecon,1,1,1=0.50.70.10.7+0.80.20.90.3=0.0677χrecon,1,1,2=0.50.70.10.2+0.80.20.90.8=0.1222χrecon,2,3,4=0.50.40.51.0+0.80.60.51.0=0.34

以此类推,可以计算其他元素的值,最后进行组合即可。

3.2 计算方法2

X recon = λ 1 ⋅ ( 0.7 0.4 ) ∘ ( 0.1 0.3 0.5 ) ∘ ( 0.7 0.2 0.9 1 ) + λ 2 ⋅ ( 0.2 0.6 ) ∘ ( 0.9 0.7 0.5 ) ∘ ( 0.3 0.8 0.1 1 ) \mathcal{X}_{\text{recon}}= \lambda_1\cdot \begin{pmatrix} 0.7\\0.4 \end{pmatrix} \circ \begin{pmatrix} 0.1\\0.3\\0.5 \end{pmatrix} \circ \begin{pmatrix} 0.7\\0.2\\0.9\\1 \end{pmatrix}+ \lambda_2\cdot \begin{pmatrix} 0.2\\0.6 \end{pmatrix} \circ \begin{pmatrix} 0.9\\0.7\\0.5 \end{pmatrix} \circ \begin{pmatrix} 0.3\\0.8\\0.1\\1 \end{pmatrix} Xrecon=λ1(0.70.4) 0.10.30.5 0.70.20.91 +λ2(0.20.6) 0.90.70.5 0.30.80.11

此两种方法都可以实现张量分解后的重构,至于评判张量分解效果的好坏则需要将重构后的张量与原始张量进行对比,常用的方法是重构误差,当然还有许多其他方法。

本篇博客涉及的内容是自己在学习过程中所整理的笔记,不一定特别严谨【比如数学符号,各种数学名词的使用等】,因此读者在阅读时也要有自己的思考,也欢迎各位直接与我进行交流。


http://www.ppmy.cn/news/471099.html

相关文章

windows的各种扩展名详解

Windows系统文件按照不同的格式和用途分很多种类,为便于管理和识别,在对文件命名时,是以扩展名加以区分的,即文件名格式为: 主文件名.扩展名。这样就可以根据文件的扩展名,判定文件的种类,从而知道其格式和…

PHP不使用CURL发起POST请求

使用场景 发现如下错误需要将CURL的SSL由NSS改为OpenSSL的 cURL error 35: A PKCS #11 module returned CKR_DEVICE_ERROR, indicating that a problem has occurred with the token or slot. (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)上述错误原因有可能是…

PKCS#11及CSP接口标准

RSA非对称密码算法的三个创始人的姓的第一个字母联合起来就是RSA了,他们三个创建的公司的名字也就叫做RSA。在RSA有一个著名的公钥算法的实验室,这个实验室颁发的一系列行业标准就称作为PKCS标准,其中PKCS#11(简称P11)…

Centos7下的Openssl和CA

一、Openssl常用命令: # openssl ? # 查看openssl的命令及子命令 # man enc # 可以直接查看子命令帮助 加密: # openssl enc -des3 -e -salt -in /lee/sh/test.sh -out /lee/sh/test.sh.des3 -des3:指定加密算法,可以在openssl &#…

Frenet坐标系与Cartesian坐标系互转(一):公式推导

Frenet坐标系在无人驾驶领域被普遍使用,特别是在城市、高速等道路交通环境下无人驾驶的路径规划系统中。Frenet坐标系使用道路的中心线作为Base frame,使用参考线的切线向量和法线向量建立坐标系。相比笛卡尔坐标系,Frenet坐标系简化了路径规…

SpringBoots利用redis实现防止接口幂等性重复提交

目录 什么是幂等性? 应用场景分析 解决办法 实际使用 什么是幂等性? 接口的幂等性就是用户对于同一个操作发起的一次请求或者多次请求的结果都是一致的,不会因为多次点击而产生副作用,比如说经典的支付场景:用户购…

Python进阶语法之异常处理

Python进阶语法之异常处理 在编写Python程序时,经常会遇到各种运行时错误,这些错误会导致程序终止并抛出异常。然而,有时我们希望程序能优雅地处理这些错误,而不是直接崩溃。在这种情况下,我们需要使用到Python的异常…

数字时代,你想成为一只“弱鸡”,还是一个“超级个体”?

电话延伸了人类的耳朵,屏幕延伸了人类的眼睛,汽车这样的交通工具延伸了人类的腿脚,人类的生存能力开始变得和技术相关,而这个趋势仍在加剧。 如今,Web3延伸了人的综合体验,AI延伸了人类的大脑,它…