奇异值分解(SVD)和np.linalg.svd()函数用法

这篇具有很好参考价值的文章主要介绍了奇异值分解(SVD)和np.linalg.svd()函数用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简介

        奇异值分解是一种十分重要但又难以理解的矩阵处理技术,在机器学习中是最重要的分解没有之一的存在。那么,奇异值分解到底是在干什么呢?

        矩阵 A 表示的是高维数据,通常情况下高维数据分布并不是雨露均沾的,而往往是厚此薄彼,集中分布在某些维度上,如下图

奇异值分解(SVD)和np.linalg.svd()函数用法

        虽然原始数据的的确确是二维数据,但是其实主要集中分布在直线 L (一维空间)附近,在这里,SVD(奇异值分解)其实就是在寻找直线 L ,然后将数据映射到直线 L 上,实现数据降维的过程,即如下图

奇异值分解(SVD)和np.linalg.svd()函数用法

        于是,通过SVD(奇异值分解),就可以利用降维后的数据近似地替代原始数据。所以,SVD(奇异值分解)其实就是在寻找数据分布的主要维度,将原始的高维数据映射到低维子空间中实现数据降维。

二、概念

        奇异值分解(singular Value Decomposition),简称SVD,线性代数中矩阵分解的方法。假如有一个矩阵A,对它进行奇异值分解,可以得到三个矩阵:

        矩阵除了对角元素不为0,其他元素都为0,并且对角元素是从大到小排列的,前面的元素比较大,后面的很多元素接近0。这些对角元素就是奇异值。

        中有n个奇异值,但是由于排在后面的很多接近0,所以我们可以仅保留比较大的r个奇异值:

        实际应用中,我们仅需保留着三个比较小的矩阵,就能表示A,不仅节省存储量,在计算的时候更是减少了计算量。SVD在信息检索(隐性语义索引)、图像压缩、推荐系统、金融等领域都有应用。

        SVD一个重要的应用就是图像压缩存储,因为数字图像本身就是个矩阵,通过一个近似的低秩矩阵替代原矩阵,可以大大减少存储量。SVD还有很多用途,比如机器学习中的主成分分析,这才是直接利用低维矩阵 M 替代原矩阵 A 实现降维。

三、np.linalg.svd(a,full_matrices=1,compute_uv=1)用法描述

参数:
a是一个形如(M,N)矩阵

full_matrices的取值是为0或者1,默认值为1,这时u的大小为(M,M),v的大小为(N,N) 。否则u的大小为(M,K),v的大小为(K,N) ,K=min(M,N)。

compute_uv的取值是为0或者1,默认值为1,表示计算u,s,v。为0的时候只计算s。

返回值:

总共有三个返回值u,s,v
u大小为(M,M),s大小为(M,N),v大小为(N,N)。

A = u*s*v

        其中s是对矩阵a的奇异值分解。s除了对角元素不为0,其他元素都为0,并且对角元素从大到小排列。s中有n个奇异值,一般排在后面的比较接近0,所以仅保留比较大的r个奇异值。 

例子:

>>> from numpy import *
>>> data = mat([[1,2,3],[4,5,6]])
>>> U,sigma,VT = np.linalg.svd(data)
>>> print U
[[-0.3863177  -0.92236578]
 [-0.92236578  0.3863177 ]]
>>> print sigma
[9.508032   0.77286964]
>>> print VT
[[-0.42866713 -0.56630692 -0.7039467 ]
 [ 0.80596391  0.11238241 -0.58119908]
 [ 0.40824829 -0.81649658  0.40824829]]

        因为sigma是除了对角元素不为0,其他元素都为0。所以返回的时候,作为一维矩阵返回。本来sigma应该是由3个值的,但是因为最后一个值为0,所以直接省略了。 

四、例子

>>> a = np.random.randn(9, 6) + 1j*np.random.randn(9, 6)
>>> b = np.random.randn(2, 7, 8, 3) + 1j*np.random.randn(2, 7, 8, 3)

基于全 SVD 的重构,2D 案例:

>>> u, s, vh = np.linalg.svd(a, full_matrices=True)
>>> u.shape, s.shape, vh.shape
((9, 9), (6,), (6, 6))
# numpy的allclose方法,比较两个array是不是每一元素都相等,默认在1e-05的误差范围内
>>> np.allclose(a, np.dot(u[:, :6] * s, vh))
True

>>> smat = np.zeros((9, 6), dtype=complex)
>>> smat[:6, :6] = np.diag(s)
>>> np.allclose(a, np.dot(u, np.dot(smat, vh)))
True

基于简化 SVD 的重建,2D 案例:

>>> u, s, vh = np.linalg.svd(a, full_matrices=False)
>>> u.shape, s.shape, vh.shape
((9, 6), (6,), (6, 6))
>>> np.allclose(a, np.dot(u * s, vh))
True
>>> smat = np.diag(s)
>>> np.allclose(a, np.dot(u, np.dot(smat, vh)))
True

基于全SVD、4D案例的重构:

>>> u, s, vh = np.linalg.svd(b, full_matrices=True)
>>> u.shape, s.shape, vh.shape
((2, 7, 8, 8), (2, 7, 3), (2, 7, 3, 3))
>>> np.allclose(b, np.matmul(u[..., :3] * s[..., None, :], vh))
True
>>> np.allclose(b, np.matmul(u[..., :3], s[..., None] * vh))
True

基于简化 SVD 的重建,4D 案例:

>>> u, s, vh = np.linalg.svd(b, full_matrices=False)
>>> u.shape, s.shape, vh.shape
((2, 7, 8, 3), (2, 7, 3), (2, 7, 3, 3))
>>> np.allclose(b, np.matmul(u * s[..., None, :], vh))
True
>>> np.allclose(b, np.matmul(u, s[..., None] * vh))
True

参考文献:

SVD(奇异值分解)到底在干什么 - 知乎

这次终于彻底理解了奇异值分解(SVD)原理及应用

数据科学中需要知道的5个关于奇异值分解(SVD)的应用

奇异值分解的物理意义_SilenceHell的博客-CSDN博客_奇异值分解的意义

奇异值分解的揭秘(一):矩阵的奇异值分解过程 - 知乎文章来源地址https://www.toymoban.com/news/detail-400953.html

到了这里,关于奇异值分解(SVD)和np.linalg.svd()函数用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 奇异值分解SVD(singular value decomposition)

    SVD是一个很有用的矩阵因子化方法。 SVD提出的目的:任何一个 m × n mtimes n m × n 的矩阵都可以当作一个超椭圆(高维空间的椭圆),可以把它们当作单位球体S的像。 一个超椭圆可以通过将单位球型在正交方向 u 1 , u 2 , . . . , u m mathbf{u_1},mathbf{u_2},...,mathbf{u_m} u 1 ​ , u 2 ​

    2024年02月03日
    浏览(38)
  • SVD,奇异值分解的计算步骤以及实例讲解

           奇异值分解 (singular value decomposition,SVD),已经成为矩阵计算中最有用和最有效的工具之一,并且在最小二乘问题、最优化、统计分析、信号与图像处理、系统理论与控制等领域得到广泛应用。         首先我们都知道方阵是可以特征值分解的,那么问题来了,如果矩

    2024年02月04日
    浏览(38)
  • 矩阵篇(五)-- 特征值分解(EVD)和奇异值分解(SVD)

            设 A n × n A_{n times n} A n × n ​ 有 n n n 个线性无关的特征向量 x 1 , … , x n boldsymbol{x}_{1}, ldots, boldsymbol{x}_{n} x 1 ​ , … , x n ​ ,对应特征值分别为 λ 1 , … , λ n lambda_{1}, ldots, lambda_{n} λ 1 ​ , … , λ n ​ A [ x 1 ⋯ x n ] = [ λ 1 x 1 ⋯ λ n x n ] Aleft[begin{array}{lll

    2024年02月08日
    浏览(49)
  • 机器学习实战:Python基于SVD奇异值分解进行矩阵分解(八)

    1.1 奇异值分解 奇异值分解( Singular Value Decomposition,SVD )是一种重要的矩阵分解技术,它可以将一个矩阵分解为三个矩阵的乘积,分别为左奇异矩阵、奇异值矩阵和右奇异矩阵。SVD 的原理可以描述如下: 对于任意 m × n m times n m × n 的矩阵 A A A ,它的 SVD 分解为: A = U $

    2024年02月02日
    浏览(56)
  • 【线性代数/机器学习】矩阵的奇异值与奇异值分解(SVD)

    我们知道,对于一个 n × n ntimes n n × n 的矩阵 A A A ,如果 A A A 有 n n n 个线性无关的特征向量,则 A A A 可以相似对角化,即存在可逆矩阵 P P P 使得 A = P Λ P − 1 A=PLambda P^{-1} A = P Λ P − 1 ,其中 Λ Lambda Λ 是 A A A 的特征值组成的对角阵。 P P P 的列实际上就是 A A A 的特征向

    2024年02月10日
    浏览(39)
  • 【机器学习】 奇异值分解 (SVD) 和主成分分析 (PCA)

            在机器学习 (ML) 中,一些最重要的线性代数概念是奇异值分解 (SVD) 和主成分分析 (PCA)。收集到所有原始数据后,我们如何发现结构?例如,通过过去 6 天的利率,我们能否了解其构成以发现趋势?         对于高维原始数据,这变得更加困难。这就像

    2024年02月15日
    浏览(52)
  • 奇异值分解(SVD)原理与在降维中的应用

    奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。是很多机器学习算法的基石。本文就对SVD的原理做一个总结,并讨论在在PCA降维算法中是如何运用运

    2023年04月25日
    浏览(40)
  • 时序分解 | MATLAB实现基于SVD奇异值分解的信号分解分量可视化

    效果一览 基本介绍 SVD分解重构算法,MATLAB程序,奇异值分解 (Singular Value Decomposition)是一种常见的矩阵分解方法,用于将矩阵分解成三个矩阵的乘积。在信号处理中,SVD 可以用于特征提取、信号降维、图像压缩等方面。SVD 的一个重要应用是主成分分析 (PCA),可以用于提取数

    2024年02月11日
    浏览(49)
  • ORB-SLAM之SVD奇异值分解——理论 (一)

    在学习《视觉SLAM十四讲》过程中常遇到SVD奇异值分解,经过一段时间的学习,在此进行记录整理, 本篇主要整理SVD的数学理论基础, 下一篇 进行整理 SVD 实际应用 。 给定一大小为 m × m mtimes m m × m 的矩阵 A A A ( 方阵 ),其对角化分解可以写成 A = U Λ U − 1 A=ULambda U^{-1} A =

    2024年02月07日
    浏览(41)
  • 矩阵:采用奇异值分解(SVD)对n个点进行平面拟合

    奇异值分解(Singular Value Decomposition, SVD),是线性代数中一种重要的矩阵分解,在信号处理、统计学等领域有重要应用。奇异值分解在某些方面与对称矩阵或厄米矩阵基于特征向量的对角化类似。对称矩阵特征向量分解的基础是谱分析,而奇异值分解则是谱分析理论在任意矩

    2023年04月08日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包