奇异值分解(Singular Value Decomposition,SVD)

文章目录

    • 1. 奇异值分解的定义与性质
      • 1.1 定义
      • 1.2 两种形式
        • 1.2.1 紧奇异值分解
        • 1.2.2 截断奇异值分解
      • 1.3 几何解释
      • 1.4 主要性质
    • 2. 奇异值分解与矩阵近似
      • 2.1 弗罗贝尼乌斯范数
      • 2.2 矩阵的最优近似
      • 2.3 矩阵的外积展开式
    • 3. 奇异值分解Python计算
    • 4. SVD应用

  • 一种矩阵因子分解方法
  • 矩阵的奇异值分解一定存在,但不唯一
  • 奇异值分解可以看作是矩阵数据压缩的一种方法,即用因子分解的方式近似地表示原始矩阵,这种近似是在平方损失意义下的最优近似

1. 奇异值分解的定义与性质

1.1 定义

Am×n=UΣVTUUT=ImVVT=InΣ=diag(σ1,σ2,...,σp)σ1≥σ2≥...≥σp≥0p=min⁡(m,n)A_{m \times n} = U \Sigma V^T\\ UU^T=I_m\\ VV^T=I_n\\ \Sigma=diag(\sigma_1,\sigma_2,...,\sigma_p) \\ \sigma_1\ge \sigma_2 \ge...\ge\sigma_p \ge0\\ p=\min(m,n)Am×n=UΣVTUUT=ImVVT=InΣ=diag(σ1,σ2,...,σp)σ1σ2...σp0p=min(m,n)

  • UΣVTU \Sigma V^TUΣVT 称为矩阵 AAA 的奇异值分解(SVD),UUUmmm 阶正交矩阵, VVVnnn 阶正交矩阵,Σ\SigmaΣm×nm \times nm×n 的对角矩阵
  • σi\sigma_iσi 称为矩阵 AAA 的奇异值
  • UUU 的列向量,左奇异向量
  • VVV 的列向量,右奇异向量

1.2 两种形式

1.2.1 紧奇异值分解

上面的SVD称为:完全SVD
Am×n=UrΣrVrTA_{m \times n} = U_r \Sigma_r V_r^TAm×n=UrΣrVrT
紧奇异值分解,仅由前 rrr 列得到,对角矩阵 Σr\Sigma_rΣr 的秩与原始矩阵 AAA 的秩相等

1.2.2 截断奇异值分解

只取最大的 k 个奇异值 (k<r,r为矩阵的秩)(k < r, r 为矩阵的秩)(k<r,r) 对应的部分,就得到矩阵的截断奇异值分解

  • 实际应用中提到的,经常指的 截断SVD

Am×n≈UkΣkVkT,0<k<Rank(A)A_{m \times n} \approx U_k \Sigma_k V_k^T,\quad 0<k<Rank(A)Am×nUkΣkVkT,0<k<Rank(A)

  • 在实际应用中,常常需要对矩阵的数据进行压缩,将其近似表示,奇异值分解提供了一种方法
  • 奇异值分解是在平方损失(弗罗贝尼乌斯范数)意义下对矩阵的最优近似
  • 奇异值分解—>无损压缩
  • 截断奇异值分解—>有损压缩

1.3 几何解释

矩阵的SVD也可以看作是将其 对应的线性变换 分解为 旋转变换、缩放变换及旋转变换的组合。
这个变换的组合一定存在。
在这里插入图片描述

1.4 主要性质

  • (1) 由 A=UΣVTA=U\Sigma V^TA=UΣVT

ATA=(UΣVT)T(UΣVT)=V(ΣTΣ)VTAAT=(UΣVT)(UΣVT)T=U(ΣΣT)UTA^TA=(U\Sigma V^T)^T(U\Sigma V^T)=V(\Sigma^T\Sigma)V^T\\ AA^T=(U\Sigma V^T)(U\Sigma V^T)^T=U(\Sigma\Sigma^T)U^TATA=(UΣVT)T(UΣVT)=V(ΣTΣ)VTAAT=(UΣVT)(UΣVT)T=U(ΣΣT)UT
对称矩阵 ATAA^TAATAAATAA^TAAT 的特征分解 可由矩阵 AAA 的奇异值分解矩阵表示

  • (2)
    AV=UΣ⇒Avj=σjuj,j=1,2,...,nATU=VΣT⇒ATuj=σjvj,j=1,2,...,n;ATuj=0,j=n+1,n+2,...,mAV=U\Sigma \Rightarrow Av_j=\sigma_ju_j,j=1,2,...,n\\ A^TU=V\Sigma^T \Rightarrow A^Tu_j=\sigma_jv_j,j=1,2,...,n;A^Tu_j=0,j=n+1,n+2,...,mAV=UΣAvj=σjuj,j=1,2,...,nATU=VΣTATuj=σjvj,j=1,2,...,n;ATuj=0,j=n+1,n+2,...,m

  • (3) SVD奇异值 σ1,σ1,...,σn\sigma_1,\sigma_1,...,\sigma_nσ1,σ1,...,σn唯一的,但矩阵 U,VU,VU,V 不唯一

  • (4) 矩阵 AAAΣ\SigmaΣ 的秩相等,等于正奇异值 σi\sigma_iσi 的个数 rrr

  • (5) 矩阵 AAArrr 个右奇异向量 v1,v2,...,vrv_1,v_2,...,v_rv1,v2,...,vr 构成 ATA^TAT 的值域 的一组标准正交基;
    矩阵 AAAn−rn-rnr 个右奇异向量 vr+1,vr+2,...,vnv_r+1,v_r+2,...,v_nvr+1,vr+2,...,vn 构成 AAA 的零空间 的一组标准正交基;
    矩阵 AAArrr 个左奇异向量 u1,u2,...,uru_1,u_2,...,u_ru1,u2,...,ur 构成 AAA 的值域 的一组标准正交基;
    矩阵 AAAm−rm-rmr 个左奇异向量 ur+1,ur+2,...,umu_r+1,u_r+2,...,u_mur+1,ur+2,...,um 构成 ATA^TAT 的零空间 的一组标准正交基

2. 奇异值分解与矩阵近似

2.1 弗罗贝尼乌斯范数

奇异值分解也是一种矩阵近似的方法,这个近似是在弗罗贝尼乌斯范数(Frobenius norm)意义下的近似
矩阵的弗罗贝尼乌斯范数是 向量的L2范数的直接推广,对应着机器学习中的平方损失函数

设矩阵 A=[aij]m×nA=[a_{ij}]_{m \times n}A=[aij]m×n, 其弗罗贝尼乌斯范数为:∣∣A∣∣F=(∑i=1m∑j=1n(aij)2)1/2||A||_F = \bigg( \sum\limits_{i=1}^m \sum\limits_{j=1}^n(a_{ij})^2\bigg)^{1/2}AF=(i=1mj=1n(aij)2)1/2

假设 AAA 的奇异值分解为 A=UΣVTA=U\Sigma V^TA=UΣVT ,其中对角矩阵 Σ=diag(σ1,σ2,...,σp)\Sigma=diag(\sigma_1,\sigma_2,...,\sigma_p)Σ=diag(σ1,σ2,...,σp),则 ∣∣A∣∣F=(σ12+σ22+...+σn2)1/2||A||_F = \bigg(\sigma_1^2+\sigma_2^2+...+\sigma_n^2\bigg)^{1/2}AF=(σ12+σ22+...+σn2)1/2

2.2 矩阵的最优近似

奇异值分解 是在平方损失(弗罗贝尼乌斯范数)意义下对矩阵的最优近似,即数据压缩

  • 奇异值分解:是在弗罗贝尼乌斯范数意义下的无损压缩
  • 截断奇异值分解:是有损压缩。截断奇异值分解得到的矩阵的秩为k,通常远小于原始矩阵的秩r,所以是由低秩矩阵实现了对原始矩阵的压缩

2.3 矩阵的外积展开式

矩阵 AAA 的奇异值分解 UΣVTU\Sigma V^TUΣVT 也可以由外积形式表示

  • AAA 的奇异值分解看成矩阵 UΣU\SigmaUΣVTV^TVT 的乘积,将 UΣU\SigmaUΣ 按列向量分块,将 VTV^TVT 按行向量分块,即得
    在这里插入图片描述
    在这里插入图片描述

3. 奇异值分解Python计算

import numpy as np
a = np.random.randint(-10,10,(4, 3)).astype(float)
print(a)
print("-----------------")
u, sigma, vT = np.linalg.svd(a)
print(u)
print("-----------------")
print(sigma)
print("-----------------")
print(vT)
print("-----------------")
# 将sigma 转成矩阵
SigmaMat = np.zeros((4,3))
SigmaMat[:3, :3] = np.diag(sigma)
print(SigmaMat)
print("------验证-------")
a_ = np.dot(u, np.dot(SigmaMat, vT))
print(a_)

结果:

[[-6.  8.  9.][ 6.  8. -8.][ 6. -1.  2.][ 6.  9. -9.]]
-----------------
[[-0.30430452  0.93673281  0.17295875 -0.00395842][ 0.64134399  0.19762952  0.04109474 -0.74022408][ 0.06410812 -0.16033168  0.98267774  0.0672931 ][ 0.70140345  0.24034966 -0.05235412  0.66897256]]
-----------------
[19.56867211 12.83046891  6.0370638 ]
-----------------
[[ 0.52466311  0.45709993 -0.71818401][-0.30821258  0.88838353  0.34026417][ 0.79355758  0.04282928  0.60698602]]
-----------------
[[19.56867211  0.          0.        ][ 0.         12.83046891  0.        ][ 0.          0.          6.0370638 ][ 0.          0.          0.        ]]
------验证-------
[[-6.  8.  9.][ 6.  8. -8.][ 6. -1.  2.][ 6.  9. -9.]]

4. SVD应用

请参考:基于奇异值分解(SVD)的图片压缩实践

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

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

相关文章

项目经理有必要学python吗_项目经理到底要不要懂技术

关于这个问题&#xff0c;我想开门见山地说一句&#xff0c;需要&#xff0c;而且非常需要。当然有同学就会说了&#xff0c;项目经理懂技术会被技术所束缚&#xff0c;无法跳出技术角度来看待项目整体。还有同学会说&#xff0c;现在是团队配合时代&#xff0c;各领域专精&…

贝叶斯算法

1. 贝叶斯由来 贝叶斯为了解决“逆概”问题提出的 2. 贝叶斯要解决的问题 正向概率 袋子里装着N个黑球和M个白球&#xff0c;伸手取摸球&#xff0c;摸到黑球和白球的概率有多大 逆向概率 袋子里前提不知道有黑白球的比例&#xff0c;而是闭着眼睛摸球统计后推测黑球和白球的…

LeetCode 374. 猜数字大小(二分查找)

1. 题目 我们正在玩一个猜数字游戏。 游戏规则如下&#xff1a; 我从 1 到 n 选择一个数字。你需要猜我选择了哪个数字。每次你猜错了&#xff0c;我会告诉你这个数字是大了还是小了。 你调用一个预先定义好的接口 guess(int num)&#xff0c;它会返回 3 个可能的结果&#…

机器人编程与python语言的区别_一分钟看懂“机器人编程”和“少儿编程”的区别!...

随着编程学习全球化的趋势&#xff0c;国内编程学习热潮日盛&#xff0c;越来越多的家长开始让孩子接触学习编程。然而在挑选学习课程的过程中&#xff0c;机器人编程和少儿编程是最让家长头疼的问题之一。因为两者的名称都有“编程”二字&#xff0c;这就让很多家长产生一个错…

让窗体接受拖放, 并获取拖过来的文件信息 - 回复 海浪问 的问题

问题来源: http://www.cnblogs.com/del/archive/2009/01/20/1353117.html#1435746原理分析:这需要用到 ShellAPI 单元的两个函数: DragAcceptFiles、DragQueryFile;用 DragAcceptFiles(窗口句柄, True); 以让窗口能够接受拖放;然后就等待 WM_DROPFILES 消息, 并用 DragQueryFil…

LeetCode之最大回文串--动态规划

1. 题目 给定一个字符串 s&#xff0c;找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1&#xff1a;输入: "babad"输出: "bab" 注意: "aba" 也是一个有效答案。 示例 2&#xff1a;输入: "cbbd"输出: "bb&q…

sort函数_MATLAB--数字图像处理 sort()函数

sort()用处对一维或二维矩阵进行排序用法sort(A)&#xff1a;对一维或二维矩阵进行升序排序&#xff0c;并返回排序后的矩阵&#xff1b;当A为二维矩阵时&#xff0c;对矩阵的每一列分别进行升序排序(列优先)。sort(A,dim)&#xff1a;对矩阵按指定的方向进行升序排序&#xff…

LeetCode 1248. 统计「优美子数组」(要复习)

文章目录1. 题目2. 解题2.1 记录奇数出现的pos2.2 前缀和1. 题目 给你一个整数数组 nums 和一个整数 k。 如果某个 连续 子数组中恰好有 k 个奇数数字&#xff0c;我们就认为这个子数组是「优美子数组」。 请返回这个数组中「优美子数组」的数目。 示例 1&#xff1a; 输入…

LeetCode 560. 和为K的子数组(前缀和差分)

1. 题目 给定一个整数数组和一个整数 k&#xff0c;你需要找到该数组中和为 k 的连续的子数组的个数。 示例 1 : 输入:nums [1,1,1], k 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。 说明 : 数组的长度为 [1, 20,000]。 数组中元素的范围是 [-1000, 1000] &#xff0c;且…

2月4日 星期三

昨天几点睡掉的? 估计猫是不会睡太早了 以后拍照不用担心猫牙了 想怎么笑就怎么笑 是不是 多给家里传传吧 估计很多人都想看到小猫呢 爸爸今天要回本溪了 下午2点车 我去送他 亲亲 转载于:https://www.cnblogs.com/loverain/archive/2009/02/04/1383549.html

LeetCode之最小路径和

1. 题目 给定一个包含非负整数的 m x n 网格&#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例: 输入: [[1,3,1],[1,5,1],[4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和…

python ppt自动生成_如何自动化生成PPT缩略图?

搜到的代码,可能得自己改一下. 导出当前文件夹下所有 PowerPoint 演示文稿的第一张幻灯片 并以图形文件格式保存在当前文件夹下 变量声明和初始化Dim wShell, pptApp, fso, folder, file, slide, outFileSet wShell WScript.CreateObject("WScript.Shell") 获取当前…

LeetCode 862. 和至少为 K 的最短子数组(前缀和+deque单调栈)

1. 题目 返回 A 的最短的非空连续子数组的长度&#xff0c;该子数组的和至少为 K 。 如果没有和至少为 K 的非空子数组&#xff0c;返回 -1 。 示例 1&#xff1a; 输入&#xff1a;A [1], K 1 输出&#xff1a;1示例 2&#xff1a; 输入&#xff1a;A [1,2], K 4 输出&…

LeetCode之简单回文数

1. 题目 判断一个整数是否是回文数。回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。示例 1: 输入: 121 输出: true示例 2: 输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是…

python爬取全国真实地址_Python3爬虫全国地址信息

PHP方式写的一团糟所以就用python3重写了一遍&#xff0c;所以因为第二次写了&#xff0c;思路也更清晰了些。提醒&#xff1a;可能会有502的错误&#xff0c;所以做了异常以及数据库事务处理&#xff0c;暂时没有想到更好的优化方法&#xff0c;所以就先这样吧。待更懂python再…

Workflow WF Reference Links for 2009-02-13

Workflow Reference Links: 1. XPDL - The Silent Workhorse of BPM 我想如果要大致了解一下BPM的主要协议和规范&#xff0c;以及它们的关系&#xff0c;这是一篇很好的文章。在文章的后半部分&#xff0c;作者为XPDL进行了沉冤昭雪的工作。 2. Workflow Scalability a…

LeetCode 383. 赎金信

1. 题目 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串&#xff0c;判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。 如果可以构成&#xff0c;返回 true &#xff1b;否则返回 false。 (题目说明&#xff1a;为了不暴露赎金信字迹&a…

LeetCode之最大正方形

1. 题目 在一个由 0 和 1 组成的二维矩阵内&#xff0c;找到只包含 1 的最大正方形&#xff0c;并返回其面积。示例:输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0输出: 42. 代码 函数 vector<vector> dp(m1, vector(n1, 0)); 定义二维vector以及其初始化&#xff…

WINCE应用的UI实现方案

一、MFC的硬伤 在接手现在这个项目之前&#xff0c;我对WINDOWS平台上的UI开发还是个白痴&#xff0c;除了MFC&#xff0c;就只知道GDI了。而且居然大言不惭地说用MFC只能画画灰色的对话框和按钮。但不论如何&#xff0c;在嵌入式这种对成本极度敏感的项目上&#xff0c;我是不…

python创建socket对象_python---一个简单的socket

server端:1 创建socket对象。调用socket构造函数。如&#xff1a;socket socket.socket( family, type )#family参数代表地址家族&#xff0c;可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址&#xff0c;AF_UNIX家族用于同一台机器上的进程间通信。#type参数代表套接字类…