奇异值分解是一种将矩阵分解为三个矩阵的方法,它通过将矩阵分解为三个矩阵,来得到矩阵的奇异值和奇异向量。其数学表达式为:
其中,
是输入矩阵,
是左奇异向量,
是奇异值,
是右奇异向量。
通过
的维度选择,可以实现矩阵的降维。
Jacobi方法是一种计算奇异值分解的方法,常用于小矩阵,其具体步骤如下:
1. 初始化矩阵
- 创建一个与输入矩阵
相关的矩阵
和
。
- 数学表达式为:
2. 计算旋转角度
- 计算旋转角度
。
- 数学表达式为:
更一般地说,Jacobi方法的计算公式为:
3. 计算旋转矩阵
- 计算旋转矩阵
。
- 数学表达式为:
4. 计算旋转后的矩阵
- 计算旋转后的矩阵
。
- 数学表达式为:
5. 更新矩阵
- 更新矩阵
。
- 数学表达式为:
6. 计算奇异值
- 计算奇异值
。
- 数学表达式为:
7. 计算右奇异向量矩阵
。
- 数学表达式为:
8. 计算奇异值矩阵
。
- 数学表达式为:
9. 计算左奇异向量矩阵
- 计算左奇异向量矩阵
。
- 数学表达式为:
标准代码如下
def svd_2x2_singular_values(A):
a = A
a_t = np.transpose(a)
a_2 = a_t @ a
v = np.eye(2)
for _ in range(1):
if a_2[0,0] == a_2[1,1]:
theta = np.pi/4
else:
theta = 0.5 * np.arctan2(2 * a_2[0,1], a_2[0,0] - a_2[1,1])
r = np.array(
[
[np.cos(theta), -np.sin(theta)],
[np.sin(theta), np.cos(theta)]
]
)
d = np.transpose(r) @ a_2 @ r
a_2 = d
v = v @ r
s = np.sqrt([d[0,0], d[1,1]])
s_inv = np.array([[1/s[0], 0], [0, 1/s[1]]])
u = a @ v @ s_inv
return (u, s, v.T)