当前位置: 首页 > news >正文

ITensors——一个聪明的张量网络库(3)

5、Tensor Decompositions(张量分解)(这一节很基础很重要)

许多常用的张量网络分解都是由矩阵分解建立起来的,如线性代数中已知的QR和奇异值分解(SVD)。

QR分解

T = randomITensor(i,j,k)
Q,R = qr(T,(i,k))

一个新的索引由qr函数生成,它将Q张量连接到R张量,如上所示。这使得只需使用*算子就可以直接恢复张量T:

Q*R ≈ T # true

但是,在希望检索此索引的情况下,一个方便的方法如下:

q = commonind(Q,R)    # (dim=3|id=680|"Link,qr")

SVD在张量网络的计算中起着关键作用

W = randomITensor(i,j,m,k)
U,S,V = svd(W,(j,i))
U*S*V ≈ W # true

v2-b04ec2956c83ef13de9a6c434348b3a0_1440w

某些分解的一个重要特征,如SVD分解,是它们允许由因子分解产生的张量的控制截断。默认情况下,ITensor分解不会截断,尽管它们总是在可用时计算分解的“薄”版本。截断分解可以通过指定截断关键字参数来计算截断分解。在以下示例中

U,S,V = svd(W,(j,i);cutoff=1E-8,maxdim=10)

以下是一个小例子:

i=Index(3,"i")
j=Index(3,"j")
W=randomITensor(i,j)
U,S,V=svd(W,i;cutoff=1E-8,maxdim=10)

输出如下

ITensors.TruncSVD(ITensor ord=2
Dim 1: (dim=3|id=25|"i")
Dim 2: (dim=3|id=244|"Link,u")
NDTensors.Dense{Float64, Vector{Float64}}3×3-0.06074520753072965   0.3515955948952047   0.93417908208883380.36492821122555147  -0.8632923319783523   0.34864559397631610.9290518932835605    0.3620868503517718  -0.07586627965417801, ITensor ord=2
Dim 1: (dim=3|id=244|"Link,u")
Dim 2: (dim=3|id=711|"Link,v")
NDTensors.Diag{Float64, Vector{Float64}}3×31.3004500523343754  0.0                 0.00.0                 0.7714923084829652  0.00.0                 0.0                 0.15709690229548853, ITensor ord=2
Dim 1: (dim=3|id=278|"j")
Dim 2: (dim=3|id=711|"Link,v")
NDTensors.Dense{Float64, Vector{Float64}}3×30.4071617933196845  0.3024337543624265  -0.8618312469868716-0.6716870002226061  0.7385486473263854  -0.0581589998566261340.6189150570091626  0.602560967666023    0.503849612932997, Spectrum{Vector{Float64}, Float64}([1.6911703386164796, 0.5952003820483748, 0.02467943671083827], 0.0), (dim=3|id=244|"Link,u"), (dim=3|id=711|"Link,v"))

如果修改截断为

U,S,V=svd(W,i;cutoff=1E-8,maxdim=2)

结果可以将奇异值只保留前两个最大的

ITensors.TruncSVD(ITensor ord=2
Dim 1: (dim=3|id=25|"i")
Dim 2: (dim=2|id=459|"Link,u")
NDTensors.Dense{Float64, Vector{Float64}}3×2-0.06074520753072965   0.35159559489520470.36492821122555147  -0.86329233197835230.9290518932835605    0.3620868503517718, ITensor ord=2
Dim 1: (dim=2|id=459|"Link,u")
Dim 2: (dim=2|id=176|"Link,v")
NDTensors.Diag{Float64, Vector{Float64}}2×21.3004500523343754  0.00.0                 0.7714923084829652, ITensor ord=2
Dim 1: (dim=3|id=278|"j")
Dim 2: (dim=2|id=176|"Link,v")
NDTensors.Dense{Float64, Vector{Float64}}3×20.4071617933196845  0.3024337543624265-0.6716870002226061  0.73854864732638540.6189150570091626  0.602560967666023, Spectrum{Vector{Float64}, Float64}([1.6911703386164796, 0.5952003820483748], 0.010678884070115963), (dim=2|id=459|"Link,u"), (dim=2|id=176|"Link,v"))

为了能看懂输出,我修改了以下输出格式

ITensors.TruncSVD(
------------------------------------------------------
ITensor ord=2
Dim 1: (dim=3|id=25|"i")                <--------- 如下右图第一个圆的左索引名称为“i”,维度为3
Dim 2: (dim=2|id=459|"Link,u")          <--------- 如下右图第一个圆的右索引名称为“u”,维度为2
NDTensors.Dense{Float64, Vector{Float64}}3×2-0.06074520753072965   0.35159559489520470.36492821122555147  -0.86329233197835230.9290518932835605    0.3620868503517718, 
------------------------------------------------------
ITensor ord=2
Dim 1: (dim=2|id=459|"Link,u")          <--------- 如下右图第二个圆的左索引名称为“u”,维度为2
Dim 2: (dim=2|id=176|"Link,v")          <--------- 如下右图第二个圆的右索引名称为“v”,维度为2
NDTensors.Diag{Float64, Vector{Float64}}2×21.3004500523343754  0.0                <--------- 对应的奇异值由大到小排列,由于截断设为2,故只剩两个最大的奇异值0.0                 0.7714923084829652, 
------------------------------------------------------
ITensor ord=2
Dim 1: (dim=3|id=278|"j")               <--------- 如下右图第三个圆的右索引名称为“j”,维度为3
Dim 2: (dim=2|id=176|"Link,v")          <--------- 如下右图第三个圆的左索引名称为“v”,维度为2
NDTensors.Dense{Float64, Vector{Float64}}3×20.4071617933196845  0.3024337543624265-0.6716870002226061  0.73854864732638540.6189150570091626  0.602560967666023, 
------------------------------------------------------
Spectrum{Vector{Float64}, Float64}([1.6911703386164796, 0.5952003820483748], 0.010678884070115963), (dim=2|id=459|"Link,u"), (dim=2|id=176|"Link,v"))

这样可以很清晰的看到分解过后的三个矩阵,虽然没什么实用价值,但是在初学阶段有助于理解程序。

v2-962cceea31a1344136d9afb221925778_1440w

http://www.jsqmd.com/news/642385/

相关文章:

  • 从“AI仿生人”到“原创音乐人”:普通人如何用AI写歌、发歌、赚钱
  • 网页游戏市场每日分析|二级市场传奇页游平台排名|602游戏平台
  • JDK安装及JRE说明
  • fastapi2
  • Wazuh OVA镜像部署实战:从零搭建开源XDR-SIEM一体化平台
  • AI 到底会不会取代人类?从四大行业落地真相看程序员的“危”与“机”
  • SITS2026多模态搜索上线前48小时:一场召回率突降38%的故障溯源与反脆弱加固
  • 2026年排行好的找工作招工平台推荐 - 品牌宣传支持者
  • D3KeyHelper终极指南:5分钟掌握暗黑3技能自动化神器
  • STM32F103实战:Zbar库移植与二维码识别优化指南
  • FT232H连接Vivado出现问题2026
  • OpenVSP:快速上手指南!5分钟学会开源参数化飞机设计
  • 新手SRC挖掘实战 | 一次从信息泄露到校园教务后台的完整路径
  • 从CSS选择器到DOM树匹配:Easy-Scraper如何重构网页数据提取的技术范式
  • 光影的艺术:从入门到电影级宣传片的布光与器材全解析
  • CDLF多级泵在高层供水系统中稳不稳?关键不在参数,而在这4个点
  • 比特 GEO 优化:亳州本地AI 搜索排名与本地地理定位双引擎,药都企业精准获客首选
  • 别再手动算脉冲了!用STM32CubeMX的编码器模式,5分钟搞定直流电机测速(附防溢出处理代码)
  • 入行AI应用开发?AI应用开发岗都是先混进去再说!
  • AI创作利器:Harness+OpenClaw+CLI实战
  • 先免费试用下Claude code安装使用(教程)
  • web后端python安全-总结
  • 电动牙刷语音播报蓝牙屏驱电机驱动八大解决方案
  • 华为云引领工业软件云端革命,【aigc】chrome-devtools-mcp怎么玩?。
  • 从GTP到GTM:深入解析Xilinx Ultrascale系列GT收发器的演进与选型指南
  • 提升企业知识使用率的运营活动设计指南
  • INTERFACE AZI-2502接口输出模块
  • Mysql--基础知识点--98--临键锁 VS 间隙锁
  • 除螨仪到底有没有效果?2026 十款家用高性价比除螨仪品牌精选推荐
  • LightGBM核心优化策略与实战调参指南