pytorch学习:矩阵分解:奇异值分解(SVD分解)
前言
矩阵分解(Matrix Decomposition)是将一个矩阵分解成多个矩阵的乘积的过程,这种分解方法在计算、机器学习和线性代数中有广泛应用。不同的分解方式可以简化计算、揭示矩阵的内在结构或提高算法的效率。
奇异值分解
奇异值分解(Singular Value Decomposition, SVD)是矩阵分解的一种重要形式,它将一个任意的矩阵分解为三个矩阵的乘积,从而揭示出原矩阵的内在结构。
对于任意一个m×n 的矩阵A,它的奇异值分解可以表示为:
其中:
U 是一个 m×m 的正交矩阵,称为左奇异向量矩阵。
V 是一个 n×n 的正交矩阵,称为右奇异向量矩阵。
Σ 是一个 m×n 的对角矩阵,其中对角线上的元素是矩阵 A 的奇异值,其余元素为零。奇异值是非负实数,按降序排列,即 σ 1≥σ 2 ≥⋯≥σ r≥0,其中σ r 是方阵的秩的根号值。
注:正交矩阵(Orthogonal Matrix)是指一种特殊的方阵,一个 n×n 的矩阵 Q 被称为正交矩阵,如果它满足Q TQ=QQ T =I其中Q T是 Q 的转置矩阵,I 是n×n 的单位矩阵。
求解步骤:
1.求矩阵。
2.求矩阵的特征值和特征向量(正交化)。
3.求奇异值(特征值开方)和正交矩阵。
4.求正交矩阵U。
实例
1.方阵的分解
代码实现:
import torch
a = torch.Tensor([[3,1],[1,3]])
u,s,v = torch.svd(a)
print(a)
print(u)
print(s)
print(v)
print(torch.svd(a))
运行结果:
tensor([[3., 1.],
[1., 3.]])
tensor([[-0.7071, -0.7071],
[-0.7071, 0.7071]])
tensor([4., 2.])
tensor([[-0.7071, -0.7071],
[-0.7071, 0.7071]])
torch.return_types.svd(
U=tensor([[-0.7071, -0.7071],
[-0.7071, 0.7071]]),
S=tensor([4., 2.]),
V=tensor([[-0.7071, -0.7071],
[-0.7071, 0.7071]]))
2.矩形阵的分解
代码实现:
import torch
a = torch.Tensor([[4,0],[3,0],[0,5]])
u,s,v = torch.svd(a)
print(a)
print(u)
print(s)
print(v)
print(torch.svd(a))
运行结果:
tensor([[4., 0.],
[3., 0.],
[0., 5.]])
tensor([[-0.8000, 0.0000],
[-0.6000, 0.0000],
[ 0.0000, -1.0000]])
tensor([5., 5.])
tensor([[-1., -0.],
[-0., -1.]])
torch.return_types.svd(
U=tensor([[-0.8000, 0.0000],
[-0.6000, 0.0000],
[ 0.0000, -1.0000]]),
S=tensor([5., 5.]),
V=tensor([[-1., -0.],
[-0., -1.]]))