第15章 奇异值分解
习题15.1
试求矩阵
的奇异值分解。
解答:
解答思路:
- 给出奇异值分解的定义
- 给出奇异值分解的步骤
- 使用
numpy实现奇异值分解 - 自编程实现奇异值分解
- 推导计算奇异值分解
解答步骤:
第1步:奇异值分解
根据书中第15.1节的奇异值分解的定义:
定义15.1(奇异值分解) 矩阵的奇异值分解是指,将一个非零的
实矩阵 , ,表示为以下三个实矩阵乘积形式的运算,即进行矩阵的因子分解: 其中
是 阶正交矩阵, 是 阶正交矩阵, 是由降序排列的非负的对角线元素组成的 矩形对角矩阵,
称为矩阵 的奇异值分解, 称为矩阵 的奇异值, 的列向量称为左奇异向量, 的列向量称为右奇异向量。
第2步:奇异值分解的一般步骤
根据书中第15.2节的奇异值分解的计算:
给定
矩阵 ,可以写出矩阵奇异值分解的计算过程。
(1)求的特征值和特征向量。
计算对称矩阵。
求解特征方程得到特征值
,并将特征值由大到小排列 将特征值
代入特征方程求得对应的特征向量。
(2)求阶正交矩阵
将特征向量单位化,得到单位特征向量,构成 阶正交矩阵 (3)求
对角矩阵
计算的奇异值 构造
矩形对角矩阵 ,主对角线元素是奇异值,其余元素是零 (4)求
阶正交矩阵
对的前 个正奇异值,令 得到
求
的零空间的一组标准正交基 ,令 并令
(5)得到奇异值分解
第3步:使用numpy实现奇异值分解
import numpy as np
A = np.array([[1, 2, 0],
[2, 0, 2]])
# 调用numpy的svd方法
U, S, V = np.linalg.svd(A)
# 设置精度为2
np.set_printoptions(precision=2, suppress=True)
print("U=", U)
print("S=", S)
print("V=", V.T)
Sigma = np.zeros_like(A, float)
np.fill_diagonal(Sigma, S)
calc = np.dot(np.dot(U, Sigma), V)
print("A=", calc)U= [[ 0.45 0.89]
[ 0.89 -0.45]]
S= [3. 2.]
V= [[ 0.75 -0. -0.67]
[ 0.3 0.89 0.33]
[ 0.6 -0.45 0.67]]
A= [[ 1. 2. 0.]
[ 2. -0. 2.]]
第4步:自编程实现奇异值分解
import numpy as np
from scipy.linalg import null_space
def my_svd(A):
m = A.shape[0]
# (1) 计算对称矩阵 A^T A 的特征值与特征向量,
W = np.dot(A.T, A)
# 返回的特征值lambda_value是升序的,特征向量V是单位化的特征向量
lambda_value, V = np.linalg.eigh(W)
# 并按特征值从大到小排列
lambda_value = lambda_value[::-1]
lambda_value = lambda_value[lambda_value > 0]
# (2)计算n阶正价矩阵V
V = V[:, -1::-1]
# (3) 求 m * n 对角矩阵
sigma = np.sqrt(lambda_value)
S = np.diag(sigma) @ np.eye(*A.shape)
# (4.1) 求A的前r个正奇异值
r = np.linalg.matrix_rank(A)
U1 = np.hstack([(np.dot(A, V[:, i]) / sigma[i])[:, np.newaxis] for i in range(r)])
# (4.2) 求A^T的零空间的一组标准正交基
U = U1
if r < m:
U2 = null_space(A.T)
U2 = U2[:, r:]
U = np.hstack([U, U2])
return U, S, VA = np.array([[1, 2, 0],
[2, 0, 2]])
np.set_printoptions(precision=2, suppress=True)
U, S, V = my_svd(A)
print("U=", U)
print("S=", S)
print("V=", V)
calc = np.dot(np.dot(U, S), V.T)
print("A=", calc)U= [[-0.45 -0.89]
[-0.89 0.45]]
S= [[3. 0. 0.]
[0. 2. 0.]]
V= [[-0.75 -0. -0.67]
[-0.3 -0.89 0.33]
[-0.6 0.45 0.67]]
A= [[ 1. 2. -0.]
[ 2. -0. 2.]]
第5步:推导计算奇异值分解
- 求解
的特征值和特征向量
计算对称矩阵
特征值和特征向量满足方程
得到齐次方程组
该方程组有非零解的充要条件是
解得矩阵
特征值代入对应的齐次方程组,得到对应的单位特征向量 (特征向量的选取不唯一):
- 求正交矩阵
构造正交矩阵
- 求解对角矩阵
构造对角矩阵
- 求正交矩阵
基于
构造正交矩阵
- 矩阵
的奇异值分解
习题15.2
试求矩阵
的奇异值分解并写出其外积展开式。
解答:
解答思路:
- 给出矩阵的外积展开式定义
- 使用
numpy计算矩阵的奇异值分解 - 根据奇异值分解的结果,写出外积展开式
解答步骤:
第1步:矩阵
根据书中第15.3.3节的矩阵的外积展开式:
矩阵
的奇异值分解 也可以由外积形式表示。事实上,若将 的奇异值分解看成矩阵 和 的乘积,将 按列向量分块,将 按行向量分块,即得 则
称为矩阵
的外积展开式,其中 为 矩阵,是列向量 和行向量 的外积,其第 行第 列元素为 的第 个元素与 的第 个元素的乘积。即
的外积展开式也可以写成下面的形式 其中
是 矩阵。上式将矩阵 分解为矩阵的有序加权和。
根据书中第14章的本章概要中的外积展开式:
任意一个实矩阵
可以由其外积展开式表示 其中
为 矩阵,是列向量 和行向量 的外积, 为奇异值, 通过矩阵 的奇异值分解得到。
第2步:计算矩阵
import numpy as np
A = np.array([[2, 4],
[1, 3],
[0, 0],
[0, 0]])
# 调用numpy的svd方法
U, S, V = np.linalg.svd(A)
np.set_printoptions()
print("U=", U)
print("S=", S)
print("V=", V.T)U= [[-0.82 -0.58 0. 0. ]
[-0.58 0.82 0. 0. ]
[ 0. 0. 1. 0. ]
[ 0. 0. 0. 1. ]]
S= [5.46 0.37]
V= [[-0.4 -0.91]
[-0.91 0.4 ]]
第3步:根据奇异值分解的结果,写出外积展开式
矩阵
其中
calc = S[0] * np.outer(U[:, 0], V[:, 0]) + S[1] * np.outer(U[:, 1], V[:, 1])
print("A=", calc)A= [[ 2. 4.]
[ 1. 3.]
[-0. 0.]
[-0. 0.]]
习题15.3
比较矩阵的奇异值分解与对称矩阵的对角化的异同。
解答:
解答思路:
- 给出矩阵的奇异值分解的定义
- 给出对称矩阵和方阵的对角化定义
- 比较两者的相同点
- 比较两者的不同点
解答步骤:
注意: 与书中一致,不考虑复数矩阵。
第1步:矩阵的奇异值分解的定义:
矩阵的奇异值分解定义,详见书中第271页的定义15.1(奇异值分解)
第2步:对称矩阵和方阵对角化定义;
根据《实对称矩阵对角化教学的应用案例》(张丽静、刘白羽、申亚男,2019)对称矩阵的对角化:
设
为 阶实对称矩阵,则存在一个正交矩阵 ,使得 其中,
为对角元素是 的特征值 所构成的对角矩阵; 为特征值 对应的单位特征向量。
根据参考资料:https://www.matongxue.com/parts/4628 中关于方阵的对角化:
如果
阶方阵 有 个线性无关的特征向量 ,那么如下矩阵: 可以使得:$ A = P \Lambda P^{-1}
\Lambda \Lambda = \text{diag} { \lambda_1, \lambda_2, \cdots, \lambda_n }$,特征值 为特征向量 对应的特征值,该过程为对角化(Diagonalizable)。
第3步:两者的相同点
- 两者都可以实现特征分解,都需要求解特征值与特征向量
- 实对称矩阵的对角化是方阵对角化的特例,矩阵奇异值分解又是方阵对角化的推广
- 实对称矩阵一定可以对角化,矩阵的奇异值分解也一定存在
- 都可以被正交矩阵对角化
- 本质上都是用不同的基来描述线性变化
第4步:两者的不同点
- 矩阵对角化要求矩阵
是一个方阵,矩阵奇异值分解不需要对矩阵 有特殊要求 - 奇异值分解中要求对角元素降序排列,对称矩阵的对角化没有这一要求
习题15.4
证明任何一个秩为1的矩阵可以写成两个向量的外积形式,并给出实例。
解答:
解答思路:
- 假设矩阵
的秩为1,写出其奇异值分解形式 - 将奇异值分解的矩阵
写成外积形式 - 将矩阵
的奇异值分解写成外积形式 - 给出实例
解答步骤:
第1步:假设矩阵
设矩阵
根据书中第15章的定理15.1的奇异值分解基本定理:
定理15.1(奇异值分解基本定理) 若
为一 实矩阵, ,则 的奇异值分解存在 其中
是 阶正交矩阵, 是 阶正交矩阵, 是 矩形对角矩阵,其对角线元素非负,且按降序排列。
则存在矩阵
第2步:将奇异值分解的矩阵
根据矩阵
根据奇异值分解基本定理,对角矩阵
其中,
设两向量
第3步:将矩阵
将式(2)代入式(1)中可得:
其中,
所以,矩阵
第4步:给出实例
使用书中第283页例15.5的矩阵
可知:
所以,
习题15.5
搜索中的点击数据记录用户搜索时提交的查询语句,点击的网页URL以及点击的次数构成一个二部图,其中一个结点集合
解答:
解答思路:
- 根据二部图写出矩阵
- 计算矩阵
的奇异值分解 - 解释奇异值分解得到的矩阵
代表的内容
解答步骤:
第1步:根据二部图写出矩阵
其中,行向量分别对应
第2步:对矩阵
import numpy as np
A = np.array([[0, 20, 5, 0, 0],
[10, 0, 0, 3, 0],
[0, 0, 0, 0, 1],
[0, 0, 1, 0, 0]])
# 调用numpy的svd方法
U, S, V = np.linalg.svd(A)
print("U=", U)
print("S=", S)
print("V=", V.T)U= [[ 1. -0. 0. -0.01]
[ 0. 1. 0. -0. ]
[ 0. 0. 1. 0. ]
[ 0.01 0. 0. 1. ]]
S= [20.62 10.44 1. 0.97]
V= [[ 0. 0.96 -0. -0. 0.29]
[ 0.97 -0. -0. -0.24 -0. ]
[ 0.24 0. 0. 0.97 0. ]
[ 0. 0.29 0. 0. -0.96]
[ 0. 0. 1. 0. 0. ]]
第3步:解释奇异值分解得到的矩阵
根据题意,可知搜索中的点击数据记录用户搜索时提交的查询语句为
表示用户输入的查询语句与网页特征之间的关系矩阵 表示网页与网页特征之间的相似性 表示用户输入的查询语句映射到网页的权重
举个例子:从矩阵
奇异值分解的另一个作用就是提取网页的特征来将用户输入与网页映射到一个低纬度空间中。通过第2步的计算,可以发现
参考文献
【1】张丽静、刘白羽、申亚男. 实对称矩阵对角化教学的应用案例[C]. 大学数学,2019,35(2):116-121
【2】方阵的对角化:https://www.matongxue.com/parts/4628
