参考文章
【1】https://zhuanlan.zhihu.com/p/37038542
【2】https://blog.csdn.net/qq_35865125/article/details/79555455
1.特征值、特征向量、特征值分解
特征值分解和奇异值分解都是矩阵分解算法,二者的目的都是提取一个矩阵最重要的特征。
1.1特征值和特征向量
如果一个向量v是矩阵A的特征向量,则一定可以表示为如下形式
其中,λ是特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。
思考:为什么一个向量和一个数相乘的效果与一个矩阵和一个向量相乘的效果是一样的呢?
答案:矩阵A与向量v相乘,本质上是对向量v进行了一次线性变换(旋转或拉伸),而该变换的效果为常数λ乘以向量v。当我们求特征值与特征向量的时候,就是为了求矩阵A能使哪些向量(特征向量)只发生伸缩变换,而变换的程度可以用特征值λ表示。
1.1.1 特征值和特征向量的几何意义
一个矩阵其实就是一个线性变换。一个矩阵乘一个向量后得到的向量,相当于对这个向量进行了线性变换。
如
对应的线性变换如图2所示:
因为这个矩阵M乘以一个向量(x,y)的结果是:
上面的矩阵是对称的,所以这个变换是一个对x、y轴的方向一个拉伸变换(每一个对角线上的元素将会对一个维度进行拉伸变换,当值大于1时是拉伸,当值小于1时是缩短),如图2所示。当矩阵不是对称的时候,假如说矩阵是下面的样子:
它所描述的变换是下面的样子:
这其实是在平面上对一个轴进行的拉伸变换,如图3蓝色的箭头所示,蓝色的箭头是一个最主要的变换方向(变换的方向可能不止一个)。如果想要描述好一个变换,那我们就需要描述好这个变换主要的变化方向。
1.1.2 特征值分解
对于矩阵A,有一组特征向量v,将这组向量进行正交化单位化,就能得到一组正交单位向量。特征值分解,就是将矩阵A分解为如下形式:
其中,Q是矩阵A的特征向量组成的矩阵,
分解得到的Σ矩阵是一个对角矩阵,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变换方向(从主要的变化到次要的变化排列)。
当矩阵是高维的情况下,这个矩阵就是高维空间下的一个线性变换。这个变换也同样有许多变换方向,通过特征值分解得到的前N个特征向量,就对应了这个矩阵主要的N个变化方向。就可以近似这个矩阵(变换),也就是提取这个矩阵最重要的特征。
总结一下,特征值分解可以得到特征值和特征向量,特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么。可以将每一个特征向量理解为一个线性的子空间,可以利用这些线性的子空间干很多事情。不过,特征值分解也有很多局限,比如变换的矩阵必须是方针。
1.1.3 特征值分解例子
这里我们用一个简单的方阵来说明特征值分解的步骤。我们的方阵A定义为:
首先,由方阵A的特征方程,求出特征值。
(重数是2)。
然后,把每个特征值λ带入线性方程组,求出特征向量。
当λ=2时,解线性方程组最后,方阵A的特征值分解为:
2. 奇异值
特征值分解是提取矩阵特征的一个不错方法,但是它只是对于方阵而言。在现实中,大部分矩阵都是不是方阵,比如有N个学生,M科成绩,形成的N*M矩阵就不是方阵。奇异值分解就是一个能适用于任意矩阵分解的一种方法。
假设A是一个N * M的矩阵,那么得到的U是一个M * M的方阵(里面的向量是正交的,U里面的向量称为左奇异向量),Σ是一个N * M的矩阵(除了对角线的元素都是0,对角线上的元素称为奇异值),V’(V的转置)是一个N * N的矩阵,里面的向量也是正交的,V里面的向量称为右奇异向量),从图片来反映几个相乘的矩阵的大小可得下面的图片
2.1 奇异值分解
那么奇异值和特征值是怎么对应起来的呢?首先,将一个矩阵A的转置*A,将会得到一个方阵,利用这个方阵求解特征值可以得到:
这里的v就是上式的右奇异向量。
其次,我们将A和A的转置做矩阵的乘法,得到一个方阵,用这样的方阵进行特征分解,得到的特征和特征向量满足下面的等式:
这里的u就是左奇异向量。
思考:上面我们说ATA的特征向量组成的矩阵就是我们SVD中的V矩阵,而 AAT的特征向量组成的就是我们SVD中的U矩阵,这有什么根据么?我们来证明一下,以V矩阵的证明为例。
上式证明中使用了
对于正交矩阵,有A−1=AT ,这里U和V都是正交矩阵
可以看出,ATA的特征向量组成的矩阵就是我们SVD中的V矩阵,而AAT的特征向量组成的就是我们SVD中的U矩阵。
此外还可以得到奇异值,奇异值的求法有两种:
a)
b)通过上面的证明,可以看出,特征值矩阵等于奇异值矩阵的平方,也就是说特征值和奇异值满足如下关系:
这里的σ就是上面说的奇异值,奇异值σ跟特征值类似,在矩阵Σ中也是从大到小排列。
奇异值σ在矩阵Σ中也是从大到小排列,而且σ的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,剩下的90%甚至99%的奇异值几乎没有什么作用。因此,我们可以用前面r个大的奇异值来近似描述矩阵,于是奇异值分解公式可以写成如下:
r是一个远小于m、n的数,这样矩阵的乘法看起来像是下面的样子:
右边的三个矩阵相乘的结果将会是一个接近于A的矩阵,在这儿,r越接近于n,则相乘的结果越接近于A。而这三个矩阵的面积之和(在存储观点来说,矩阵面积越小,存储量就越小)要远远小于原始的矩阵A,我们如果想要压缩空间来表示原矩阵A,我们存下这里的三个矩阵:U、Σ、V就好了。
2.2 奇异值的计算举例
矩阵A定义为:
首先求出ATA和AAT:
然后求出ATA和AAT的特征向量:
ATA的特征值和特征向量:
AAT的特征值和特征向量:
其次,利用
求奇异值:
当然,这一步也可以用
和1。
最后,我们得到A的奇异值分解为:
总结
奇异值分解将矩阵分解为奇异值和奇异向量
A是一个m * n的矩阵,U是m * m的矩阵,D是m * n的矩阵,V是n * n的矩阵。
矩阵D对角元素上的值称为A的奇异值,U的列向量称为左奇异向量,V的列向量称为右奇异向量。
左奇异向量是AAT的特征向量,右奇异向量是ATA(协方差矩阵)的特征向量,A的非零奇异值是AAT和ATA特征值的平方根。
2.3 SVD在推荐系统中的应用
假设有一个评分矩阵A
A =
5 5 0 5
5 0 3 4
3 4 0 3
0 0 5 3
5 4 4 5
5 4 5 5
使用matlab调用svd函数后
[U,S,Vtranspose]=svd(A)
U =
-0.4472 -0.5373 -0.0064 -0.5037 -0.3857 -0.3298
-0.3586 0.2461 0.8622 -0.1458 0.0780 0.2002
-0.2925 -0.4033 -0.2275 -0.1038 0.4360 0.7065
-0.2078 0.6700 -0.3951 -0.5888 0.0260 0.0667
-0.5099 0.0597 -0.1097 0.2869 0.5946 -0.5371
-0.5316 0.1887 -0.1914 0.5341 -0.5485 0.2429
S =
17.7139 0 0 0
0 6.3917 0 0
0 0 3.0980 0
0 0 0 1.3290
0 0 0 0
0 0 0 0
Vtranspose =
-0.5710 -0.2228 0.6749 0.4109
-0.4275 -0.5172 -0.6929 0.2637
-0.3846 0.8246 -0.2532 0.3286
-0.5859 0.0532 0.0140 -0.8085
S是一个对角矩阵,对角线上每个元素非负且依次减小,从几何意义上来说,此值和特征向量中的特征值的权重有关,所以可以去S对角线上前K个非0元素。
当k=2时,将S(6 * 4)降维成S(2 * 2).
同时U(6 * 6)变为U(6 * 2),V(4 * 4)变为V(4 * 2)。
用降维后的U,S,V相乘得到A2:
A2 =
5.2885 5.1627 0.2149 4.4591
3.2768 1.9021 3.7400 3.8058
3.5324 3.5479 -0.1332 2.8984
1.1475 -0.6417 4.9472 2.3846
5.0727 3.6640 3.7887 5.3130
5.1086 3.4019 4.6166 5.5822
此时我们可以很直观地看出,A2和A很接近----有损压缩。
既然两者很接近,那么我们就可以利用压缩后的数据来进行相似性分析啦:
将降维后的U的第一列当成x值,第二列当成y值,即U的每一行作为一个数据点画在图中;
类似地,将降维后(Vtranspose)'的每一列作为一个数据点画在图中:
之所以这样,是因为降维后U中的各个行之间的相似性 可以近似代表 原始矩阵A中各个行(each user)之间的相似性;
降维后(Vtranspose)'中的各个列之间的相似性 可以近似代表 原始矩阵A中各个列(each item)之间的相似性;
从纯数学上可以这样理解:
A = USV ---> (US) * V = A,所以A中的第i列 是由V中的第i列变换而来的!
A = USV ---> U * (SV) = A,所以A中的第i行 是由U中的第i行变换而来的!