Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >小孩都看得懂的 SVD 2

小孩都看得懂的 SVD 2

作者头像
用户5753894
发布于 2021-04-21 07:50:11
发布于 2021-04-21 07:50:11
55700
代码可运行
举报
文章被收录于专栏:王的机器王的机器
运行总次数:0
代码可运行
  1. 小孩都看得懂的神经网络
  2. 小孩都看得懂的推荐系统
  3. 小孩都看得懂的逐步提升
  4. 小孩都看得懂的聚类
  5. 小孩都看得懂的主成分分析
  6. 小孩都看得懂的循环神经网络
  7. 小孩都看得懂的 Embedding
  8. 小孩都看得懂的熵、交叉熵和 KL 散度
  9. 小孩都看得懂的 p-value
  10. 小孩都看得懂的假设检验
  11. 小孩都看得懂的基尼不纯度
  12. 小孩都看得懂的 ROC
  13. 小孩都看得懂的 SVD
  14. 小孩都看得懂的 SVD 2

0

回顾

奇异值分解 (singular value decomposition, SVD) 就是一个“旋转-拉缩-旋转”的过程。用下图来进一步说明:

用矩阵 A 一步做线性转换

等价于

用三个矩阵先旋转 (VT),再拉缩 (),最后旋转 (U),那么

A = U∑VT

本贴主要讲 SVD 在图片压缩上的应用。

1

公式可视化

将上面数学公式做可视化,旋转矩阵 U 用列向量表示,拉缩矩阵 ∑ 是只有对角线上有值,旋转矩阵 VT 用行向量表示,如下图所示:

两点需要留意:

  1. A 不一定是方阵(以上图举例, A 是 4×6,U 是 4×4, 是 4×6,VT 是 6×6,U∑VT 是 4×6)
  2. 中对角线上的值是从大到小排列的 σ1 ≥ σ2 ≥ σ3 ≥ σ4

进一步将 U∑VT 矩阵相乘分解成

  • 的对角线上第 i 个元素
  • U 的第 i 列
  • VT 的第 i 行

相乘来累加,可以得到矩阵 A。如下图展示:

上述分解可不仅仅在于将公式以另一种方式等价写出来,其意义是,如果某个“拉缩” σ 很小,比如 σ4,那么舍弃 σ4u4v4,也能近似还原 A

在实际图片压缩问题中,图片可用像素矩阵 A 表示,做完 SVD 后发现如果很多“拉缩” σ 很小,全部舍弃不久减少很多数据存储了吗?还能近似还原 A 不就对图片成功做了压缩处理的么?

下面来几个 SVD 实操,先来看最简单的例子,仅仅为了便于明晰 SVD 的原理;了解完全原理后,再用一张真实照片来做图片压缩。

首先引入必要的 Python 的工具包。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
from numpy.linalg import svd
import matplotlib as mpl
import matplotlib.pyplot as plt

2

简单例子

下面用于可视化 SVD 的代码在本帖会重复使用,对 Python 有兴趣的小朋友可以看看。代码主要做的事情就三件:

  1. 在图片像素矩阵上做 SVD
  2. 可视化出所有 σiuivi 的图
  3. 可视化出所有 σiuivi 的重叠图(比如第一张是 σ1u1v1,第二张是 σ1u1v1 + σ2u2v2 ...)

例一:心形图片

用 NumPy 数组表示图片,0 代表白色,1 代表黑色。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
D = np.array([[0,1,1,0,1,1,0],
              [1,1,1,1,1,1,1],
              [1,1,1,1,1,1,1],
              [0,1,1,1,1,1,0],
              [0,0,1,1,1,0,0],
              [0,0,0,1,0,0,0],
             ])
U,S,V = plot_svd(D)

图片像素矩阵 D 做完 SVD 后得到的 对角线有 6 个值,最后两个是 0。

不难发现,从第四幅重叠图起就已经完美的还原原图了。

此外也可将 U, S, V 打印出来检查它们的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(np.round(U,2))
print()
sigma = np.diag(S)
print(np.round(sigma,2))
print()
print(np.round(V,2))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[[-0.36 -0.   -0.73 -0.05  0.56  0.13]
 [-0.54  0.35  0.27 -0.08 -0.16  0.69]
 [-0.54  0.35  0.27 -0.08  0.16 -0.69]
 [-0.45 -0.35 -0.27  0.52 -0.56 -0.13]
 [-0.28 -0.71  0.18 -0.62 -0.   -0.  ]
 [-0.08 -0.35  0.46  0.57  0.56  0.13]]

[[4.74 0.   0.   0.   0.   0.  ]
 [0.   1.41 0.   0.   0.   0.  ]
 [0.   0.   1.41 0.   0.   0.  ]
 [0.   0.   0.   0.73 0.   0.  ]
 [0.   0.   0.   0.   0.   0.  ]
 [0.   0.   0.   0.   0.   0.  ]]

[[-0.23 -0.4  -0.46 -0.4  -0.46 -0.4  -0.23]
 [ 0.5   0.25 -0.25 -0.5  -0.25  0.25  0.5 ]
 [ 0.39 -0.32 -0.19  0.65 -0.19 -0.32  0.39]
 [-0.22  0.42 -0.44  0.42 -0.44  0.42 -0.22]
 [ 0.56 -0.43  0.03  0.   -0.03  0.43 -0.56]
 [-0.42 -0.55 -0.16  0.    0.16  0.55  0.42]
 [-0.12 -0.11  0.69 -0.   -0.69  0.11  0.12]]

例二:小心形图片

换一张小一点的心形图。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
D = np.array([[0,0,0,0,0,0,0,0,0],
              [0,0,1,1,0,1,1,0,0],
              [0,1,1,1,1,1,1,1,0],
              [0,1,1,1,1,1,1,1,0],
              [0,0,1,1,1,1,1,0,0],
              [0,0,0,1,1,1,0,0,0],
              [0,0,0,0,1,0,0,0,0],
              [0,0,0,0,0,0,0,0,0]
             ])
U,S,V = plot_svd(D)

最后 4 个 σ 都为零,从第四幅重叠图起也已经完美的还原原图了。

例三:十字形图片

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
D = np.array([[0,0,1,1,0,0],
              [0,1,1,1,1,0],
              [1,1,1,1,1,1],
              [1,1,1,1,1,1],
              [0,1,1,1,1,0],
              [0,0,1,1,0,0],
             ])
U,S,V = plot_svd(D)

最后 3 个 σ 都为零,从第三幅重叠图起也已经完美的还原原图了。

弄清楚以上 SVD 分解原理后,最后看一个实际例子。先引入必要的 Python 工具包。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
from matplotlib.image import imread
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = False

3

真实例子

设置正确路径,从文件夹中用 imread() 函数读取图片并转成像素,该图片是彩照,有 RGB 三个色道。为了仅说明压缩过程,用黑白图片即可,因此将彩照转成黑白照, np.mean(A, -1),在最后一维,即在色道维度上求均值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
file = os.getcwd() + '\\niannian.jpg'
A = imread(file)
X = np.mean(A, -1); # Convert RGB to grayscale

plt.rcParams['figure.figsize'] = [16, 8]
img = plt.imshow(X)
img.set_cmap('gray')
plt.axis('off')
plt.show()

该图片矩阵尺寸很大,我们就看保留前 100,200 和 500 个 σiuivi 的图片长什么样,代码如下:

将结果整理成一排好比较,我们发现用前 500 个特征值已经能基本还原原图了,用 100 个特征值效果也不差,而且仅仅只用了原图 5.79% 的存储量,大大压缩了图片。

打印出特征个数和累计能量值发现,前 100 个特征已经还原 70% 原图,前 500 个特征已经还原 90% 原图,后面 2500 个特征只能贡献 10% 的还原度。这样根据个人的“还原原图”的需求,选取一个合适特征数量,舍弃后面的特征即可。

小朋友们,现在你们可以在自己电脑里找照片,将下图高亮处改成“照片名称和格式”就可以自己玩玩用 SVD 压缩图片咯。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 王的机器 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
小孩都看得懂的 GAN
本文是「小孩都看得懂」系列的第十八篇,本系列的特点是内容不长,碎片时间完全可以看完,但我背后付出的心血却不少。喜欢就好!
用户5753894
2021/11/19
5550
小孩都看得懂的 HMM
本文是「小孩都看得懂」系列的第十九篇,本系列的特点是内容不长,碎片时间完全可以看完,但我背后付出的心血却不少。喜欢就好!
用户5753894
2021/11/19
7450
小孩都看得懂的 SVD
奇异值分解 (singular value decomposition, SVD) 就是一个“旋转-拉缩-旋转”的过程。
用户5753894
2021/04/21
7370
小孩都看得懂的 SVD
小孩都看得懂的主成分分析
本文是「小孩都看得懂」系列的第五篇,本系列的特点是极少公式,没有代码,只有图画,只有故事。内容不长,碎片时间完全可以看完,但我背后付出的心血却不少。喜欢就好!
用户5753894
2019/09/25
7730
小孩都看得懂的主成分分析
NumPy之:多维数组中的线性代数
多维数据的线性代数通常被用在图像处理的图形变换中,本文将会使用一个图像的例子进行说明。
程序那些事
2021/07/29
2.1K0
奇异值分解(Singular Value Decomposition,SVD)
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=Im​VVT=In​Σ=diag(σ1​,σ2​,...,σp​)σ1​≥σ2​≥...≥σp​≥0p=min(m,n)
Michael阿明
2020/07/13
1.5K0
基于奇异值分解(SVD)的图片压缩实践
数字图片在计算机中是以矩阵形式存储的。所以可以通过矩阵理论和矩阵算法对数字图像进行分析和处理。本文通过对图片进行SVD压缩,对不同的参数下的压缩效果进行对比。
Michael阿明
2020/07/13
2.4K0
30分钟学会SVD矩阵分解
SVD(Singular Value Decomposition)奇异值分解分解是机器学习中最重要的矩阵分解方法。
lyhue1991
2020/07/20
2.2K0
30分钟学会SVD矩阵分解
小孩都看得懂的推荐系统
我还是推荐系统小白,因此对此课题理解相当浅显,但一定很好懂。这才是学一样新东西的正确开始方式。
用户5753894
2019/08/20
6520
小孩都看得懂的推荐系统
矩阵分解: SVD-PCA
矩阵分解(Decomposition Factorization)是将矩阵拆解为若干个矩阵的相乘的过程。在数值分析中,常常被用来实现一些矩阵运算的快速算法,在机器学习领域有非常重要的作用。有的推荐系统采用SVD算法来实现整套系统中的矩阵分解过程。
用户3578099
2023/09/21
4530
深度学习中的数学(二)——线性代数
线性可分的定义:线性可分就是说可以用一个线性函数把两类样本分开,比如二维空间中的直线、三维空间中的平面以及高维空间中的超平面。(所谓可分指可以没有误差地分开;线性不可分指有部分样本用线性分类面划分时会产生分类误差的情况。)
润森
2022/09/22
9450
深度学习中的数学(二)——线性代数
数据科学中必须知道的5个关于奇异值分解(SVD)的应用
这听起来是不是很熟悉?我经常听到我大学的熟人抱怨他们花了很多时间的代数方程在现实世界中基本没用。
磐创AI
2019/08/29
6.3K0
数据科学中必须知道的5个关于奇异值分解(SVD)的应用
简单易学的机器学习算法——SVD奇异值分解
    特征值分解与SVD奇异值分解的目的都是提取一个矩阵最重要的特征。然而,特征值分解只适用于方阵,而SVD奇异值分解适用于任意的矩阵,不一定是方阵。
felixzhao
2019/02/13
9430
SVD在推荐系统中的应用
参考自:http://www.igvita.com/2007/01/15/svd-recommendation-system-in-ruby/
AIHGF
2019/02/18
1.6K0
SVD在推荐系统中的应用
【生物信息学】奇异值分解(SVD)
SVD分解核心思想是通过降低矩阵的秩来提取出最重要的信息,实现数据的降维和去噪。
Qomolangma
2024/07/30
2920
【生物信息学】奇异值分解(SVD)
机器学习中的数学(6)-强大的矩阵奇异值分解(SVD)及其应用
上一次写了关于PCA与LDA的文章,PCA的实现一般有两种,一种是用特征值分解去实现的,一种是用奇异值分解去实现的。在上篇文章中便是基于特征值分解的一种解释。 特征值和奇异值在大部分人的印象中,往往是停留在纯粹的数学计算中。而且线性代数或者矩阵论里面,也很少讲任何跟特征值与奇异值有关的应用背景。奇异值分解是一个有着很明显的物理意义的一种方法,它可以将一个比较复杂的矩阵用更小更简单的几个子矩阵的相乘来表示,这些小矩阵描述的是矩阵的重要的特性。就像是描述一个人一样,给别人描述说这个人长得浓眉大眼,方脸,络腮胡,
机器学习AI算法工程
2018/03/12
1.4K0
机器学习中的数学(6)-强大的矩阵奇异值分解(SVD)及其应用
数据分析 ——— numpy基础(二)
接上篇文章,继续更新一些numpy下的一些常用函数的使用, 在这里多为矩阵的操作,创建矩阵,单位矩阵,求解逆矩阵等并进行one-hot编码,线性矩阵的特征向量,特征值,奇异值,行列式的计算。
andrew_a
2019/07/30
8740
关于SVD的应用详解
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
张凝可
2019/08/21
1.2K0
奇异值分解(SVD)
奇异值分解(Singular Value Decomposition,简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。是很多机器学习算法的基石。
AngelNH
2020/07/15
9560
奇异值分解(SVD)
SVD分解及其应用
根据文章内容总结的摘要
用户1147754
2018/01/02
2.7K0
SVD分解及其应用
相关推荐
小孩都看得懂的 GAN
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验