SVD奇异值分解
简介:奇异值分解(Singular Value Decomposition)是线性代数中一种重要的矩阵分解,是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。是很多机器学习算法的基石。奇异值分解在数据降维中有较多的应用,这里把它的原理简单总结一下,以下仅为个人理解而整理,望指教。
一、定义
-
有一个
m×n
的实数矩阵A
,矩阵A
不一定是方阵,我们想要把它分解成如下的形式
-
其中
U
和V
均为单位正交阵(矩阵与其转置矩阵相乘为单位矩阵),U
(维度mxm
)称为左奇异矩阵,V
(维度nxn
)称为右奇异矩阵,Σ
(维度mxn
)仅在主对角线上有值,我们称它为奇异值,其它元素均为0。一般地Σ
为如下形式:
上式中对角线上的值称为奇异值。四个矩阵形象表示如下:
-
图中方块的颜色表示值的大小,颜色越浅,值越大。对于奇异值矩阵
Σ
,只有其主对角线有奇异值,其余均为0。 -
我们把上述矩阵
A
分解为U
、V
和Σ
的过程称为奇异值分解(SVD)。
二、奇异值分解原理
1.举例说明
以下图为其分解过程:
- 上式中
Σ
的平方矩阵对角线为A^tA的特征值,所以奇异值为该特征值的开根号
上图中U
为( u1,u2,u3),V
为(v1,v2),sigma1和sigma2为分解的奇异值。
2.性质
- 对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。奇异值可以被看作成一个矩阵的代表值,或者说,奇异值能够代表这个矩阵的信息。当奇异值越大时,它代表的信息越多。因此,我们取前面若干个最大的奇异值,就可以基本上还原出数据本身。这样我们可以用少量的数据表示原数据,常用于图片压缩,主成分分析(PCA)。
3.python实现
SVD(奇异值分解)Python实现
https://www.cnblogs.com/endlesscoding/p/10058532.html#alg1.1.
三、应用
1.图像压缩
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
img_eg = mpimg.imread("img.JPG")
# print(img_eg.shape)
#奇异值分解,从svd函数中得到的奇异值sigma它是从大到小排列的
#图片的大小是640×640×3
img_temp = img_eg.reshape(640, 3*640)
U,Sigma,VT = np.linalg.svd(img_temp)
# 取前40个奇异值
sval_nums = 40
img_restruct1 = (U[:,0:sval_nums]).dot(np.diag(Sigma[0:sval_nums])).dot(VT[0:sval_nums,:])
img_restruct1 = img_restruct1.reshape(640,640,3)
# 取前120个奇异值
sval_nums = 120
img_restruct2 = (U[:,0:sval_nums]).dot(np.diag(Sigma[0:sval_nums])).dot(VT[0:sval_nums,:])
img_restruct2 = img_restruct2.reshape(640,640,3)
#显示图片
fig, ax = plt.subplots(1,3,figsize = (24,32))
ax[0].imshow(img_eg)
ax[0].set(title = "orignal img")
#取前60个奇异值后的图片
ax[1].imshow(img_restruct1.astype(np.uint8))
ax[1].set(title = "60 sigma")
#取前120个奇异值后的图片
ax[2].imshow(img_restruct2.astype(np.uint8))
ax[2].set(title = "120 sigma")
取的奇异值越多,图像还原度越高
2.主成分分析(PCA)及SVD应用
参考文章
SVD(奇异值分解)小结
https://www.cnblogs.com/endlesscoding/p/10033527.html.
奇异值分解(SVD)原理与在降维中的应用
https://www.cnblogs.com/pinard/p/6251584.html.
SVD(奇异值分解)Python实现
https://www.cnblogs.com/endlesscoding/p/10058532.html#alg1.1.