SVD分解原理详解

在介绍SVD之前,先补充一些基础知识

1.酉矩阵:

2.正规(正定)矩阵

3.谱分解:

表示正规矩阵,可经由酉变换,分解为对角矩阵;这种矩阵分解的方式,称为谱分解(spectral decomposition)。

4.SVD分解

作为谱定理的泛化,SVD 分解对于原矩阵的要求就要弱得多。

4.手动SVD分解的一个实例

SVD的分解实际可以将矩阵 M写成一个求和形式

5.SVD分解的应用:

(1)分析了解原矩阵的主要特征和携带的信息(取若干最大的奇异值),这引出了主成分分析(PCA);

丢弃忽略原矩阵的次要特征和携带的次要信息(丢弃若干较小的奇异值),这引出了信息有损压缩、矩阵低秩近似等话题。

这两方面的应用实际上是对偶的:因为,按重要度排序之后,一方面我们可以知道哪些信息(奇异值)重要,另一方面我就很自然地就可以丢弃不重要的部分。

(2)举一个具体的实例:在图像数字化技术中,一副图片可转换成一个m*n阶像素矩阵来存储,存储量是m*n个数。如果利用矩阵A(秩为r)的奇异值展开式(即上述将SVD分解写成求和的形式),则只要存储A的奇异值,奇异向量U,V的分量,总计r*(m+n+1)个数。取m=n=1000,r=100,则m*n = 10的6次方,而r*(m+n+1)=200100

6. SVD分解实战——SVD与图像分解

# SVD分解
import os
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt


def restore(sigma, u, v, K):
    m = u.shape[0]
    n = v.shape[0]
    svd_result = np.zeros((m, n))
    for k in range(K + 1):
        for i in range(m):
            svd_result[i] += sigma[k] * u[i][k] * v[k]

    svd_result[svd_result < 0] = 0
    svd_result[svd_result > 255] = 255
    return np.rint(svd_result).astype('uint8')



palace = Image.open("palace.jpeg", "r")
print(palace)

output_path = r'./SVD'
if not os.path.exists(output_path):
    os.mkdir(output_path)

palace_array = np.array(palace)

K = 50
u_r, sigma_r, v_r = np.linalg.svd(palace_array[:, :, 0])
u_g, sigma_g, v_g = np.linalg.svd(palace_array[:, :, 1])
u_b, sigma_b, v_b = np.linalg.svd(palace_array[:, :, 2])
plt.figure(figsize=(10, 10))

for k in range(1, K + 1):
    R = restore(sigma_r, u_r, v_r, k)
    G = restore(sigma_g, u_g, v_g, k)
    B = restore(sigma_b, u_b, v_g, k)
    I = np.stack((R, G, B), axis=2)
    Image.fromarray(I).save('%s/svd_%d.png' % (output_path, k))
    if k <= 12:
        plt.subplot(3, 4, k)
        plt.imshow(I)
        plt.axis('off')
        plt.title('svd num: %d' % k)

plt.suptitle('SVD and image decomposition', fontsize=20)


运行得到下图,是不是很神奇呀

 

 

参考链接

http://open.163.com/movie/2016/4/D/4/MBKJ0DQ52_MBQUMH1D4.html

https://www.youtube.com/watch?v=T3dkdfj7YXw

(这个视频里边的分解很简单,但感觉只是适用于某些特殊情况)

书籍:矩阵论--杨明,刘先忠

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值