[paddle] 矩阵的分解

特征值

A A A 是一个 n × n n \times n n×n 的方阵, λ \lambda λ 是一个标量, v \mathbf{v} v 是一个非零向量。如果满足以下方程:
A v = λ v A\mathbf{v} = \lambda\mathbf{v} Av=λv
则称 λ \lambda λ 为矩阵 A A A 的一个 特征值(Eigenvalue),而 v \mathbf{v} v 称为对应于 特征值 λ \lambda λ 的特征向量(Eigenvector)。 行列式 ∣ A − λ I ∣ = 0 |A-\lambda I|=0 AλI=0

paddle.linalg.eigvals(x, name=None) 一般方阵

paddle.linalg.eigvalsh(x, name=None) 实对称或厄尔米特矩阵

import paddle
paddle.seed(2023)
x = paddle.rand(shape=[3, 3], dtype='float64')
print(x)
print(paddle.linalg.eigvals(x))

特征分解

如果矩阵 A A A n n n 个线性独立的特征向量 v 1 , v 2 , … , v n \mathbf{v}_1, \mathbf{v}_2, \ldots, \mathbf{v}_n v1,v2,,vn,分别对应于特征值 λ 1 , λ 2 , … , λ n \lambda_1, \lambda_2, \ldots, \lambda_n λ1,λ2,,λn,那么矩阵 A A A 可以被分解为:
A = V Λ V − 1 A = V \Lambda V^{-1} A=VΛV1
其中:

  • V V V 是一个 n × n n \times n n×n 的矩阵,其列向量是 A A A 的特征向量,即 V = [ v 1 , v 2 , … , v n ] V = [\mathbf{v}_1, \mathbf{v}_2, \ldots, \mathbf{v}_n] V=[v1,v2,,vn]
  • Λ \Lambda Λ 是一个 n × n n \times n n×n 的对角矩阵,其对角线上的元素是 A A A 的特征值,即 Λ = diag ( λ 1 , λ 2 , … , λ n ) \Lambda = \text{diag}(\lambda_1, \lambda_2, \ldots, \lambda_n) Λ=diag(λ1,λ2,,λn)
  • V − 1 V^{-1} V1 是矩阵 V V V 的逆矩阵。

特征分解的性质

  1. 特征值的唯一性:对于一个给定的矩阵,其特征值是唯一的(考虑重根的情况)。
  2. 特征向量的线性独立性:不同特征值对应的特征向量是线性独立的。
  3. 对角化现实中存在大量方阵不能与对角矩阵相似,(但与其若尔当标准型总相似), 这不妨碍软件求解的特征值和特征向量的正确性。

paddle.linalg.eig(x)

  • x为方阵)

paddle.linalg.eigh(x)

  • x为实对称矩阵或这复数共轭对称矩阵(Hermit 矩阵)
import paddle
x = paddle.to_tensor([[1.6707249, 7.2249975, 6.5045543],[9.956216,  8.749598,  6.066444 ],[4.4251957, 1.7983172, 0.370647 ]])
w, v = paddle.linalg.eig(x)
print(v)
print(w)
# paddle.multi_dot  没有定义复数域矩阵乘法,此处给出作者定义的矩阵乘法进行结果检验
def mat_dot(List):A=List[0]B=List[1]sizeA=A.shape sizeB=B.shapeif len(sizeA)==1 and len(sizeB)==1:if sizeA[0]==sizeB[0]:C= addle.sum(A*B)else:print("矩阵乘法维数不匹配")elif len(sizeA)==1 and len(sizeB)==2:if sizeA[0]==sizeB[1]:C=paddle.zeros([sizeB[1]])for j in range(sizeB[1]):C[j]= addle.sum(A*B[:,j])else:print("矩阵乘法维数不匹配")elif len(sizeA)==2 and len(sizeB)==1:C=paddle.zeros([sizeA[0]])if sizeA[1]==sizeB[0]:for i in range(sizeA[0]):C[i]=paddle.sum(A[i,:]*B)elif len(sizeA)==2 and len(sizeB)==2:C=paddle.zeros([sizeA[0],sizeB[1]])if sizeA[1]==sizeB[0]:for i in range(sizeA[0]):for j in range(sizeB[1]):C[i]=paddle.sum(A[i,:]*B[:,j])return(C)     # 特征向量与特征值的检验比较 Aν v.s. λν
for i in range(3):print(mat_dot([x,v[:,i]]))print(w[i]*v[:,i])

LU 分解

X = L U X=LU X=LU, 其中 L L L 为下三角矩阵, U U U 为上三角矩阵,常用与求解线性方程组的解。

paddle.linalg.lu(x, pivot=True, get_infos=False, name=None)

  • x (Tensor) - 需要进行 LU 分解的输入矩阵 x,x 是维度大于 2 维的矩阵。
  • pivot (bool,可选) - LU 分解时是否进行旋转。若为 True 则执行旋转操作,若为 False 则不执行旋转操作,该选项只在 gpu 下起作用,cpu 下暂不支持为 False,会报错。默认 True。
  • get_infos (bool,可选) - 是否返回分解状态信息,若为 True,则返回分解状态 Tensor,否则不返回。默认 False。
  • name (str,可选) - 具体用法请参见 Name,一般无需设置,默认值为 None。
import paddle
x = paddle.to_tensor([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]]).astype('float64')
lu,p,info = paddle.linalg.lu(x, get_infos=True)
print(lu)
print(p)
print(info)
P,L,U = paddle.linalg.lu_unpack(lu,p)
print(P)
print(L)
print(U)
# one can verify : X = P @ L @ U ;

Householder 乘积

Householder变换的乘积

Householder变换可以通过一个向量来定义。设 w \mathbf{w} w 是一个单位向量,即 w ⊤ w = 1 \mathbf{w}^\top \mathbf{w} = 1 ww=1,则Householder变换矩阵 H \mathbf{H} H 可以表示为:
H = I − 2 w w ⊤ \mathbf{H} = \mathbf{I} - 2\mathbf{w}\mathbf{w}^\top H=I2ww其中 I \mathbf{I} I 是单位矩阵。

Householder变换的乘积

当多个Householder变换矩阵相乘时,其结果仍然是一个Householder变换矩阵。具体来说,如果 H 1 , H 2 , … , H k \mathbf{H}_1, \mathbf{H}_2, \ldots, \mathbf{H}_k H1,H2,,Hk 都是Householder变换矩阵,那么它们的乘积 H = H 1 H 2 … H k \mathbf{H} = \mathbf{H}_1\mathbf{H}_2 \ldots \mathbf{H}_k H=H1H2Hk 也是一个Householder变换矩阵。常用于QR分解。

乘积的性质

  • 正交性:每个Householder变换矩阵都是正交矩阵,即 H ⊤ = H − 1 \mathbf{H}^\top = \mathbf{H}^{-1} H=H1。因此,它们的乘积也是正交矩阵。
  • 行列式:Householder变换矩阵的行列式为 − 1 -1 1 1 1 1。因此,多个Householder变换矩阵相乘后,其行列式为 ( − 1 ) k (-1)^k (1)k 1 1 1,其中 k k k 是变换的个数。
  • 反射性:Householder变换矩阵的乘积仍然具有反射性,即它可以将一个向量反射到另一个向量上。

paddle.linalg.householder_product(x, tau, name=None)

import paddle
x = paddle.to_tensor([[-1.1280,  0.9012, -0.0190],[ 0.3699,  2.2133, -1.4792],[ 0.0308,  0.3361, -3.1761],[-0.0726,  0.8245, -0.3812]])
tau = paddle.to_tensor([1.7497, 1.1156, 1.7462])
Q = paddle.linalg.householder_product(x, tau)
print(Q)

QR 分解

计算一个或一批矩阵的正交三角分解,也称 QR 分解(暂不支持反向)。

X = Q R X=QR X=QR, Q Q Q是正交矩阵 Q Q ⊤ = I QQ^\top =I QQ=I, R R R 是上三角矩阵。

paddle.linalg.qr(x, mode=‘reduced’, name=None)

  • Tensor Q,正交三角分解的 Q 正交矩阵,需注意如果 mode = “reduced”,则不返回 Q 矩阵,只返回 R 矩阵。
  • Tensor R,正交三角分解的 R 上三角矩阵。
import paddle
x = paddle.to_tensor([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]]).astype('float64')
q, r = paddle.linalg.qr(x)
print (q)
print (r)
# one can verify : X = Q * R ;

Cholesky 分解

Cholesky分解是用于将一个正定矩阵分解为一个下三角矩阵和其转置的乘积的方法。设 A \mathbf{A} A 是一个 n × n n \times n n×n 的正定矩阵,则存在一个下三角矩阵 L \mathbf{L} L,使得:
A = L L ⊤ \mathbf{A} = \mathbf{L}\mathbf{L}^\top A=LL其中 L ⊤ \mathbf{L}^\top L表示 L \mathbf{L} L 的转置矩阵。

Cholesky分解的性质

  • 唯一性:对于给定的正定矩阵 A \mathbf{A} A,其Cholesky分解是唯一的。
  • 正定性:只有正定矩阵才能进行Cholesky分解。
  • 下三角性:分解得到的矩阵 L \mathbf{L} L 是一个下三角矩阵,即其上三角部分的元素均为零。

Cholesky分解的算法

Cholesky分解的算法通常通过迭代计算下三角矩阵 L \mathbf{L} L 的各个元素。对于 i ≤ j i \leq j ij,有:
l i j = 1 l i i ( a i j − ∑ k = 1 i − 1 l i k l j k ) l_{ij} = \frac{1}{l_{ii}} \left( a_{ij} - \sum_{k=1}^{i-1} l_{ik} l_{jk} \right) lij=lii1(aijk=1i1likljk)其中 l i j l_{ij} lij是矩阵 L \mathbf{L} L的元素, a i j a_{ij} aij是矩阵 A \mathbf{A} A 的元素。

paddle.linalg.cholesky(x, upper=False, name=None)

  • x (Tensor)- 输入变量为多维 Tensor,它的维度应该为 [, M, N],其中为零或更大的批次尺寸,并且最里面的两个维度上的矩阵都应为对称的正定矩阵,支持数据类型为 float32、float64。
  • upper (bool)- 指示是否返回上三角矩阵或下三角矩阵。默认值:False。
import paddle
paddle.seed(2023)a = paddle.rand([3, 3], dtype="float32")
a_t = paddle.transpose(a, [1, 0])
x = paddle.matmul(a, a_t) + 1e-03out = paddle.linalg.cholesky(x, upper=False)
print(out)

SVD 分解

SVD分解的定义

SVD(Singular Value Decomposition,奇异值分解)是线性代数中的一种矩阵分解方法,它将一个矩阵分解为三个矩阵的乘积:一个正交矩阵、一个对角矩阵和一个正交矩阵的转置。具体来说,对于任意一个 m × n m \times n m×n的矩阵 A A A,都可以表示为:
A = U Σ V T A = UΣV^T A=UΣVT
其中:

  • U U U是一个 m × m m \times m m×m的正交矩阵,其列向量称为左奇异向量。
  • Σ Σ Σ是一个 m × n m \times n m×n的对角矩阵,对角线上的元素称为奇异值,按照从大到小的顺序排列。
  • V V V是一个 n × n n \times n n×n的正交矩阵,其列向量称为右奇异向量。

SVD分解的性质

  1. 奇异值是非负的,并且按照从大到小的顺序排列。
  2. 左奇异向量和右奇异向量是正交的。
  3. 原矩阵 A A A的秩等于其非零奇异值的个数。
  4. SVD分解是唯一的,只要奇异值不重复。

SVD分解的几何意义

SVD分解可以看作是将矩阵 A A A的作用分解为三个步骤:

  1. 通过矩阵 V V V将原始空间旋转到一个新的坐标系。
  2. 通过对角矩阵 Σ Σ Σ进行各个方向的缩放。
  3. 通过矩阵 U U U将缩放后的空间旋转到最终的坐标系。
    这种分解方式揭示了矩阵 A A A在几何上的本质作用,即旋转、缩放和再旋转。

paddle.linalg.svd(x, full_matrices=False, name=None)

  • x (Tensor) - 输入的欲进行奇异值分解的一个或一批方阵,类型为 Tensor。 x 的形状应为 [*, M, N],其中 * 为零或更大的批次维度,数据类型支持 float32, float64。
  • full_matrices (bool) - 是否计算完整的 U 和 V 矩阵,类型为 bool 默认为 False。这个参数会影响 U 和 V 生成的 Shape。

返回

  • Tensor U,奇异值分解的 U 矩阵。如果 full_matrics 设置为 False,则 Shape 为 [ ∗ , M , K ] [*, M, K] [,M,K],如果 full_metrices 设置为 True,那么 Shape 为 [ ∗ , M , M ] [*, M, M] [,M,M]。其中 K 为 M 和 N 的最小值。
  • Tensor S,奇异值向量,Shape 为 [ ∗ , K ] [*, K] [,K]
  • Tensor VH,奇异值分解的 VH 矩阵。如果 full_matrics 设置为 False,则 Shape 为 [ ∗ , K , N ] [*, K, N] [,K,N],如果 full_metrices 设置为 True,那么 Shape 为 [ ∗ , N , N ] [*, N, N] [,N,N]。其中 K 为 M 和 N 的最小值。
import paddle
x = paddle.to_tensor([[1.0, 2.0], [1.0, 3.0], [4.0, 6.0]]).astype('float64')
x = x.reshape([3, 2])
u, s, vh = paddle.linalg.svd(x)
print (u)
print (s)
print (vh)

低秩矩阵的SVD分解

paddle.linalg.svd_lowrank(x, q=None, niter=2, M=None, name=None)

  • x (Tensor) - 输入的需要进行奇异值分解的一个或一批方阵,类型为 Tensor。 x 的形状应为 [*, M, N],其中 * 为零或更大的批次维度,数据类型支持 float32, float64。
  • q (int,可选) - 对输入 X
    的秩稍微高估的预估值,默认值为 None,代表预估值取 6。
  • niter (int) - 需要进行的子空间迭代次数。默认值为 2。
  • M (Tensor) - 输入矩阵在 axis=-2 维上的均值,形状应为 [*, 1, N],默认为 None。
import paddle
paddle.seed(2024)
x = paddle.randn((5, 5), dtype='float64')
U, S, V = paddle.linalg.svd_lowrank(x)
print(U)
print(S)
print(V)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/13375.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt:Qt环境配置安装

搭建Qt开发环境 Qt的开发工具概述 Qt 支持多种开发工具,其中比较常用的开发工具有:Qt Creator、Visual Studio、Eclipse。 Qt Creator Qt Creator是⼀个轻量级的跨平台集成开发环境(IDE),专为使用Qt框架进行应用程…

文献阅读分享《新闻推荐中的审议式多样性:操作化与实验用户研究》

标题期刊年份Deliberative Diversity for News Recommendations: Operationalization and Experimental User StudyProceedings of the Seventeenth ACM Conference on Recommender Systems (RecSys 23)2023 🌟论文背景 在信息爆炸的时代,新闻推荐系统…

AspectJ 中通知方法参数绑定

我们知道 AspectJ 中的通知方法可以携带参数,例如 Before 前置通知方法可以携带一个 JoinPoint 类型参数,那么还可以携带其它参数吗? 示例一 Before(value "execution(* *..UserServiceImpl.doSome(String))", argNames "…

bat脚本实现自动化漏洞挖掘

bat脚本 BAT脚本是一种批处理文件,可以在Windows操作系统中自动执行一系列命令。它们可以简化许多日常任务,如文件操作、系统配置等。 bat脚本执行命令 echo off#下面写要执行的命令 httpx 自动存活探测 echo off httpx.exe -l url.txt -o 0.txt nuc…

Golang 并发机制-6:掌握优雅的错误处理艺术

并发编程可能是提高软件系统效率和响应能力的一种强有力的技术。它允许多个工作负载同时运行,充分利用现代多核cpu。然而,巨大的能力带来巨大的责任,良好的错误管理是并发编程的主要任务之一。 并发代码的复杂性 并发编程增加了顺序程序所不…

数据分析系列--[11] RapidMiner,K-Means聚类分析(含数据集)

一、数据集 二、导入数据 三、K-Means聚类 数据说明:提供一组数据,含体重、胆固醇、性别。 分析目标:找到这组数据中需要治疗的群体供后续使用。 一、数据集 点击下载数据集 二、导入数据 三、K-Means聚类 Ending, congratulations, youre done.

71.StackPanel黑白棋盘 WPF例子 C#例子

就是生成黑白棋盘&#xff0c;利用该控件能自动排列的功能。用一个横向的StackPanel嵌套纵向的StackPanel&#xff0c;然后在里面添加设定好长和高的矩形。 因为StackPanel是按照控件的大小展示的。所以如果不设置长和宽。就会显示不出矩形。 <StackPanel Orientation"…

【吾爱出品】开源桌面组件:widgets

widgets 桌面组件 链接&#xff1a;https://pan.xunlei.com/s/VOIQXVWeQIXS_K7NRvVHun_7A1?pwdgq4j# 一款用 vue3 构建的Windows桌面小部件。 这是桌面组件前端开源组件&#xff0c;作者称&#xff1a;项目还在持续完善中&#xff0c;目前包含键盘演示、抖音热榜、喝水提醒…

【QT笔记】使用QScrollArea实现多行文本样式显示

目录 一、QScrollArea 的基本概念 二、demo代码 三、实现效果 1、页面空间足够&#xff0c;无滚动条时显示效果 2、有滚动条时显示效果 一、QScrollArea 的基本概念 QScrollArea 是 Qt 框架中用于提供一个滚动条区域&#xff0c;允许用户滚动查看比当前可视区域更大的内容…

【CPP】CPP经典面试题

文章目录 引言1. C 基础1.1 C 中的 const 关键字1.2 C 中的 static 关键字 2. 内存管理2.1 C 中的 new 和 delete2.2 内存泄漏 3. 面向对象编程3.1 继承和多态3.2 多重继承 4. 模板和泛型编程4.1 函数模板4.2 类模板 5. STL 和标准库5.1 容器5.2 迭代器 6. 高级特性6.1 移动语义…

vs code 使用教程

一、定义 多行注释vs 找不到上层文件路径选择 或 创建python 虚拟环境git 远程克隆及推送vs code 文件路径vs 使用tensorboard 二、使用 学习网站&#xff1a;https://learn.microsoft.com/zh-cn/visualstudio/python/?viewvs-2022性能分析&#xff1a;https://learn.micros…

Verilog基础(一):基础元素

verilog基础 我先说,看了肯定会忘,但是重要的是这个过程,我们知道了概念,知道了以后在哪里查询。语法都是术,通用的概念是术。所以如果你有相关的软件编程经验,那么其实开启这个学习之旅,你会感受到熟悉,也会感受到别致。 入门 - 如何开始 欢迎来到二进制的世界,数字…

LabVIEW与PLC交互

一、写法 写命令立即读出 写命令后立即读出&#xff0c;在同一时间不能有多个地方写入&#xff0c;因此需要在整个写入后读出过程加锁 项目中会存在多个循环并行执行该VI&#xff0c;轮询PLC指令 在锁内耗时&#xff0c;就是TCP读写的实际耗时为5-8ms&#xff0c;在主VI六个…

接口对象封装思想及实现-笔记

目录 接口对象封装代码分层思想 封装案例封装Tpshop商城登录Tpshop商城登录参数化 接口对象封装 代码分层思想 分层思想&#xff1a;将普通思想分为两层&#xff0c;分为接口对象层和测试脚本层 接口对象层&#xff1a; 对接口进行封装&#xff0c;封装好之后&#xff0c;给测…

Javascript 日期计算如何实现当前日期加一天或者减去一天

• 1. Javascript 如何计算当前日期加一天或者减去一天的返回值 • 1.1. 加一天 • 1.2. 减一天 • 1.3. 解释 1. Javascript 如何计算当前日期加一天或者减去一天的返回值 在JavaScript中&#xff0c;可以通过Date对象来计算当前日期加一天或减去一天。 以下是一个简单的…

C_位运算符及其在单片机寄存器的操作

C语言的位运算符用于直接操作二进制位&#xff0c;本篇简单结束各个位运算符的作业及其在操作寄存器的应用场景。 一、位运算符的简单说明 1、按位与运算符&#xff08;&&#xff09; 功能&#xff1a;按位与运算符对两个操作数的每一位执行与操作。如果两个对应的二进制…

109,【1】攻防世界 web 题目名称-文件包含

进入靶场 直接显示源代码 提示我们通过get方式传递名为filename的参数&#xff0c;同时给出了文件名check.php filenamecheck.php 显示使用了正确的用法&#xff0c;错误的方法 filename./check.php 还是一样的回显 傻了&#xff0c;题目名称是文件包含&#xff0c;需要用到…

算法日记12:SC40树状数组(单点修改)

一、题目 二、题解&#xff1a; 2.1&#xff1a;题目的修改/查询交替进行&#xff0c;一眼就是树状数组的模板题目(当先修改最后查询可以使用前缀和/差分实现)&#xff0c; 2.2&#xff1a;树状数组结构&#xff1a;每一个节点都有其管辖区间 2.2.1:lowbit()函数 : l o w b i…

6 加密技术与认证技术

6 加密技术与认证技术 6.1:对称加密与非对称加密技术 6.1.1:对称加密 对称加密:; 特点: 1、加密强度不高&#xff0c;但效率高;2、密钥分发困难。 常见对称密钥&#xff08;共享秘钥&#xff09;加密算法:DES、3DES(三重DES)、RC-5、IDEA算法。 6.1.1.2非对称加密技术 非对称…

安卓开发,Reason: java.net.SocketTimeoutException: Connect timed out

错误提示&#xff1a; Could not install Gradle distribution from https://services.gradle.org/distributions/gradle-8.9-bin.zip. Reason: java.net.SocketTimeoutException: Connect timed out 解决办法&#xff1a; 1、打开gradle\wrapper\gradle-wrapper.properties …