文章目录
- 一、什么是SVD分解
- 二、SVD分解的步骤
- 三、SVD分解的应用领域
- 四、用SVD求解最小二乘表达式
一、什么是SVD分解
奇异值分解(Singular Value Decomposition,简称SVD)是一种重要的矩阵分解技术。它可以将一个矩阵分解为三个矩阵的乘积,即A = UΣVT,其中U和V是正交矩阵,Σ是一个对角矩阵,对角元素为从大到小排列的特征值。
二、SVD分解的步骤
这里以一个例子来讲解SVD分解的步骤,假设有矩阵A如下,我们对其进行进行SVD分解。
A
=
[
0
1
1
1
1
0
]
(1)
A =\begin{bmatrix} 0 & 1 \\ 1 & 1 \\ 1 & 0 \end{bmatrix} \tag{1}
A=
011110
(1)
-
对于给定的m×n矩阵A,计算ATA得到一个n×n的对称矩阵C。
C = A T A = [ 0 1 1 1 1 0 ] [ 0 1 1 1 1 0 ] = [ 2 1 1 2 ] (2) C = A^TA =\begin{bmatrix} 0 & 1 & 1\\ 1 & 1 & 0 \end{bmatrix} \begin{bmatrix} 0 & 1 \\ 1 & 1 \\ 1 & 0 \end{bmatrix} = \begin{bmatrix} 2 & 1 \\ 1 & 2 \end{bmatrix} \tag{2} C=ATA=[011110] 011110 =[2112](2) -
对C矩阵进行特征值分解,得到特征值向量V组成的矩阵和对应的特征值λ。
V = [ 1 2 1 2 1 2 1 2 ] (3) V = \begin{bmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \end{bmatrix} \tag{3} V=[21212121](3)
对应的特征值:λ1=3,λ2=1。具体如何求特征向量和特征值可以参考《线性代数》的课本。 -
将特征值按从大到小的顺序排列,并对应生成对角矩阵Σ。
Σ = [ 3 0 0 1 0 0 ] (4) Σ = \begin{bmatrix} \sqrt{3} & 0 \\ 0 & 1 \\ 0 & 0 \end{bmatrix} \tag{4} Σ= 300010 (4) -
计算AAT,并将结果进行特征值分解,得到特征值λ和对应的特征向量组成的矩阵U。
U = [ 1 6 1 2 1 3 2 6 0 − 1 3 1 6 − 1 2 1 3 ] (5) U = \begin{bmatrix} \frac{1}{\sqrt{6}} & \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{3}} \\ \frac{2}{\sqrt{6}} & 0 & -\frac{1}{\sqrt{3}} \\ \frac{1}{\sqrt{6}} & -\frac{1}{\sqrt{2}} & \frac{1}{\sqrt{3}} \end{bmatrix} \tag{5} U= 616261210−2131−3131 (5)
对应的特征值:λ1=3,λ2=1,和C=ATA的特征值一致。
三、SVD分解的应用领域
- 图像压缩
在图像处理中,SVD分解常被用于图像压缩。通过对图像矩阵进行SVD分解,可以得到较低秩的近似矩阵,从而减少存储空间和传输带宽。这种方法在JPEG2000等图像压缩算法中得到广泛应用。 - 推荐系统
SVD分解在推荐系统中也有重要的应用。通过对用户评分矩阵进行SVD分解,可以将用户和物品映射到一个隐空间中,并预测用户对未评分物品的喜好程度。基于SVD的协同过滤算法在Netflix Prize竞赛中取得了很大成功。 - 数据降维
SVD分解可以将高维数据降维到低维,保留数据的主要特征。这在机器学习和数据挖掘任务中非常有用,可以提高计算效率并减少存储需求。例如,在主成分分析(PCA)中,SVD分解被广泛用于实现数据降维。
四、用SVD求解最小二乘表达式
一般情况下,线性方程的表达式为:
A
x
=
b
Ax = b
Ax=b
其中A为m×n的系数矩阵,x为n×1的未知向量,b为m×1的矩阵。线性方程可分为三种情况:
1.m = n,方程组和未知数的个数相等,理论上存在唯一解;
2. m < n,方程组数小于未知数的个数,理论上存在无数解;
3. m > n, 方程组数大于于未知数的个数,即为超定方程,一般情况下无解,所以一般是求其最优解。这也是我数学建模过程中最常用到的线性模型。我们知道求最优解可通过常规最小二乘法来求解:
x
=
(
A
T
A
)
−
1
A
T
b
x = (A^TA)^{-1}A^Tb
x=(ATA)−1ATb
此方式确实常用,但需要注意到的是,求解过程需要对ATA求逆,在矩阵A不满秩的情况下,ATA是奇异矩阵,无法求逆。而通过SVD求解的优点是不需要复杂的求逆运算,且可处理ATA为奇异阵不可逆的情况。
具体的,A = UΣVT,所以Ax=b可以表示为:
U
Σ
V
T
x
=
b
UΣV^{T}x = b
UΣVTx=b
两边同时左乘UT得:
Σ
V
T
x
=
U
T
b
ΣV^{T}x = U^{T}b
ΣVTx=UTb
现在令y=VT x, b’=UT b,则:
Σ
y
=
b
′
Σy = b'
Σy=b′
展开可以表示为:
所以展开矩阵得:
y
i
=
b
i
′
λ
i
,
i
=
1
,
2
,
.
.
.
,
n
y_i= \frac{b'_i}{λ_i},i=1,2,...,n
yi=λibi′,i=1,2,...,n
根据y=VT x,可以反解得到x:
x
i
=
Σ
y
i
,
i
=
1
,
2
,
.
.
.
,
n
x_i= Σy_i,i=1,2,...,n
xi=Σyi,i=1,2,...,n
至此,解算完毕。
- 代码找时间补^_^ 。