标签:... matrix SVD U1 分解 奇异 Sigma lambda
数学知识—线代
为了论述矩阵的奇异值分解,需要下面的结论:
1.设A∈Crm∗n (r>0),则AHA是Hermite矩阵,且其特征值均是非负实数;
2.rank(AHA)=rankA
3.设A∈Crm∗n,则A=O的充要条件是AHA=O
定义:设A∈Crm∗n(r>0) ,则AHA的特征值为:
λ1≥λ2≥....≥λr≥λr+1=.......=λn=0
则称 σ1=λi(i=1,2,3,...,n)为A的奇异值;当A为零矩阵时,它的奇异值都是0.
定理:设A∈Crm∗n (r>0),则存在m阶酉矩阵U和n阶酉矩阵V,使得
UHAV=[ΣOOO](1.1)``
其中Σ=diag( σ1,σ2,...,σr),σi(i=1,2,....,r)为矩阵A的全部非零奇异值.
证 记Hermite矩阵AHA的特征值为:
λ1≥λ2≥....≥λr≥λr+1=.......=λn=0
根据PTP=Λ,存在n阶酉矩阵V使得
UH(AHA)V=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡λ1λ2λ3....λn⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=[Σ2OOO](1.2)``
将V分块为V=[V1∣V2],V1∈Crn∗r,V2∈Cn−rm∗(n−r)
并改写式(1.2)为
AHAV=V[Σ2OOO](1.3)``
则有 AHAV1=V1Σ2,AHAV2=O(1.4)
由式(1.4)的第一式可得 AHA=Σ2或者(AV1Σ−1)H(AV1Σ−1)=Ir
由式(1.4)的第二式可得(AV1)H(AV2)=O或AV2=O
令U1=AV1Σ−1,则U1HU1=Ir,即U1的r个列是两两正交的单位向量,记作U1=(u1,u2,u3,...ur),并将u1,u2,u3,...ur扩充为Cm的标准正交基,记增添为ur+1,...,um,并构造U2=(ur+1,...um),则U=[U1∣U2]=(u1,u2,u3,...ur,...,um)是m阶酉矩阵,且有 U1HU1=Ir,U2HU1=O
于是可得
UHAV=UH[AV1∣AV2]=[U1HU2H][U1ΣO]=[U1HU1ΣU2HU2ΣOO]=[ΣOOO]证毕``
改写式(1.1)为
A=U[ΣOOO]VH(1.5)``
SVD分解的应用—图像压缩
奇异值分解(Singular Value Decomposition,SVD)作为一种常用的矩阵分解和数据降维方法,在机器学习中也得到了广泛的应用,比如自然语言处理中的SVD词向量和潜在语义索引,推荐系统中的特征分解,SVD用于PCA降维以及图像去噪与压缩等。作为一个基础算法,我们有必要将其单独拎出来在机器学习系列中进行详述。
SVD图像压缩
通过尝试将SVD用于图像的压缩算法,其原理就是保存像素矩阵的前k个奇异值,并在此基础上做图像恢复。由SVD的原理我们可以知道,在SVD分解中越靠前的奇异值越重要,代表的信息含量越大。 下面我们尝试对一个图像进行SVD分解,并分别取前1~50个奇异值来恢复该图像。需要恢复的图像如下:
实现:Python中numpy和scipy两个科学计算库都直接提供了SVD的实现方式,所以我们这里就不再基于numpy手写SVD的实现过程了。下面基于numpy.linalg线性代数模块下的svd函数来看一个计算实例。
Python代码实现:
import numpy as np
from PIL import Image
from tqdm import tqdm
# 定义恢复函数,由分解后的矩阵恢复到原矩阵
def restore(u, s, v, K): # u:左奇异值矩阵 v:右奇异值矩阵 s:奇异值矩阵 K:奇异值个数
m, n = len(u), len(v[0])
a = np.zeros((m, n))
for k in range(K):
uk = u[:, k].reshape(m, 1)
vk = v[k].reshape(1, n)
# 前k个奇异值的加总
a += s[k] * np.dot(uk, vk)
a = a.clip(0, 255)
return np.rint(a).astype('uint8')
A = np.array(Image.open("C:/Users/Administrator/Desktop/image/headpic01.jpg", 'r')) #所要压缩图片的路径
# 对RGB图像进行奇异值分解
u_r, s_r, v_r = np.linalg.svd(A[:, :, 0])
u_g, s_g, v_g = np.linalg.svd(A[:, :, 1])
u_b, s_b, v_b = np.linalg.svd(A[:, :, 2])
# 使用前50个奇异值
K = 50
output_path = r'C:Users/Administrator/Desktop/image/svd_pic' #所得的压缩图像吃存放路径
# 恢复图像
for k in tqdm(range(1, K + 1)): # tqdm模拟进度条效果
R = restore(u_r, s_r, v_r, k)
G = restore(u_g, s_g, v_g, k)
B = restore(u_b, s_b, v_b, k)
I = np.stack((R, G, B), axis=2)
Image.fromarray(I).save('%s\\svd_%d.jpg' % (output_path, k)) 输出图片
当K=1时,被压缩后的图像模糊一团,除了颜色线条啥也看不出:
当K=25时,恢复后的压缩图像,就像打了马赛克一样:
当K=50时,所得到的压缩图像已经相对清晰许多了:
输出所得图像的渐进效果如下:
总体而言就是图像清晰度随着奇异值数量增多而变好。当奇异值k不断增大时,恢复后的图像就会无限逼近于真实图像。这便是基于SVD的图像压缩原理。
标签:...,matrix,SVD,U1,分解,奇异,Sigma,lambda 来源: https://blog.csdn.net/ZXM_SHU/article/details/106974736
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。