SVD奇异值分解-机器学习

SVD奇异值分解

简介:奇异值分解(Singular Value Decomposition)是线性代数中一种重要的矩阵分解,是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。是很多机器学习算法的基石。奇异值分解在数据降维中有较多的应用,这里把它的原理简单总结一下,以下仅为个人理解而整理,望指教。



一、定义

  • 有一个m×n的实数矩阵A,矩阵A不一定是方阵,我们想要把它分解成如下的形式
    A

  • 其中UV均为单位正交阵(矩阵与其转置矩阵相乘为单位矩阵),U(维度mxm)称为左奇异矩阵,V(维度nxn)称为右奇异矩阵,Σ(维度mxn)仅在主对角线上有值,我们称它为奇异值,其它元素均为0。一般地Σ为如下形式:
    在这里插入图片描述
    上式中对角线上的值称为奇异值。四个矩阵形象表示如下:
    SVD

  • 图中方块的颜色表示值的大小,颜色越浅,值越大。对于奇异值矩阵Σ,只有其主对角线有奇异值,其余均为0。

  • 我们把上述矩阵A分解为UVΣ的过程称为奇异值分解(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应用

链接: 如何通俗易懂地讲解什么是 PCA 主成分分析?.


参考文章

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值