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

随机奇异值分解(Randomized SVD, rSVD)

假设 X ∈ R n × m X \in \mathbb{R}^{n\times m} XRn×m 为瘦高矩阵, n > m n > m n>m

rSVD 算法流程如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# Define randomized SVD function
def rSVD(X,r,q=0,p=0):
    # Step 1: Sample column space of X with P matrix
    ny = X.shape[1]
    P = np.random.randn(ny,r+p)
    Z = X @ P
    for k in range(q):
        Z = X @ (X.T @ Z)

    Q, R = np.linalg.qr(Z,mode='reduced')

    # Step 2: Compute SVD on projected Y = Q.T @ X
    Y = Q.T @ X
    UY, S, VT = np.linalg.svd(Y,full_matrices=0)
    U = Q @ UY

    return U, S, VT

代码详解

在这里插入图片描述

案例

原始图片,大小: (3207, 2260)
在这里插入图片描述

A = imread(os.path.join('..','DATA','jupiter.jpg'))
X = np.mean(A,axis=2) # Convert RGB -> grayscale

U, S, VT = np.linalg.svd(X,full_matrices=0) # Deterministic SVD, [time spent: 8.07s]


r = 400 # Target rank
q = 1   # Power iterations
p = 5   # Oversampling parameter

rU, rS, rVT = rSVD(X,r,q,p)  # [time spent: 0.46s]

SVD 耗时 8.07 s

RSVD 耗时 0.46s,很快啊

## Reconstruction
XSVD = U[:,:(r+1)] @ np.diag(S[:(r+1)]) @ VT[:(r+1),:] # SVD approximation
errSVD = np.linalg.norm(X-XSVD,ord=2) / np.linalg.norm(X,ord=2)

XrSVD = rU[:,:(r+1)] @ np.diag(rS[:(r+1)]) @ rVT[:(r+1),:] # SVD approximation
errSVD = np.linalg.norm(X-XrSVD,ord=2) / np.linalg.norm(X,ord=2)

## Plot

fig, axs = plt.subplots(1,3,figsize=(20,10))

plt.set_cmap('gray')
axs[0].imshow(X)
axs[0].axis('off')
axs[0].set_title('original image')
axs[1].imshow(XSVD)
axs[1].axis('off')
axs[1].set_title('SVD')
axs[2].imshow(XrSVD)
axs[2].axis('off')
axs[2].set_title('rSVD')

plt.show()

在这里插入图片描述

参考文献

  • http://databookuw.com/
  • 《Data-Driven Science and Engineering —— Machine Learning, Dynamical Systems, and Control》

相关文章:

  • 绘制 Logistic 映射分叉图
  • 利用SQL Server 2000 技能来学习 DB2 V8
  • Debian 配置Bind9 DNS服务器
  • 动态模式分解(DMD)
  • 使用 Unbound 创建DNS服务器
  • 最优奇异值硬阈值 SVHD
  • FTP服务器关于断点续传权限的防范问题
  • HAMILTONIAN SYSTEMS AND TRANSFORMATIONS IN HILBERT SPACE (KOOPMAN, 1931)
  • 使用Bind配置DNS Load Balancing
  • Koopman 算子理论参考文献
  • 计算一阶导数的四阶中心差分格式
  • Hankel alternative view of Koopman (HAVOK) analysis
  • SharePoint列表导入/导出命令
  • 奇怪吸引子图鉴
  • 百度网盘提速
  • 【5+】跨webview多页面 触发事件(二)
  • chrome扩展demo1-小时钟
  • const let
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JavaScript函数式编程(一)
  • JS专题之继承
  • Kibana配置logstash,报表一体化
  • passportjs 源码分析
  • python学习笔记 - ThreadLocal
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • 使用API自动生成工具优化前端工作流
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • Java数据解析之JSON
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​io --- 处理流的核心工具​
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • #{}和${}的区别是什么 -- java面试
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (26)4.7 字符函数和字符串函数
  • (C语言)球球大作战
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (黑马C++)L06 重载与继承
  • (算法)N皇后问题
  • (算法)求1到1亿间的质数或素数
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一)认识微服务
  • (转)项目管理杂谈-我所期望的新人
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .Net core 6.0 升8.0
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET成年了,然后呢?
  • .NET中使用Protobuffer 实现序列化和反序列化
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [17]JAVAEE-HTTP协议
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [BetterExplained]书写是为了更好的思考(转载)
  • [Big Data - Kafka] kafka学习笔记:知识点整理