SciTech-EECS-BigDataAIML:

SVD(奇异值分解)

Singular Value(奇异值) 就是 Eigenvalue 的平方根.

SVD 线性代数皇冠上的明珠

熟知SVD, 可以使我们更深刻地理解"Matrix(矩阵)"的"代数结构"和"几何意义".

SVD(奇异值分解)不仅在科学、工程、机器学习 和 数据分析 等领域有非常重要的应用;

而且他把"Linear Algebra(线性代数)"的许多"核心概念"有机的联系在了一起. 例如:

  • Rank: 秩
  • Range: 像空间/列空间/范围
  • Null Space: 零空间/核空间
  • Eigenvalue: 特征值
  • Eigenvector: 特征向量
  • Transpose: 转置
  • Inverse: 逆矩阵
  • Symmetric Matrix: 对称矩阵
  • Orthogonal Matrix: 正交矩阵
  • PSD Matrix(Positive Semi Definite Matrix): 半正定矩阵

矩阵分解(矩阵因子分解)

矩阵分解(矩阵因子分解) 的一种方法, 即:

  • 初始矩阵 表示成 “分解矩阵(两个或多个)”的乘积
  • 每个“分解矩阵”都是有 新结构 或 特殊性质的。类似于代数的因子分解

Eigenvalue Decomposition(特征值分解)

特征值分解 是 矩阵分解(矩阵因子分解) 的一种。

特征值分解的实质,是求解给定矩阵的 特征值和 特征向盘,提取出矩阵最重要的特征,

其中特征值分解公式 , 其中Q为特征向量矩阵, 是特征值对角阵。

  • Eigenvalue Decomposition(特征值分解) 只适用于 的方阵 特征提取

SVD(奇异值分解)

https://zhuanlan.zhihu.com/p/480389473

实际应用的数据对应的大部分矩阵可能不是方阵(如稀疏的有很多0), 就要提取主要特征;

  • SVD(奇异值分解) 是将 任意较复杂矩阵 用 维度数更少, 更简单的“分解矩阵”的矩乘表示 ;

    例如可用 3个分解矩阵 来描述 “变换矩阵”(高维度的目标矩阵) 的重要特性。
  • 矩阵\(A_{m \times n}\)不是方阵, 我们不能求其特征值;
  • 但对于矩阵 \(A^T A\) 和 \(A A^T\), 分别为\(n阶\)和\(m阶\)对称方阵:

    它们的秩等同: \(R(A^T A) = R(A A^T )=R(A)\), 而且它们的 非零特征值的集合 也等同,
  • 对称矩阵特征值矩阵正交矩阵,特征值 都为 正实数; 因此可求出奇异值(特征值的平方根).





一个Matrix(矩阵)代表一个"线性变换"

  • 一个矩阵代表一个“线性变换”

  • 矩阵式线性变换:

    • 对一个vector(向量)/natrix(矩阵)“左乘”变换矩阵 就得到变换后的结果vector(向量)/natrix(矩阵).

    • 当“变换矩阵”是“方阵(行数=列数)”时, 变换不改变"作用向量"的shape(维度)

      \[\large A_{m \times m} \times X_{m \times n} = Y_{m \times n}
      \]
  • 变换的“规范化”::

    将“\(\large 变换矩阵A\)”规范化的分解成 三个 特殊类型的 分解变换矩阵:

    \[\large A_{m \times m} = U \sum V^{T}
    \]
  • 变换的“维度变化”

    变换后的“结果矩阵”的“Rank(秩)”可能:

    • 同维: 等于 原vector(向量)/natrix(矩阵)的“Rank(秩)”:
    • 降维: 小于 原vector(向量)/natrix(矩阵)的“Rank(秩)”,将(\(\large Rank(X)-Rank(Y)\))个维度变换为"自由维度";

      这种降维变换,可以只保留“Top K 特征值”对应Top K的“特征向量”;

      其实可看做: 其它(\(\large Rank(X)-Rank(Y)\))个“自由维度”的特征值为“0”(自由维度);
  • 对 "源矩阵"(\(\large X\)) 作"(\(\large A\))变换 得到 "终矩阵""(\(\large Y\)):

    每一个"向量/矩阵" 其实应当表示为“其本身”与“坐标基”的矩阵乘:

    (\(\large X = X \times I\)

    分解有两部分的变换:

    • 对 "空间单位(模长为1)坐标基"的变换, 旧"坐标基"为\(\large I\),新"坐标基"的"每一维度"的模长为1;
    • 对 "向量新坐标值" 的变换: "源向量/矩阵" 投射到 新"坐标基"的"每一维度"上的"新坐标值(方向+模长)"的变换

SVD 应用实例 + 代码:

很多其它的机器学习算法也会用到SVD。使用线性代数时, 大多都要使用 SVD。SVD 不仅用在 PCA 、特征压缩(或数据降维)、图像压缩、数字水印、 推荐系统和文章分类、 LSA (隐性语义分析), 在信号分解/重构/降噪、数据融合、同标识别、目标跟踪、故障检测和神经网络等方面也有很好的应用.

矩阵压缩/降维

# -*- coding: utf-8 -*-
import numpy as np
from numpy import linalg as la
#1. SVD分解
A= [[1,1,3,6,1],[5,1,8,4,2],[7,9,2,1,2]]
A=np.array(A)
U,s,VT = la.svd(A)
# 为节省空间,svd输出s只有奇异值的向量
print('奇异值:',s)
# 根据奇异值向量s,生成奇异值矩阵
Sigma = np.zeros(np.shape(A))
Sigma[:len(s),:len(s)] = np.diag(s) print("左奇异值矩阵:\n",U)
print('奇异值矩阵:\n',Sigma)
print('右奇异矩阵的转置:\n',VT) #2.SVD重构
B = U.dot(Sigma.dot(VT))
print('重构后的矩阵B:\n', B) print('原矩阵与重构矩阵是否相同?',np.allclose(A,B)) ## 3. SVD矩阵压缩(降维)
for k in range(3,0,-1): # 3,2,1
# U的k列,VT的k行
D = U[:,:k].dot(Sigma[:k,:k].dot(VT[:k,:]))
print('k=',k,"压缩后的矩阵:\n",np.round(D,1)) # round取整数
  • 代码一定要自己跑跑,SVD 得到的特征值的前两项较大,最后一项值较小;
  • 取不同的k值, 分别对应于取 U的前 k列, 变成 k阶方阵,
  • 取 前k行,对比利用 矩阵乘积得到的新矩阵 与原始矩阵 的情况,
  • 对比结果, SVD 后 的 特征值 主要集中在前两个数上,即当 k取2时, 得到的新矩阵较近似; 大多数信息完好的. 因此,保留比较大的奇异值及特征向量,达到用较少数据量 达到较好的矩阵近似效果。

图像的数字化技术与矩阵的奇异值分解

将图形分解成象素的一个矩形的数阵,信息就可以用一个矩阵 $ A_r=(a_{ij})^{m \times n}$ 存储。

数字化图形存储量的压缩方法, 可用 矩阵的奇异值分解 和 矩阵范数 的近似。

对数字图像矩阵\(A_r\) 作 SVD(奇异值分解) , 压缩是取一个$ rank=k (k<r)$的矩阵 \(A_k\) 近似。

奇异值分解的展开形式

\[\large A_r = \sigma_1 u_1 v_{1}^{H} + \sigma_2 u_2 v_{2}^{H} + \cdots + \sigma_n u_n v_{r}^{H}
\]
\[\large A_k = \sigma_1 u_1 v_{1}^{H} + \sigma_2 u_2 v_{2}^{H} + \cdots + \sigma_n u_n v_{k}^{H}
\]
  • 存储 \(A_k\) 只要存储\(k\)个奇异值, $ k个m维向量 u_i $ 和$ n维向量v_j \(的所有分量, 共计\)k(m+n+1)$个元素。
  • 如果$ m=n=1000 \(, 存储原矩阵\)A_r$需要存储\(1000 \times 1000\)个pixel。

    矩阵 \(A_k\)取$ k=100 $时, 近似图象已非常清晰, 存储量仅 100(2000+1)=200100个pixel。

    和矩阵 \(A_r\) 比较,存储量减少了80%。

案例2--图像压缩

# -*- coding: utf-8 -*-
from itertools import count
from PIL import Image
import numpy as np def img_compress(img,percent):
U,s,VT=np.linalg.svd(img)
Sigma = np.zeros(np.shape(img))
Sigma[:len(s),:len(s)] = np.diag(s)
# 根据压缩比 取k值 # 方法1 # k是奇异值数值总和的百分比个数,(奇异值权重)
count = (int)(sum(s))*percent
k = -1
curSum = 0
while curSum <= count:
k+=1
curSum += s[k] # 方法2
# k = (int)(percent*len(s)) # k是奇异值个数的百分比个数 # 还原后的数据D
D = U[:,:k].dot(Sigma[:k,:k].dot(VT[:k,:]))
D[D<0] = 0
D[D>255] = 255
return np.rint(D).astype('uint8') # 图像重建
def rebuild_img(filename,percent):
img = Image.open(filename,'r')
a = np.array(img)
R0 = a[:,:,0]
G0 = a[:,:,1]
B0 = a[:,:,2]
R = img_compress(R0,percent)
G = img_compress(G0,percent)
B = img_compress(B0,percent)
re_img = np.stack((R,G,B),2)
# 保存图片
newfile = filename+str(percent*100)+'.jpg'
Image.fromarray(re_img).save(newfile)
img = Image.open(newfile)
img.show() rebuild_img('test.jpg',0.6)

代码一定要动手跑,对比结果

SciTech-EECS-BigDataAIML: SVD(奇异值分解) + Eigenvalue Decomposition(特征值分解)的更多相关文章

  1. 特征值分解,奇异值分解(SVD)

    特征值分解和奇异值分解在机器学习领域都是属于满地可见的方法.两者有着很紧密的关系,我在接下来会谈到,特征值分解和奇异值分解的目的都是一样,就是提取出一个矩阵最重要的特征. 1. 特征值: 如果说一个向 ...

  2. 数学基础系列(六)----特征值分解和奇异值分解(SVD)

    一.介绍 特征值和奇异值在大部分人的印象中,往往是停留在纯粹的数学计算中.而且线性代数或者矩阵论里面,也很少讲任何跟特征值与奇异值有关的应用背景. 奇异值分解是一个有着很明显的物理意义的一种方法,它可 ...

  3. 关于SVD(Singular Value Decomposition)的那些事儿

    SVD简介 SVD不仅是一个数学问题,在机器学习领域,有相当多的应用与奇异值都可以扯上关系,比如做feature reduction的PCA,做数据压缩(以图像压缩为代表)的算法,还有做搜索引擎语义层 ...

  4. SVD singular value decomposition

    SVD singular value decomposition https://en.wikipedia.org/wiki/Singular_value_decomposition 奇异值分解在统计 ...

  5. matlab特征值分解和奇异值分解

    特征值分解 函数 eig 格式 d = eig(A)         %求矩阵A的特征值d,以向量形式存放d. d = eig(A,B)       %A.B为方阵,求广义特征值d,以向量形式存放d. ...

  6. 对SVD奇异值分解的理解

      首先推荐一篇博客,奇异值分解(SVD)原理详解及推导 - CSDN博客,讲解的很清楚.这里我谈谈自己的理解,方便以后回顾.   如果把向量理解为空间中的一个元素,那么矩阵可以理解为两个空间上的映射 ...

  7. 【SVD、特征值分解、PCA关系】

    一.SVD    1.含义: 把矩阵分解为缩放矩阵+旋转矩阵+特征向量矩阵. A矩阵的作用是将一个向量从V这组正交基向量的空间旋转到U这组正交基向量的空间,并对每个方向进行了一定的缩放,缩放因子就是各 ...

  8. 『科学计算_理论』SVD奇异值分解

    转载请声明出处 SVD奇异值分解概述 SVD不仅是一个数学问题,在工程应用中的很多地方都有它的身影,比如前面讲的PCA,掌握了SVD原理后再去看PCA那是相当简单的,在推荐系统方面,SVD更是名声大噪 ...

  9. 讲一下numpy的矩阵特征值分解与奇异值分解

    1.特征值分解 主要还是调包: from numpy.linalg import eig 特征值分解:  A = P*B*PT  当然也可以写成 A = QT*B*Q  其中B为对角元为A的特征值的对 ...

  10. 机器学习降维--SVD奇异值分解

    奇异值分解是有着很明显的物理意义,将一个比较复杂的矩阵用更小更简单的几个子矩阵的相乘来表示,这些小矩阵描述的是矩阵的重要的特性,让机器学会抽取重要的特征,SVD是一个重要的方法. 所以SVD不仅是一个 ...

随机推荐

  1. FastAPI数据库连接池配置与监控

    title: FastAPI数据库连接池配置与监控 date: 2025/04/28 00:13:02 updated: 2025/04/28 00:13:02 author: cmdragon ex ...

  2. 开源的java内网穿透 - 维基代理(wiki-proxy)

    1.简介 维基代理(wiki-proxy).开源的java内网穿透项目. 技术栈:cdkjFramework(维基框架).JPA.Netty 遵循MIT许可,因此您可以对它进行复制.修改.传播并用于任 ...

  3. MySql技术之"虚拟表增加索引"

    一.虚拟表增加索引 创建虚拟表,并且增加SKU索引:INDEX idx_sku (sku) CREATE TEMPORARY TABLE t_sku_analy_temp ( sku VARCHAR( ...

  4. jdbcTemplate之“rowMapper内部类写法”

    jdbcTemplate的rowMapper内部类写法 String sql ="select sku,feature from product"List<Product&g ...

  5. 手把手教你使用C#创建一个WebSearchAgent

    PocketFlowSharp介绍 最近我对PocketFlow比较感兴趣,不仅是因为它是一个极简的LLM框架,更加让我觉得很不错的地方在于作者提供了很多方便学习的例子,就算没有LLM应用开发经验,也 ...

  6. Go语言flag包:命令行解析

    转载:http://c.biancheng.net/view/5573.html 在编写命令行程序(工具.server)时,需要对命令行参数进行解析,各种编程语言一般都会提供解析命令行参数的方法或库, ...

  7. C# 控制台程序验证await立即返回

    class Program{ public static volatile bool flag = true; public static void Main() { Action a = null; ...

  8. Spring Boot MyBatis使用type-aliases-package自定义类别名

    摘要:介绍MyBatis 中 type-aliases-package 属性的作用.在Spring Boot项目中,使用属性type-aliases-package为MyBatis引用的实体类自定义别 ...

  9. 洛谷 P2731 [USACO3.3]骑马修栅栏 Riding the Fences

    题意描述 每个栅栏是一条无向边,找出字典序最小的欧拉路.数据保证至少有一个解. 最多 \(500\) 个点, \(1024\) 条边. 分析 看着如此微小的数据范围,随便瞎搞都行使用矩阵来存储边,同时 ...

  10. IDEA terminal控制台配置git bash及中文乱码问题

    1.修改控制台shell路径:setting -> Tools -> Terminal -> Shell path,修改为git安装路径. 修改完毕,在控制台输入exit断开sess ...