深入理解SVD

一、定义

    任何一个\large m\times n实矩阵 A 均可分解为三个子矩阵的乘积:
                                                                                             \large A=U\Sigma V^T

    其中,\large U 和 \large V 是正交矩阵,\large U是 \large m 阶矩阵,\large V 是 \large n 阶矩阵,\large \Sigma 是 \large m\times n 对角矩阵,对角线上的元素为矩阵 A 的奇异值,任何一个实矩阵的SVD分解必存在,但不唯一。

 

二、紧凑SVD与截断SVD

    设矩阵A的秩为 \large r\large r\leq \min (m,n),则称 U_r\Sigma _rV_r^T 为 A 的紧凑SVD。其中,U_r 表示 U 的前 \large r 列,\Sigma _r 表示 \Sigma 的前 \large r 行和前 \large r 列构成的对角矩阵,V_r 表示 V 的前 \large r 行。

    如果只取最大的 k (k< r)个奇异值对应的部分,就得到矩阵的截断SVD,即 U_k\Sigma _kV_k^T\large U_k 表示 U 的前 \large k 列,\Sigma _k 表示 \Sigma 的前 \large k 行和前 \large k 列构成的对角矩阵,\large V_k 表示 V 的前 \large k 行。

    截断奇异值经常用于数据压缩,特别是对于图片的有损压缩。

    

三、几何解释

    这部分比较有意思,着重说明一下。线性变化

                                                                                           \large x\rightarrow Ax

    相当于将一个 \large n 维空间的向量 \large x 映射到一个 \large m 维空间中(矩阵乘法的公式)。再拆分一下即

                                                                                       \large x\rightarrow U\Sigma V^Tx

    上式相继对 \large x 做了如下变换: 首先,\large x 在正交矩阵 \large V^T的作用下,进行了一定的旋转,但是长度保持不变(正交变换不改变向量长度和向量之间的夹角);

    然后,\Sigma 对角线上的数值依次对旋转后的向量的各个维度进行缩放;最后,在正交矩阵 U 的作用下,被缩放的向量再次进行了旋转。

    说明: V^T=V^{-1},由于正交矩阵的逆是正交的,故 V^T 也是正交的。

 

四、重要性质

    一个关于SVD的重要性质如下:

                                                                  A^TA=(U\Sigma V^T)^T(U\Sigma V^T)=V(\Sigma ^T\Sigma )V^T

    两边同时右乘 V,可得

                                                                                      A^TAV=V(\Sigma ^T\Sigma )

    展开即得

                                                                     A^TA\left [ v_1,v_2,...,v_n \right ]=\left [ \lambda _1v_1,\lambda_2v_2,...,\lambda _nv_n \right ]

    其中,\Sigma ^T\Sigma 是一个对角阵,主对角线上的元素是 A^TA 的特征值, V 的列向量是 A^TA 的特征向量。同理有

                                                                                      AA^TU=U(\Sigma \Sigma^T )

                                                                    AA^T\left [ u_1,u_2,...,u_m \right ]=\left [ \lambda _1u_1,\lambda_2u_2,...,\lambda _mu_m \right ]

    其中,\Sigma \Sigma^T 是一个对角阵,主对角线上的元素是 AA^T 的特征值, U 的列向量是 AA^T 的特征向量。

 

五、重新表示SVD

    关于公式 \large A=U\Sigma V^T,若令 r=Rank(A)\sigma _k 表示 \large \Sigma 位于第 k 行第 k 列的值, 则其等价形式表示如下:

                                                                                \sum_{k=0}^{r}\sum_{i=0}^{r}\sum_{j=0}^{r}\sigma _{k}\ast U_i^{col}\ast V_j^{row}

    其中,U_i^{col} 表示 U 的第 i 列,V_j^{row} 表示 V 的第 j 行。可以看出上式是 r 个 m\times n 的矩阵之和,这些矩阵之和还原了原始矩阵 A。若 \sigma _k 非常大,则对应的 m\times n 矩阵 \sigma _{k}\ast U_i^{col}\ast V_j^{row} 的值普遍较大,蕴含了原始矩阵中较多的信息;若 \sigma _k 非常小,则可能是原始矩阵中的一些噪音。下面以图像去噪为例说明上式的作用。


        


    从左到右,分别是原图(左边)、保留90%主成分的图像(中间)和保留80%主成分的图像(右边)。可以看到 右图消除了原图中的大部分噪音,保留了主要图像信息。

    结合第四部分,AA^T 可看做是维度为 n 的 m 个样本的协方差矩阵,由图片的行表示特征,A^TA 可看做是维度为 m 的 n 个样本的协方差矩阵,由图片的列表示特征。无论是哪种情况,噪音点都不可能成为主成分,因为噪音点对应的维度方差几乎为零。所以,图像中的一些散点被剔除的特别彻底。下面是去噪代码:

import numpy as np
from numpy import linalg
from PIL import Image

img = Image.open("C:\\Users\\Paul\\Desktop\\test_img.png")
# 转为灰度图,并将灰度图转换为ndarray
gray_img = img.convert('L')
img_array = np.array(gray_img)

# m: 左奇异矩阵,sig: 奇异值对角阵,v: 右奇异矩阵
m,sig,v = np.linalg.svd(img_array)
sig = np.eye(sig.shape[0]) * sig

# 计算奇异值能量分布
sum_sig_list = []
s = 0.0
for i in range(sig.shape[0]):
    s += sig[i][i]
    sum_sig_list.append(s)

# 选择最优的奇异值个数, ratio控制阈值
i = 0
ratio = 0.7
while i < sig.shape[0]:
    r = sum_sig_list[i] / sum_sig_list[-1]
    if r >= ratio:
        print("%.2f : %.2f" % (sum_sig_list[i], sum_sig_list[-1]))
        i += 1
        break
    i += 1
print("%d, %.2f" % (i, sum_sig_list[i]))

sub_m = m[:,:i]       # 左奇异矩阵的前i列
sub_sig = sig[:i,:i]  # 对角阵的前i行和前i列组成的对角阵
sub_v = v[:i,:]       # 右奇异矩阵的前i行

# 压缩图片
compr_img_array = np.dot(np.dot(sub_m, sub_sig), sub_v)
compr_img = Image.fromarray(compr_img_array).convert("RGB")
compr_img.save("C:\\Users\\Paul\\Desktop\\test_img_70.png", "PNG")

    

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值