Python机器学习笔记:奇异值分解(SVD)算法

如果点击有误:https://github.com/LeBron-Jian/MachineLearningNote

奇异值分解(Singular Value Decomposition,后面简称 SVD)是在线性代数中一种重要的矩阵分解,它不光可用在降维算法中(例如PCA算法)的特征分解,还可以用于推荐系统,以及自然语言处理等领域,在机器学习,信号处理,统计学等领域中有重要应用。

比如之前的学习的PCA,掌握了SVD原理后再去看PCA是非常简单的,因为我最近在整理学习线性代数基础,并温习了一遍特征值与特征向量,所以这里同时也温习一下SVD算法,如果想看我之前的PCA降维的文章,可以参考下面:

Python机器学习笔记:主成分分析(PCA)算法
Python机器学习笔记:使用scikit-learn工具进行PCA降维
  好了,话不多说,这里再对SVD算法做一个总结(这里总结主线是参考刘建平大佬和老师的网课视频学习,首先在这里提出感谢)

1,基变换与特征值分解
1.1 向量的表示与基变换
  首先看看向量,向量可以表示为(3, 2),实际上表示线性组合:

基表示:(1, 0) 和 (0, 1) 叫做二维空间中的一组基。

一组基就确定了对向量进行表示的空间,而向量的表示就是基于这组基进行坐标表示。选定的基不同,空间自然不同,那么向量表示的坐标自然也不同。一般情况下,我们会默认传统的正交坐标系为标准的基选择,但其实对传统正交坐标系进行选择,放缩或剪切变换后得到的依然是一个坐标系。

基变换:数据与一个基做内积运算,结果作为第一个新的坐标分量,然后与第二个基做内积运算,结果作为第二个新坐标的分量。

将一组基A下的坐标转换成另一组集B下的坐标——核心思想就是将A中的基用B对应的坐标系进行表示,将该向量在A下的坐标表示变换成关于基A的线性组合,进行代换即可。

数据(3, 2)映射到基中坐标为:

1.2 特征值分解
  首先回归下特征值和特征向量的定义,其定义如下:

其中A是一个 n * n 的矩阵,x 是一个 n 维向量,则我们说 λ 是矩阵A的一个特征值,而 x 是矩阵A的特征值 λ 所对应的特征向量。

求出特征值和特征向量有什么好处呢?就是我们可以将矩阵 A 特征分解。如果我们求出了矩阵 A 的 n 个特征值 λ1 <= λ2 <= λn ,以及这 n 个特征值所对应的特征向量 {W1, W2, …Wn},如果这 n 个特征向量线性无关,那么矩阵 A 就可以用下式的特征分解表示:

其中 W 是这 n 个特征向量所长成的 n * n 维矩阵,而 Σ 为这个 n 个特征值为主对角线的 n * n 维矩阵。

一般我们会把 W 的这 n 个特征向量标准化,即满足 ||wi||2 = 1,或者说 wiTwi=1,此时 W 的 n 个特向量为标准正交基,满足WTW = I,即 WT = W-1。

这样我们特征分解表达式可以写成:

注意到要进行特征分解,矩阵A必须为方阵。那么如果A不是方阵,即行和列不相同时,我们还可以对矩阵进行分解吗?答案是可以,就是下面我们要学习的SVD算法。

2,特征分解和奇异值分解(SVD)的区别
  特征值分解和奇异值分解的目的都是一样,就是提取出一个矩阵最重要的特征。

所有的矩阵都可以进行奇异值分解,但只有方阵才可以进行特征值分解。当所给的矩阵是对称的方阵,AT=A,二者的结果是相同的。也就是说对称矩阵的特征值分解是所有奇异值分解的一个特例。但是二者还是存在一些小的差异,奇异值分解需要对奇异值进行从大到小的排序,而且全部是大于等于零。

对于如上的奇异值分解公式,我们可以看到奇异值分解同时包含了旋转,缩放和投影三种作用,并且U和V都起到了对A进行旋转的作用,而 Σ 起到了对 A 缩放的作用,特征值分解只有缩放的效果。

在应用上,奇异值分解主要用于数据矩阵,而特征值分解主要用于方型的相关矩阵。

3, 奇异值分解的定义
  特征值分解释一个提取矩阵特征很不错的方法,但是它只适用于方阵,而在现实的世界中,我们看到的大部分矩阵都不是方阵,比如说有M个学生,每个学生有N个成绩,这样就形成了一个M*N的矩阵就可能不是方阵了,我们怎么样才能像描述特征值一样描述这样一般矩阵的重要特征呢?奇异值分解就是干这个事情,奇异值分解是一个能适用于任何的矩阵的一种分解的方法。

3.1 SVD的理论描述
  假设 A 是一个 m*n 阶矩阵,其中的元素全部属于域 K,也就是实数域或复数域。如此则存在一个分解使得:

其中 U 是 mm 阶酋矩阵,Σ 是半正定 mn 阶对角矩阵,而 V* 是V的共轭转置,是 n*n 阶酋矩阵,这样的分解就称作 M 的奇异值分解。Σ(是对角矩阵,但不一定是方阵) 对角线上的元素 Σi 即为 M 的奇异值。

一般的 Σ 有如下形式:

上述分解中会构建出一个矩阵 Σ ,该矩阵只有对角元素,其他元素均为0,另一个惯例是,Σ 的对角元素是从大到小排列的。这些对角元素称为奇异值。在科学和工程中,一直存在这个一个普遍事实:在某个奇异值的数目(r个)之后,其他奇异值都置为零,这就意味着数据集中仅有 r 个重要特征,其余的都是噪声或冗余数据。

从下图可以形象的看出上面SVD的定义:

那么我们如何求出SVD分解后的 U,Σ,V 这三个矩阵呢?

如果我们将 A 的转置和 A 做矩阵乘法,那么会得到 n*n 的一个方阵 ATA。既然 ATA 是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下式:

这样我们就可以得到矩阵 ATA 的 n 个特征值和对应的 n 个特征向量 v 了。将 ATA 的所有特征向量张成一个 n*n 的矩阵 V,就是我们SVD公式里面的V矩阵了。一般我们将 V 中的每个特征向量叫做 A 的右奇异向量。

如果我们将 A 和 A 的转置做矩阵乘法,那么会得到 m*m的一个方阵 AAT。 既然 AAT 是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下面公式:

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

U 和 V 我们都求出来了,现在就剩下 奇异值矩阵 Σ 没有求出了。

由于 Σ 除了对角线上是奇异值其他位置都是0,所以我们只需要求出每个奇异值 σ 就可以了。

我们注意到:

这样我们可以求出我们的每一个奇异值,进而求出奇异值矩阵 Σ。

上面还有一个问题就是我们说 ATA 的特征向量组成的就是我们SVD中的 V矩阵,而 AAT的特征向量组成的就是我们 SVD中的 U矩阵,这有什么根据吗?这个其实很容易证明,我们以V矩阵的证明为例:

上式证明使用了:UTU = I, ΣTΣ = Σ2。可以看出 ATA 的特征向量组成的的确就是我们SVD中的 V 矩阵。类似的方法可以得到 AAT 的特征向量组成的就是我们 SVD中的 U 矩阵。

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

这样也就是说,我们可以不用上面推导的式子来计算奇异值,上式如下:

我们可以直接通过求 ATA 的特征值取平方根来求奇异值。

注意1:通过ATA的特征值取平方根求解奇异值的注意点

我们知道,正常求 U,V,Σ 不便求,所以,我们利用如下性质(公式上面有提到,这里再复述一下):

需要注意的是:这里的 ΣΣT 和 ΣTΣ 在矩阵的角度上来讲,他们是不相等的,因为他们的维度不同 ΣΣT €Rmm,而 ΣTΣ€Rnn ,但是他们在主对角线的奇异值是相等的,即有:

所以对于 ΣΣT 和 ΣTΣ 中的特征值开方,可以得到所有的奇异值。

注意2:酋矩阵的定义

若n行n列的复数矩阵 U满足:

其中 In 为 n 阶单位矩阵,UT 为 U的共轭转置,则U为酋矩阵(即矩阵U为酋矩阵,当且仅当其共轭转置UT 为其逆矩阵:U-1 = UT)

3.2 SVD的几何层面理解
  下面从几何层面上去理解二维的SVD:对于任意的 2*2 矩阵,通过 SVD 可以将一个互相垂直的网络(orthogonal grid)变换到另外一个互相垂直的网络。

我们可以通过向量的方式来描述这个事实:首先,选择两个互相正交的单位向量 v1 和 v2,向量 Mv1 和 Mv2 正交。

u1 和 u2 分别表示 Mv1 和 Mv2 的单位向量,σ1u1=Mv1 和 σ2u2=Mv2,σ1 和 σ2分别表示这不同方向向量上的模,也称为作为矩阵 M 的奇异值。

这样就有了如下关系式:

我们现在可以简单描述下经过 M 线性变换后的向量 x 的表达形式。由于向量 v1 和 v2 是正交的单位向量,我们可以得到如下式子:

这就意味着:

向量内积可以用向量的转置来标色,如下所示:

你可能感兴趣的:(ios)