关于奇异值以及奇异值分解SVD的思考

图像奇异值分解SVD遇到的奇怪问题 一开始做图像奇异值分解实验,用的 u, sigma, v = np.linalg.svd() 出来的全是乱码图像 怎么调整都不行,简直要抓狂了 ` 0 ` !!! 后来在别人电脑上跑了一下,竟然有效果! 找问题!!调整numpy的版本, pip install numpy==1.16.5 果然解决了!!! 应该是numpy版本问题,或者文件损坏了,么得办法!... 阅读详情

前言:
  SVD作为一个很基本的算法,在很多机器学习算法中都有它的身影,特别是在现在的大数据时代,由于SVD可以实现并行化,因此更是大展身手。SVD的原理不难,只要有基本的线性代数知识就可以理解,实现也很简单因此值得仔细的研究。当然,SVD的缺点是分解出的矩阵解释性往往不强,有点黑盒子的味道,不过这不影响它的使用

1,SVD的数学基础

1.1为什么要做SVD分解?

回顾特征值和特征向量

  我们首先回顾下特征值和特征向量的定义如下:

Ax=λx

  其中 A 是一个n×n的矩阵, x 是一个n维向量,则我们说 λ 是矩阵A的一个特征值,而 x 是矩阵A的特征值 λ 所对应的特征向量。求出特征值和特征向量有什么好处呢? 就是我们可以将矩阵A特征分解。如果我们求出了矩阵A的 n 个特征值λ1≤λ2≤...≤λn,以及这n个特征值所对应的特征向量 {w1,w2,...wn} ,那么矩阵A就可以用下式的特征分解表示:
A=WΣW−1

  其中 W 是这n个特征向量所张成的 n×n 维矩阵,而 Σ 为这 n 个特征值为主对角线的n×n维矩阵。一般我们会把 W 的这n个特征向量标准化,即满足 ||wi||2=1 , 或者说 wTiwi=1 ,此时 W 的n个特征向量为标准正交基,满足 WTW=I ,即 WT=W−1 , 也就是说 W 为酉矩阵(不知道什么是酉矩阵?)。
  这样我们的特征分解表达式可以写成
A=WΣWT

  注意到要进行特征分解,矩阵 A 必须为方阵。那么如果A不是方阵,即行和列不相同时,我们还可以对矩阵进行分解吗?答案是可以,此时我们的SVD登场了。

SVD的定义

  SVD也是对矩阵进行分解,但是和特征分解不同,SVD并不要求要分解的矩阵为方阵。假设我们的矩阵 A 是一个m×n的矩阵,那么我们定义矩阵 A 的SVD为:

A=UΣVT

  其中U是一个 m×m 的矩阵, Σ 是一个 m×n 的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值, V 是一个n×n的矩阵。 U 和V都是酉矩阵,即满足 UTU=I,VTV=I 。下图可以很形象的看出上面SVD的定义:
  
SVD示意图

SVD的直观解释

下面的讨论需要一点点线性代数的知识。线性代数中最让人印象深刻的一点是,要将矩阵和空间中的线性变换视为同样的事物。比如对角矩阵 M 作用在任何一个向量上

[3001][xy]=[3xy]

其几何意义为在水平 x 方向上拉伸3倍,y方向保持不变的线性变换。换言之对角矩阵起到作用是将水平垂直网格作水平拉伸(或者反射后水平拉伸)的线性变换。
这里写图片描述  这里写图片描述

如果 M 不是对角矩阵,而是一个对称矩阵

M=[2112]

那么,我们也总可以找到一组网格线,使得矩阵作用在该网格上仅仅表现为(反射)拉伸变换,而没有旋转变换
这里写图片描述   这里写图片描述

总结一下,对角矩阵的作用是对某一向量进行“正向”伸缩(即沿着 x 轴和y周),对称矩阵的所用是读某一向量进行“对称”伸缩(即沿着与对称抽对称的方向伸缩,对称轴是什么?上面的 M 矩阵中有两个向量分别是:(2,1)和(1,2),它们在坐标平面中两个点,这两个点的连线就是矩阵的对称轴)

考虑更一般的非对称矩阵

M=[1011]

很遗憾,此时我们再也找不到一组网格,使得矩阵作用在该网格上之后只有拉伸变换(找不到背后的数学原因是对一般非对称矩阵无法保证在实数域上可对角化,不明白也不要在意)。我们退求其次,找一组网格,使得矩阵作用在该网格上之后允许有拉伸变换和旋转变换,但要保证变换后的网格依旧互相垂直。这是可以做到的
下面我们就可以自然过渡到奇异值分解的引入。奇异值分解的几何含义为:对于任何的一个矩阵,我们要找到一组两两正交单位向量序列,使得矩阵作用在此向量序列上后得到新的向量序列保持两两正交。下面我们要说明的是,奇异值的几何含义为:这组变换后的新的向量序列的长度。

看到这里你可能又糊涂了。我们不妨回过头来,看一下SVD的定义:

M=UΣVT

其中,矩阵 U 和VT分别是 m×m 和 n×n 的酉矩阵,酉矩阵的意思就是其转置与本身的乘积为单位矩阵。其实就是我们本科学的正交矩阵,只不过酉矩阵将正交矩阵的实数域扩展到了复数域。对于酉矩阵而言,如果其为方阵,那么这个酉矩阵的行(列)向量就构成了一组 标准正交基
(模为1的正交基向量)由于 VT=V−1 因此等式两边都右乘 V 得到:
MV=UΣ
从这个式子可以看到,矩阵 M 作用在一组两两正交的单位向量序列(也就是矩阵V的列向量),得到了一个新的向量序列 UΣ ,新的向量序列仍然保持两两正交。举例说明如下:
这里写图片描述   这里写图片描述

当矩阵 M 作用在正交单位向量v1和 v2 上之后,得到 Mv1 和 Mv2 也是正交的(此时我们的 V 矩阵被表示成这个样子:V=(v1,v2), v1,v2 分别为列向量)。令 u1 和 u2 分别是 Mv1 和 Mv2 方向上的单位向量,即 Mv1=σ1u1,Mv2=σ2u2 ,写在一起就是 M[v1v2]=[σ1v1σ2v2] ,整理得:

MV=UΣ
M[v1v2]=[σ1v1σ2v2]=[u1u2][σ100σ2]

这样就得到矩阵的奇异值分解。奇异值和分别是和的长度。很容易可以把结论推广到一般 n 维情形。

下面给出一个更简洁更直观的奇异值的几何意义。
假设A的奇异值分解为:

A=[u1u2][3001][vT1vT2]

其中是 u1,u2,v1,v2 二维平面的向量(例如 u1=(3,4) )。根据奇异值分解的性质, u1,u2 线性无关, v1,v2 线性无关(前面已经说了,它们互相正交)。那么对二维平面上任意的向量 x ,都可以表示为:x=ξ1v1+ξ2v2。
当 A 作用在x上时,

y=Ax=A[v1v2][ξ1ξ2]=[u1u2][3001][vT1vT2][v1v2][ξ1ξ2]=3ξ1u1+ξ2u2

令 η1=3ξ1,η2=ξ2 ,我们可以得出结论:如果是 x 在单位圆ξ21+ξ22=1上,那么 y 正好在椭圆ξ21/32+ξ22/12=1上。这表明:矩阵 A 将二维平面中单位圆变换成椭圆,而两个奇异值正好是椭圆的两个半轴长,长轴所在的直线是span(u1),短轴所在的直线是 span(u2) .(span函数是?–span()表示以括号里的向量做基底,拓展的线性空间
)

推广到一般情形:一般矩阵 A 将单位球∥x∥2=1变换为超椭球面 Em={y∈Cm:y=Ax,x∈Cm,|x|2=1|} ,那么矩阵的每个奇异值恰好就是超椭球的每条半轴长度。
这里写图片描述

与特征值分解的联系

  奇异值分解能够用于任意 m×n 矩阵,而特征分解只能适用于特定类型的方阵,故奇异值分解的适用范围更广。不过,这两个分解之间是有关联的。给定一个M的奇异值分解,根据上面的论述,两者的关系式如下:
  

MTM=VΣTUTUΣVT=V(Σ∗Σ)V∗

MMT=UΣVTVΣTUT=U(ΣΣT)UT

关系式的右边描述了关系式左边的特征值分解。于是:
V 的列向量(右奇异向量)是MTM的特征向量。
U 的列向量(左奇异向量)是 MMT 的特征向量。
Σ 的非零对角元(非零奇异值)是 MTM 或者 MMT 的非零特征值的平方根。

手工推导见下图:
手工推导

为什么要做SVD? 

  上面几节我们对SVD的定义做了详细的描述,似乎看不出我们费这么大的力气做SVD有什么好处。那么SVD有什么重要的性质值得我们注意呢?
  对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的 r 个的奇异值和对应的左右奇异向量来近似描述矩阵。也就是说:

Datam×n=Um×mΣm×nVTn×n≈Um×rΣr×rVTr×n

  其中r要比n小很多,也就是一个大的矩阵 A 可以用三个小的矩阵来表示。如下图所示,现在我们的矩阵Data只需要灰色的部分的三个小矩阵就可以近似描述了。那么在实际操作中,我们是如何知道仅需要保留 r 个奇异值呢?
  确定r的值有很多启发式的算法。当然,最直接的是直接用肉眼观察。
  除此之外,一个典型做法是保留矩阵中90%的能量信息。具体来讲,我们可以对奇异值求平方和。于是可以对奇异值的平方和累加直至总和的90%为止。 
  另一个启发式的策略是,当矩阵上有上千万的奇异值时,那么就保留前面的2000或3000个。尽管不优雅,但是很有效。
这里写图片描述

  图注:上图中, Datai,j=uTiΣvj , uTi, 和 vj, 分别是矩阵 U 和VT的行向量和列向量。

  由于 r 值这个重要的性质,SVD可以用于PCA降维,来做数据压缩和去噪。也可以用于推荐算法,将用户和喜好对应的矩阵做特征分解,进而得到隐含的用户需求来做推荐。同时也可以用于NLP中的算法,比如潜在语义索引(LSI)。
  当然,降维、去噪声在不同的领域里,有不同的内涵。
  我们看一个例子:

  假设这个Data矩阵表示的是某个网站 m 个用户对n个商品的评分矩阵,在推荐系统中,我们常常希望根据用户的评分求某几个商品的相似度。如果我们不进行SVD分解,那么每两个商品-用户向量(也就是 Data 矩阵中的某两列)的维度是 m 维,你可以想想一下,淘宝网的用户应该有多少。按照这个数量级,商品-用户向量(也就是Data矩阵中的某两列)将高达几百万维度,我们做这两个向量的相似度将非常计算将非常巨大,而且这还仅仅是两个向量。 
  现在我们通过SVD分解后,发现对于每一个商品而言,实际具有代表性的用户(你也可以称之为意见领袖)只有 r 个,而且很幸运,根据我们刚才讨论的SVD性质,这个r相比于 m 而言,应该是极大的变小了的。这样一来,我们在矩阵Data中求某两列的相似性,可以移植到 VT 矩阵中前 r 行子矩阵。这个r×n的子矩阵有一个非常好的特点,那就是在行数上由 m 降低到r( r≪m ),而列数等于商品个数( n ),这样我们计算任意两个商品相似度时候,每个商品-用户向量(也就是这个子矩阵的某一列)只有2个维度。这就叫做“降维”。
  同样的道理,如果我们希望计算某两个用户的相似度,我们也可以将其移植到矩阵U中前 r 列构成的子矩阵中。这个子矩阵保留了所有用户,但是简化了商品数目。也实现了降维。
  那么现在的问题是,他们是怎么简化的呢?换言之,对于VT矩阵中前 r 行构成的子矩阵,他们的列我们知道表示的是商品,与矩阵Data是对应的,那么他们的每一行表示的是哪个用户呢?
  其实,他们的每一行表示的不是 Data 中的哪个用户,而是根据奇异值,对 Data 中的用户进行了分组。也就是说,将 m 个用户,分成了r组,每一组叫做一个抽象用户,或者叫做映射用户。那么,对于其中的某一行而言,这一行就是某个抽象用户对商品的打分情况。然而,有趣的是,这一行中的每一个分数值,并没有什么实际意义。只是在计算相似性的时候,有价值,或者说,这个分数值,只是一个相对于其他向量的相对值。在实际工作中,你常常会发现,本来我们规定打分是0-5区间的数值,但是你看一下这个矩阵,里面常常是负数。这也是为什么,有人说矩阵分解的缺陷就是解释性不强的原因。
  同样的道理,相信你也可以理解 U 矩阵的含义了。
  整理一下我们看到,对VT矩阵,我们使用的是他的前 r 行构成的子矩阵,这个子矩阵保留了所有商品的信息,但是简化了用户的构成。因此,我们说VT矩阵将用户映射到了一个“奇异空间”中,即,本来人家是 m 用户,m维的向量,现在让你映射到了 r 维。变成了r个映射用户了。同样的,我们也说,矩阵 U 将商品映射到了“奇异空间”中去了。
  那么这个“奇异空间”是什么呢?        
  对的,就是奇异矩阵构成的空间。准确的说,是上图中那个r×r的子矩阵,他将 n 维商品,映射到了r维抽象商品中,将 m 维用户,映射到了r维抽象用户中。  

1.2 SVD的计算过程

回顾一下:

  那么我们如何求出SVD分解后的 U ,Σ, V 这三个矩阵呢?这部分,在上一节的开头部分已经说了。
  如果我们将A的转置和 A 做矩阵乘法,那么会得到n×n的一个方阵 ATA 。既然 ATA 是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下式:

(ATA)vi=λivi

  这样我们就可以得到矩阵 ATA 的 n 个特征值和对应的n个特征向量 v 了。将ATA的所有特征向量张成一个 n×n 的矩阵 V ,就是我们SVD公式里面的V矩阵了。一般我们将 V 中的每个特征向量叫做A的右奇异向量。
  如果我们将 A 和A的转置做矩阵乘法,那么会得到 m×m 的一个方阵 AAT 。既然 AAT 是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下式:
  

(ATA)ui=λiui

  这样我们就可以得到矩阵 AAT 的 m 个特征值和对应的m个特征向量 u 了。将AAT的所有特征向量张成一个 m×m 的矩阵 U ,就是我们SVD公式里面的U矩阵了。一般我们将 U 中的每个特征向量叫做A的左奇异向量。

U和 V 我们都求出来了,现在就剩下奇异值矩阵Σ没有求出了。由于 Σ 除了对角线上是奇异值其他位置都是0,那我们只需要求出每个奇异值 σ 就可以了。
  我们注意到:

A=UΣVT⇒AV=UΣVTV⇒AV=UΣ⇒Avi=σiui⇒σi=Avi/ui

  这样我们可以求出我们的每个奇异值,进而求出奇异值矩阵 Σ 。进一步我们还可以看出我们的特征值矩阵等于奇异值矩阵的平方,也就是说特征值和奇异值满足如下关系:

σi=λi−−√

  这样也就是说,我们可以不用 σi=Avi/ui 来计算奇异值,也可以通过求出ATA的特征值取平方根来求奇异值。

SVD计算举例

这里我们用一个简单的例子来说明矩阵是如何进行奇异值分解的。我们的矩阵A定义为:

A=⎛⎝⎜011110⎞⎠⎟

我们首先求出 ATA 和 AAT :

ATA=(011110)⎛⎝⎜011110⎞⎠⎟=(2112)
AAT=⎛⎝⎜011110⎞⎠⎟(011110)=⎛⎝⎜110121011⎞⎠⎟

进而求出 ATA 的特征值和特征向量:

λ1=3;v1=(1/2√1/2√);λ2=1;v2=(−1/2√1/2√)

接着求 AAT 的特征值和特征向量:

λ1=3;u1=⎛⎝⎜1/6√2/6√1/6√⎞⎠⎟;λ2=1;u2=⎛⎝⎜1/2√0−1/2√⎞⎠⎟;λ3=0;u3=⎛⎝⎜1/3√−1/3√1/3√⎞⎠⎟

 
利用 Avi=σiui,i=1,2 求奇异值:
⎛⎝⎜011110⎞⎠⎟(1/2√1/2√)=σ1⎛⎝⎜1/6√2/6√1/6√⎞⎠⎟⇒σ1=3√
⎛⎝⎜011110⎞⎠⎟(−1/2√1/2√)=σ2⎛⎝⎜1/2√0−1/2√⎞⎠⎟⇒σ2=1

当然,我们也可以用 σi=λi−−√ 直接求出奇异值为 3√ 和1.
最终得到 A 的奇异值分解为:
A=UΣVT=⎛⎝⎜1/6√2/6√1/6√1/2√0−1/2√1/3√−1/3√1/3√⎞⎠⎟⎛⎝⎜3√00010⎞⎠⎟(1/2√−1/2√1/2√1/2√)

Python 实现:

本节首先给出工程应用中,我们直接使用Skearn库做SVD的代码,并进行详细的解释。然后再给出SVD的模型实现代码。

2, SVD用于推荐

2.1 推荐系统概述

正在更新

2.2 为什么要用矩阵分解?

在推荐系统中,我们常常遇到的问题是这样的,我们有很多用户和物品,也有少部分用户对少部分物品的评分,我们希望预测目标用户对其他未评分物品的评分,进而将评分高的物品推荐给目标用户。对于每个用户,我们希望较准确的预测出用户对未评分物品的评分。对于这个问题我们有很多解决方法,本文我们关注于用矩阵分解的方法来做。如果将m个用户和n个物品对应的评分看做一个矩阵M我们希望通过矩阵分解来解决这个问题。

2.3 传统的SVD用于推荐

说道矩阵分解,我们首先想到的就是奇异值分解SVD。此时可以将这个用户物品对应的m×n矩阵M进行SVD分解,并通过选择部分较大的一些奇异值来同时进行降维,也就是说矩阵M此时分解为:

Mm×n=Um×kΣk×kVTk×n
其中k是矩阵M中较大的部分奇异值的个数,一般会远远的小于用户数和物品树。如果我们要预测第i个用户对第j个物品的评分 mij ,则只需要计算 uTiΣvj 即可。通过这种方法,我们可以将评分表里面所有没有评分的位置得到一个预测评分。通过找到最高的若干个评分对应的物品推荐给用户。
可以看出这种方法简单直接,似乎很有吸引力。但是有一个很大的问题我们忽略了,就是SVD分解要求矩阵是稠密的,也就是说矩阵的所有位置不能有空白。有空白时我们的M是没法直接去SVD分解的。大家会说,如果这个矩阵是稠密的,那不就是说我们都已经找到所有用户物品的评分了嘛,那还要SVD干嘛! 的确,这是一个问题,传统SVD采用的方法是对评分矩阵中的缺失值进行简单的补全,比如用全局平均值或者用用户物品平均值补全,得到补全后的矩阵。接着可以用SVD分解并降维。
虽然有了上面的补全策略,我们的传统SVD在推荐算法上还是较难使用。因为我们的用户数和物品一般都是超级大,随便就成千上万了。这么大一个矩阵做SVD分解是非常耗时的。那么有没有简化版的矩阵分解可以用呢?我们下面来看看实际可以用于推荐系统的矩阵分解。

2.4 FunkSVD算法用于推荐

FunkSVD是在传统SVD面临计算效率问题时提出来的,既然将一个矩阵做SVD分解成3个矩阵很耗时,同时还面临稀疏的问题,那么我们能不能避开稀疏问题,同时只分解成两个矩阵呢?也就是说,现在期望我们的矩阵M这样进行分解:

Mm×n=PTm×kQk×n

我们知道SVD分解已经很成熟了,但是FunkSVD如何将矩阵M分解为P和Q呢?这里采用了线性回归的思想。我们的目标是让用户的评分和用矩阵乘积得到的评分残差尽可能的小,也就是说,可以用均方差作为损失函数,来寻找最终的P和Q。
对于某一个用户评分mij,如果用FunkSVD进行矩阵分解,则对应的表示为q_j^Tp_i,采用均方差做为损失函数,则我们期望 (mij−qTjpi)2 尽可能的小,如果考虑所有的物品和样本的组合,则我们期望最小化下式:

∑i,j(mij−qTjpi)2
只要我们能够最小化上面的式子,并求出极值所对应的pi,qj,则我们最终可以得到矩阵P和Q,那么对于任意矩阵M任意一个空白评分的位置,我们可以通过qTjpi计算预测评分。很漂亮的方法!
当然,在实际应用中,我们为了防止过拟合,会加入一个L2的正则化项,因此正式的FunkSVD的优化目标函数J(p,q)是这样的:
则在梯度下降法迭代时,pi,qj的迭代公式为:
通过迭代我们最终可以得到P和Q,进而用于推荐。FunkSVD算法虽然思想很简单,但是在实际应用中效果非常好,这真是验证了大道至简。

2.5 BiasSVD算法用于推荐

在FunkSVD算法火爆之后,出现了很多FunkSVD的改进版算法。其中BiasSVD算是改进的比较成功的一种算法。BiasSVD假设评分系统包括三部分的偏置因素:一些和用户物品无关的评分因素,用户有一些和物品无关的评分因素,称为用户偏置项。而物品也有一些和用户无关的评分因素,称为物品偏置项。这其实很好理解。比如一个垃圾山寨货评分不可能高,自带这种烂属性的物品由于这个因素会直接导致用户评分低,与用户无关。
假设评分系统平均分为μ,第i个用户的用户偏置项为bi,而第j个物品的物品偏置项为bj,则加入了偏置项以后的优化目标函数J(p,q)是这样的
这个优化目标也可以采用梯度下降法求解。和FunkSVD不同的是,此时我们多了两个偏执项bi
bjbi,,pi,qj的迭代公式和FunkSVD类似,只是每一步的梯度导数稍有不同而已,这里就不给出了。而bi,bj一般可以初始设置为0向量,然后参与迭代。这里给出bi,bj的迭代方法
通过迭代我们最终可以得到P和Q,进而用于推荐。BiasSVD增加了一些额外因素的考虑,因此在某些场景会比FunkSVD表现好。

2.6 SVD++算法用于推荐

SVD++算法在BiasSVD算法上进一步做了增强,这里它增加考虑用户的隐式反馈。好吧,一个简单漂亮的FunkSVD硬是被越改越复杂。
对于某一个用户i,它提供了隐式反馈的物品集合定义为N(i), 这个用户对某个物品j对应的隐式反馈修正的评分值为cij, 那么该用户所有的评分修正值为∑s∈N(i)csj。一般我们将它表示为用qTjys形式,则加入了隐式反馈项以后的优化目标函数J(p,q)是这样的:
其中,引入|N(i)|−1/2是为了消除不同|N(i)|个数引起的差异。式子够长的,不过需要考虑用户的隐式反馈时,使用SVD++还是不错的选择。

2.7 推荐技术的未来

FunkSVD将矩阵分解用于推荐方法推到了新的高度,在实际应用中使用也是非常广泛。当然矩阵分解方法也在不停的进步,目前张量分解和分解机方法是矩阵分解推荐方法今后的一个趋势。
对于矩阵分解用于推荐方法本身来说,它容易编程实现,实现复杂度低,预测效果也好,同时还能保持扩展性。这些都是它宝贵的优点。当然,矩阵分解方法有时候解释性还是没有基于概率的逻辑回归之类的推荐算法好,不过这也不影响它的流形程度。小的推荐系统用矩阵分解应该是一个不错的选择。大型的话,则矩阵分解比起现在的深度学习的一些方法不占优势。

3 SVD用于图像压缩

从一张图片出发,让我们来看看奇异值代表什么意义。这张照片,像素为高度450*宽度333。
这里写图片描述
我们都知道,图片实际上对应着一个矩阵,矩阵的大小就是像素大小,比如这张图对应的矩阵阶数就是450*333,矩阵上每个元素的数值对应着像素值。我们记这个像素矩阵为 A

现在我们对矩阵A进行奇异值分解。

A=UΣVT=[u1u2...ur]⎡⎣⎢⎢⎢σ10...00σ2...0............00...σr⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢⎢vT1vT2...vTr⎤⎦⎥⎥⎥⎥

直观上,奇异值分解将矩阵分解成若干个秩一矩阵之和,用公式表示就是:
A=σ1u1vT1+σ2u2vT2+...+σrurvTr
其中等式右边每一项前的系数就是奇异值, u 和v分别表示列向量,秩一矩阵的意思是矩阵秩为1。注意到每一项都是秩为1的矩阵。我们假定奇异值满足 σ1⩾σ2⩾...⩾σr⩾0 (奇异值大于0是个重要的性质,但这里先别在意),如果不满足的话重新排列顺序即可,这无非是编号顺序的问题。

既然奇异值有从大到小排列的顺序,我们自然要问,如果只保留大的奇异值,舍去较小的奇异值,这样上式里的等式自然不再成立,那会得到怎样的矩阵——也就是图像?
只保留等式右边第一项,然后作图:
这里写图片描述
结果就是完全看不清是啥……我们试着多增加几项进来, A5=σ1u1vT1+...+σ5u5vT5 再作图:
这里写图片描述
隐约可以辨别这是短发伽椰子的脸……但还是很模糊,毕竟我们只取了5个奇异值而已。当我们取到上式等式右边前50项时:
这里写图片描述
我们得到和原图差别不大的图像。也就是说当从1不断增大时,不断的逼近。让我们回到公式

A=σ1u1vT1+σ2u2vT2+...+σrurvTr

矩阵 A 表示一个450*333的矩阵,需要保存个元素的值。等式右边u和 v 分别是450*1和333*1的向量,每一项有1+450+333=784个元素。如果我们要存储很多高清的图片,而又受限于存储空间的限制,在尽可能保证图像可被识别的精度的前提下,我们可以保留奇异值较大的若干项,舍去奇异值较小的项即可。例如在上面的例子中,如果我们只保留奇异值分解的前50项,则需要存储的元素为 784×50=39200 ,和存储原始矩阵相比,存储量仅为后者的26%。

因此:奇异值往往对应着矩阵中隐含的重要信息,且重要性和奇异值大小正相关。每个矩阵都可以表示为一系列秩为1的“小矩阵”之和,而奇异值则衡量了这些“小矩阵”对于的权重。

在图像处理领域,奇异值不仅可以应用在数据压缩上,还可以对图像去噪。如果一副图像包含噪声,我们有理由相信那些较小的奇异值就是由于噪声引起的。当我们强行令这些较小的奇异值为0时,就可以去除图片中的噪声。如下是一张25*15的图像
这里写图片描述
但往往我们只能得到如下带有噪声的图像(和无噪声图像相比,下图的部分白格子中带有灰色):
这里写图片描述

通过奇异值分解,我们发现矩阵的奇异值从大到小分别为:14.15,4.67,3.00,0.21,……,0.05。除了前3个奇异值较大以外,其余奇异值相比之下都很小。强行令这些小奇异值为0,然后只用前3个奇异值构造新的矩阵,得到
这里写图片描述
可以明显看出噪声减少了(白格子上灰白相间的图案减少了)。

5 SVD小结 

SVD作为一个很基本的算法,在很多机器学习算法中都有它的身影,特别是在现在的大数据时代,由于SVD可以实现并行化,因此更是大展身手。SVD的原理不难,只要有基本的线性代数知识就可以理解,实现也很简单因此值得仔细的研究。当然,SVD的缺点是分解出的矩阵解释性往往不强,有点黑盒子的味道,不过这不影响它的使用

6 参考文献

主要参考资料:
1,知乎
https://www.zhihu.com/question/22237507
2,刘建平
3,维基百科
4,《机器学习实战》
5,《机器学习算法原理与编程实践》

welcome!

Xiangguo Sun
sunxiangguodut@qq.com
http://blog.youkuaiyun.com/github_36326955

Welcome to my blog column: Dive into ML/DL!

这里写图片描述

I devote myself to dive into typical algorithms on machine learning and deep learning, especially the application in the area of computational personality.

My research interests include computational personality, user portrait, online social network, computational society, and ML/DL. In fact you can find the internal connection between these concepts:

这里写图片描述

In this blog column, I will introduce some typical algorithms about machine learning and deep learning used in OSNs(Online Social Networks), which means we will include NLP, networks community, information diffusion,and individual recommendation system. Apparently, our ultimate target is to dive into user portrait , especially the issues on your personality analysis.


All essays are created by myself, and copyright will be reserved by me. You can use them for non-commercical intention and if you are so kind to donate me, you can scan the QR code below. All donation will be used to the library of charity for children in Lhasa.


赏金将用于拉萨儿童图书公益募捐
社会公益,听IT人的声音

手机扫一扫,即可:

附:《春天里,我们的拉萨儿童图书馆,需要大家的帮助》

利用SVD简化数据——奇异值分解 利用SVD简化数据——奇异值分解基础知识奇异值分解的原理基于协同过滤的搜索引擎实例:餐馆菜肴推荐引擎 和 代码 基础知识 奇异值分解 优点:简化数据,去除噪声,提高算法的结果。 缺点:数据的转换可能难以理解。 适用数据类型:数值型数据。 作用:数据降维,压缩存储。通过抽取特征数据, 从而去除噪声和冗余数据,达到压缩数据的目的。 应用的主要方面有:隐形语义的索引,推荐引擎, 数据压缩。 下面我们就来具体看看SVD的应用有哪些: ●最早的SVD应用之-就是信息检索,我们称利用SVD的方法为隐性语义索引( 阅读详情

相关推荐

基于单边jacobi的奇异值分解(SVD)

基于单边jacobi的奇异值分解(SVD)对于奇异值分解(SVD),相信很多学过线性代数/高等代数的同学都不会很陌生,但是怎么实现呢?接下来就来详细说说。  为了方便讨论,本文所有的讨论仅限定于实数空间。奇异值分解的含义就是将矩阵A分解成一个酉矩阵U,一个准对角矩阵S还有一个酉矩阵V。首先要说明一点,SVD分解是存在的但不唯一,这个有兴趣的读者可以思考一下。利用数学公式可以写成:  A=USV′

k531623594的专栏 1万+

矩阵的奇异值分解(SVD)

矩阵的本质可以是代表着一定维度空间上的线性变换。矩阵分解的本质是将原本m*n复杂的矩阵分解成对应的几个简单矩阵的乘积的形式。使得矩阵分析起来更加简单。 前面写过一篇博客讲的是矩阵的特征值分解,但是我们知道很多矩阵都是不能够进行特征值分解的。这种情况下,如果我们想通过矩阵分解的形式将原本比较复杂的矩阵问题分解成比较简单的矩阵相乘的形式,会对其进行奇异值分解。 简单回顾特征值分解 如果一个n*n矩阵A有n个特征值,并且这n个特征值所对应的n个特征向量线性无关,则矩阵A可以使用下式进行特征值分解: 其

sky的博客 2万+

GEM5教程--gem5开始之旅(一)

GEM5系列教程--gem5开始之旅一、建立GEM5 GEM5模拟器是一个用于计算机系统结构研究的模块化平台,包含系统级别的结构以及处理器的微体系结构。读者若想详细的了解,请查看其官方文档GEM5文档 读者如果想要入门GEM5的话,可以参考Learning_GEM5这个网站,这里面有较为详细的教程,可以带读者从入门到精通。小编我对GEM5的入门学习也是从这个Learning_GEM5这个网站学习的...

qq_43381135的博客 3万+

特征值分解、奇异值分解、PCA概念整理

本文将分别介绍特征值分解、奇异值分解、及PCA的相关理论概念。 文章末尾将给出Householder矩阵变换、QR算法求解特征值、特征向量的代码 其中,特征值分解、奇异值分解的相关内容,转载自: http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html 考虑到本文50%以上的部分不是那个哥

Where there is life, there is hope 10万+

ADS系列之SI&PI仿真笔记:ADS多种版本的安装、卸载&重装(一)

此系列仅作为ADS学习过程的记录,如有错误的地方还请大佬指正! 一、下载&安装 ADS软件下载&安装还算比较简单,目前接触到有两个版本:ADS2017和ADS2019。这里贴下链接,破解教程里面都有: ADS2017下载地址:https://pan.baidu.com/s/1l-Bs9owKRmp5Pv0Mt92OYA 提取码:wuzf ADS2019下载地址:吴川斌的博客-w...

Claudedy的博客 3万+

电磁兼容标准体系解析:从基础到认证的完整指南

本文系统解析了电磁兼容(EMC)标准体系,从基础概念到认证流程提供完整指南。文章阐述了EMC对于产品可靠性与市场准入的重要性,详细拆解了基础标准、通用标准、产品类标准及认证流程四层结构,并结合5G设备与工业控制等实战案例,为工程师提供了从设计初期到认证测试的高效应用策略。

weixin_29294975的博客 355

奇异值、奇异值分解、奇异值表示什么物理意义?

矩阵的奇异值是一个数学意义上的概念,一般是由奇异值分解(Singular Value Decomposition,简称SVD分解)得到。如果要问奇异值表示什么物理意义,那么就必须考虑在不同的实际工程应用中奇异值所对应的含义。下面先尽量避开严格的数学符号推导,直观的从一张图片出发,让我们来看看奇异值代表什么意义。 这是一张照片,像素为高度450*宽度333。 我们都知道,图片实际上对应着一个矩阵,矩阵的大小就是像素大小,比如这张图对应的矩阵阶数就是450*333,矩阵上每个元素的数值对应着像素值.我们记这个.

Drug discovery 2万+

EtherCat 从站开发中遇到的问题分享

EtherCat从站 AX58100

yu_arius的博客 2058

机器学习入门:吴恩达机器学习(第八周)主成分分析法—对于奇异值分解(SVD)与PCA的思考(一)

吴恩达机器学习(第八周)主成分分析法—对于SVD与PCA的思考 相信很多基础薄弱的小伙伴在看了Ng男神的PCA章节时,对于奇异值分解(svd)一头雾水,更不清楚svd与主成分分析(PCA)有什么关联,是怎么做到降维的呢? 这里我就一步一步告诉大家 1.协方差矩阵 Ng使用如下协方差矩阵作为svd的输出: 那么协方差矩阵是什么呢? 通常,在提到协方差的时候,需要对其进一步...

wzn19930319的博客 561

Windows 10 本地硬盘变成了可弹出磁盘

今天新装了系统, 电脑是一个SSD+HHD, 没想到装好之后右下角显示可安全删除设备, 两个硬盘在那里. 这还得了. 查了一下午, 大致知道了是什么问题. Standard SATA AHCI controller使用高性能的硬盘模式就会把硬盘看作是一个可热插拔的存储器, 所以自然就会显示可弹出. 如果你的BIOS支持关闭HotSwap或者HotPlug, 那么直接关闭就可以了. 或者你直接在BIOS里把磁盘模式改为IDE, 不过这样就发挥不好你SSD的高性能了. 还有一种解决方法, 就是手动让系统把这两个

落日之城 4万+

基于YOLOv5与改进遗传算法的动态路径规划方法研究

摘要 本文提出一种融合YOLOv5目标检测与改进遗传算法的动态路径规划方法。通过YOLOv5实时感知环境中的动态和静态障碍物,将语义信息转化为栅格地图。针对传统遗传算法在路径规划中易早熟收敛、局部搜索能力差等问题,提出自适应初始化种群策略、动态变异算子及精英保留机制等改进方案。仿真结果表明,该方法在动态环境中能规划出更安全、平滑且长度更优的路径,具有更强的环境适应性和鲁棒性。 关键词:路径规划;YOLOv5;遗传算法;动态环境;目标检测

huanghm88的专栏 939

A与A'是否合同

今天看到高等代数书上有以前的笔记  A与A'合同(这里的A不一定是对称) ,但总是想不出来怎么证明对错,网上暂时也没找到方法。 暂时用SVD分解思考了一下,最后得到P^2=I。 作个记录,剩下的以后再想。 奇异值分解在差一个排列矩阵的情况下,是唯一确定的。

8rfuz的博客 876

124、LLC谐振变换器的矩阵变压器设计

摘要 本文分享了LLC谐振变换器中矩阵变压器的实战设计经验。针对大功率LLC单颗变压器的痛点(绕组层数多、散热不均、漏感一致性差),作者提出将大变压器拆分为多个小变压器单元(建议6个),通过原边串联、副边并联的方式实现功率分配。详细解析了磁芯选型、匝比计算、绕组结构、漏感控制和散热设计等关键参数,特别强调了小磁芯优势、等效匝比计算误区以及三明治绕法的重要性。文中还总结了调试过程中的谐振频率偏移和均流问题解决方案,并给出了矩阵数量选择、磁芯材质、绝缘材料等实用建议。作者指出,矩阵变压器在2kW以上LLC应用中

Jack010169的博客 170

用MATLAB学线性代数:从抽象定理到可视化直觉

线性代数中的矩阵、特征值、向量空间等概念,常因过于抽象而难以建立直观理解。而在工程与数据科学领域,线性代数正是支撑机器学习、数据分析等技术的底层语言。通过MATLAB这一计算工具,学习者可以将抽象的数学对象转化为可观察、可操作的实验:用矩阵乘法观察线性变换的几何效果,用特征值分解理解矩阵的结构,用奇异值分解(SVD)把握数据降维的本质,再通过最小二乘方法完成回归拟合。这种“先预测、后验证”的探索式学习路径,不仅能加深对定理的理解,还能自然衔接工程实践。本文从线性方程组求解切入,逐步展示如何用MATLAB验证

weixin_34337381的博客 912

医疗数据采集:Python爬虫爬取医学文献与药品信息(2026合规与伦理版)

医疗数据采集不同于爬取新闻或房价,它直接关系到人的生命健康和法律底线。技术层面:优先使用官方 API (PubMed E-utilities, BioThings),避免解析复杂HTML。法律层面:严守“不碰隐私、不破付费、不传谣言”三条红线。伦理层面:保持对生命的敬畏,确保数据的准确性和用途的正当性。在2026年,一个优秀的医疗数据工程师,不是那个能爬取最多数据的人,而是那个能在合规框架下,利用公开数据解决真实医疗问题的人。请务必珍视您的职业生涯和法律责任,切勿以身试法。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 284

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【机器学习】SVD奇异值分解

这里给出一篇非常好的博客,方便自己以后查看 感谢大佬,讲的简单易懂

UESTC_201722的博客 268

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【线性代数】通俗的理解奇异值以及与特征值的区别,还有奇异值分解及其应用

奇异值分解,就是把矩阵分成多个“分力”。奇异值的大小,就是各个“分力”的大小。 之前在介绍矩阵特征值与特征向量的时候,也是以运动作为类比。 一、通俗理解奇异值 1、翻绳 对于翻绳的这个花型而言,是由四只手完成的: 我们可以认为这个花型是由两个方向的力合成的: 容易想象,如果其中一个力(相比另外一个力而言)比较小的话,那么绳子的形状基本上由大的那个力来决定: 2、奇异值...

qq_32742009的博客 6万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SVD奇异值分解及PYTHON实现

SVD奇异值分解及PYTHON实现 什么是SVD 参考Mining of Massive Datasets Second Edition(译) 一个简单的SVD计算过程 1.准备进行奇异值分解的矩阵A: 2.计算: 3.求出A^TA的特征值和特征向量: 4.求出AA^T的特征值和特征向量: 5.计算出奇异值: 当然,我们也可以用 σi=√λi 直接求出奇异值为 √3 和 1。 (这里我...

pjs的博客 5425

(牛逼Plus)SVD奇异值分解

原文链接:https://blog.youkuaiyun.com/qq_32742009/article/details/82286434 奇异值分解,就是把矩阵分成多个“分力”。奇异值的大小,就是各个“分力”的大小。 之前在介绍矩阵特征值与特征向量的时候,也是以运动作为类比。 一、通俗理解奇异值 1、翻绳 对于翻绳的这个花型而言,是由四只手完

qq_43703185的博客 1175

基础算法-奇异值分解SVD

基础知识-8.0奇异值分解SVD

weixin_41175904的博客 1932

矩阵分解SVD原理

常用的经典矩阵分解算法: 经典算法PCA、SVD 主题模型算法LDA 概率矩阵分解PMF,由深度学习大牛Ruslan Salakhutdinov所写,主要应用于推荐系统中,在大规模的稀疏不平衡性Netflix数据集上取得较好的效果; 非负矩阵分解(No你negative MatrixFactor)NMF,由Lee和 Seung 在《Nature》上提出,应用于文本聚类; 1. 特征值、特征向...

code__online的博客 1万+

转载——奇异值SVD

奇异值分解,就是把矩阵分成多个“分力”。奇异值的大小,就是各个“分力”的大小。 之前在介绍矩阵特征值与特征向量的时候,也是以运动作为类比。 一、通俗理解奇异值 1、翻绳 对于翻绳的这个花型而言,是由四只手完成的: 我们可以认为这个花型是由两个方向的力合成的: 容易想象,如果其中一个力(相比另外一个力而言)比较小的话,那么绳子的形状基本上由大的那个力来决定: 2、奇异值分解与奇异值 类比于翻绳,我们可以认为: 奇异值分解,就是把矩阵分成多个“分力”。 奇异值的大小,就是各个“分力”的大小。 2.

qq_45785407的博客 1269

SVD专题2 线性映射的奇异值分解——矩阵形式的推导

本文目录SVD专题2 线性映射的奇异值分解——矩阵形式的推导前言 Preface预备知识 Prerequisite2.1 秩-零定理 Rank-Nullity Theorem2.2 最核心的四个子空间本节前言(可忽略不看,不影响主线论述)2.2.1 由秩零定理引发的思考和疑问2.2.2 标准内积与共轭映射 Adjoint2.2.3 映射最清晰的表示?2.3 A∗AA^*AA∗A 和 AA∗AA^*AA∗ 有数量相同且相等的非零特征值2.3.1 回顾算子谱定理2.3.2 对 A∗AA^*AA∗A 谱分解2.3

blog 1253

svd奇异值分解_一文读懂机器学习中奇异值分解SVD

点击上方“计算机视觉life”,选择“星标”快速获得最新干货目录:矩阵分解1.1 矩阵分解作用1.2 矩阵分解的方法一文读懂机器学习中奇异值分解SVD1.3 推荐学习的经典矩阵分解算法SVD具体介绍2.1 特征值、特征向量、特征值分解2.2 SVD分解2.3 SVD分解的应用1. 矩阵分解1.1 矩阵分解作用矩阵填充(通过矩阵分解来填充原有矩阵,例如协同过滤的ALS算法就是填充原有矩阵)...

weixin_39687301的博客 261

机器学习数学基础之三奇异值分解(SVD)

奇异值分解(Singular Value Decomposition,SVD) 引入 在上一节中我们回顾了矩阵的特征分解,但是特征分解只能对方阵进行(当然有的方阵可能也无法进行特征分解),那对于任意的一个矩阵 A∈Rm×nA\in{R^{m\times{n}}}A∈Rm×n 是否也能进行矩阵分解呢?答案是肯定的,那就是本节我们要介绍的奇异值分解(SVD)。 在正式介绍SVD之前,我们先来思考一下: y⃗=Ax⃗\vec{y}=A\vec{x}y​=Ax 代表什么意义?我们可以认为,矩阵 AAA 代表了一种线

琢光的博客 424

奇异值矩阵分解(Singular Value Decomposition)的一些感想

最近的大半年一直在和矩阵分解和数值运算打交道。主要是核心算法里用到了许多矩阵分解的东西,学习的过程很艰辛,走了很多弯路,本文全当一个记录,记录学习过程的一些思考,以及一部分自己的见解。 本文主要分为五部分,在目录中有介绍,正文部分写的比较凌乱,因为记录了自己思考的整个过程。好在SVD的学习曲线不算非常陡峭,因而可以充分的边学边思考,许多算法在建立之后都会划归为矩

飞奔的火焰的专栏 1万+
上一篇: 用scikit-learn学习K-Means聚类
下一篇: 深入浅出EM算法
相国大人
博客等级 码龄10年 1009粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值