「基础」奇异值分解的原理与应用( 二 )
文章插图
根据 SVD 重建矩阵
原始矩阵可以根据 U、Sigma 和 V^T 元素重建出来 。
svd 返回的 U、s 和 V 元素不能直接相乘 。
s 向量必须使用 diag 函数转换成对角矩阵 。 默认情况下 , 这个函数将创建一个相对于原来矩阵的 m×m 的方形矩阵 。 这是有问题的 , 因为该矩阵的尺寸并不符合矩阵乘法的规则 , 即一个矩阵的列数必须等于后一个矩阵的行数 。
在创建了方形的 Sigma 对角矩阵之后 , 各个矩阵的大小与我们分解的原始 n×m 矩阵是相关的 , 如下:
文章插图
而事实上我们需要:
文章插图
我们可以通过创建一个全是 0 值的 m×n 的新 Sigma 矩阵(比如:更多行)并使用通过 diag 计算得到的方形对角矩阵来填充矩阵的前 n×n 部分 。
文章插图
运行这个示例 , 首先会显示原始矩阵 , 然后会显示根据 SVD 元素重建的矩阵 。
文章插图
上面使用 Sigma 对角矩阵的复杂之处仅存在于 m 和 n 不相等的情况中 。 当重建一个方形矩阵时 , 其对角矩阵可以直接使用 , 如下 。
文章插图
运行这个示例会显示原来的 3×3 矩阵和根据 SVD 元素直接重建的版本 。
文章插图
用于伪逆的 SVD
伪逆(pseudoinverse)是将方形矩阵的矩阵求逆泛化应用到行数和列数不相等的矩形矩阵上 。 这也被称为广义逆(Generalized Inverse)或摩尔-彭若斯逆(Moore-Penrose Inverse) , 得名于两位独立发现该方法的研究者 。
矩阵求逆不是为非方形矩阵定义的 。 [...] 当 A 的列数大于行数时 , 那么使用伪逆求解线性方程是众多解决方案中的一种 。
——《Deep Learning》 , 2016 年 , 第 46 页
伪逆表示为 A^+ , 其中 A 是被求逆的矩阵 , + 是上标 。
伪逆是使用 A 的奇异值分解计算的:
文章插图
或者 , 没有点符号:
文章插图
其中 A^+ 是 A 的伪逆 , D^+ 是对角矩阵 Sigma 的伪逆 , U^T 是 U 的转置 。
我们可以根据 SVD 运算得到 U 和 V 。
文章插图
根据 Sigma 创建一个对角矩阵 , 计算 Sigma 中每个非零元素的倒数 , 然后如果原始矩阵是矩形的就取其转置 , 就可以计算得到 D^+ 。
文章插图
伪逆提供了一种求解线性回归方程的方法 , 尤其是当行数多于列数时 , 而这也是很常见的情况 。
NumPy 提供了函数 pinv 来计算矩形矩阵的伪逆 。
下面的示例定义了一个 4×2 的矩阵并计算了其伪逆 。
文章插图
- Java基础知识回顾,还记得吗?
- 零基础小白入门必看篇:学习Python之面对对象基础
- 大数据专业大一新生,只有数学等基础课程,还可以自学哪些内容
- 学习大数据需要具备哪些基础知识,以及应该重视哪些环节
- Linux基础入门vim常用命令详解
- 0基础大数据学习——加米谷大数据开发就业班开新班啦
- 瑞萨电子推出面向物联网基础设施系统的第二代多相数字控制器和智能功率级单元模块(SPS)
- 零基础想学好编程!C语言最难啃的3块硬骨头,你全吃透了吗?
- PyQt5基础开发(6)
- 菜鸟谈VBA最基础入门