[机器学习] 奇异值分解(SVD)

1、特征值分解

特征值和特征向量的定义如下:
A x = λ x Ax=\lambda x Ax=λx
其中 A A A是一个 n × n n\times n n×n矩阵, x x x是一个 n n n维向量( n × 1 n\times 1 n×1),而 λ \lambda λ是一个数值。

λ \lambda λ是矩阵A的一个特征值,而x是矩阵A的特征值 λ \lambda λ所对应的特征向量。

如果求出了矩阵A的n个特征值, λ 1 ≤ λ 2 ≤ . . . λ n \lambda_1≤\lambda_2≤...\lambda_n λ1λ2...λn,以及这n个特征值所对应的特征向量 w 1 , w 2 , . . . , w n w_1,w_2,...,w_n w1,w2,...,wn

则矩阵A可用下式的特征分解表示:
A = W ∑ W − 1 A=W\sum W^{-1} A=WW1
其中,W是n个特征向量组成的 n × n n\times n n×n矩阵 [ w 1 w 2 ⋯ w n ] \begin{bmatrix}w_1&w_2&\cdots& w_n\end{bmatrix} [w1w2wn](向量是竖的列向量),而 ∑ \sum 是以n个特征向量所对应的特征值为主对角线的值的 n × n n\times n n×n矩阵。

一般我们会把W的这n个特征向量标准化,即满足 ∣ ∣ w i ∣ ∣ 2 = 1 ||w_i||_2=1 wi2=1,或者 w i T w i = 1 w_i^Tw_i=1 wiTwi=1,若 A A A是个实对称矩阵,此时W的n个特征向量为标准正交基(实对称矩阵不同特征值对应的特征向量正交),又满足 W T W = I W^TW=I WTW=I,即 W T = W − 1 W^T=W^{-1} WT=W1,也就是说W为酉矩阵(矩阵元素全为实数时也称作正交矩阵)。注:酉矩阵一般指幺正矩阵(矩阵元素可以是复数),即厄米共轭矩阵等于逆矩阵。对于实矩阵(矩阵元素全为实数),厄米共轭矩阵就是转置矩阵。

这样我们的特征分解表达式可以写成:
A = W ∑ W T A=W\sum W^T A=WWT
注意到要进行特征分解,矩阵A必须为方阵。

当矩阵A不是方阵时,再想对A进行矩阵分解就要用到奇异值分解(SVD)

2、奇异值分解

假设矩阵A是 m × n m\times n m×n矩阵,定义矩阵A的奇异值分解(SVD)为:
A m × n = U m × m ∑ V n × n T A_{m\times n}=U_{m \times m}\sum V_{n\times n}^T Am×n=Um×mVn×nT
∑ : m × n \sum:m\times n m×n
U、V都是酉矩阵(正交矩阵),即满足 U T U = I , V T V = I U^TU=I,V^TV=I UTU=IVTV=I,即 U T = U − 1 , V T = V − 1 U^T=U^{-1},V^T=V^{-1} UT=U1VT=V1

(1)求矩阵 V V V
A T A^T AT n × m n\times m n×m
A A A m × n m\times n m×n
V : n × n V:n\times n Vn×n

注意到, A T A A^TA ATA n × n n\times n n×n的方阵,也就是说可以对其进行特征值分解,由它的所有特征向量 v i v_i vi可以组成一个 n × n n\times n n×n的矩阵,这个矩阵就是矩阵 V V V,称作右奇异矩阵, V V V中的每一个特征向量称作矩阵 A A A的右奇异向量。

(2)求矩阵 U U U
A A A m × n m\times n m×n
A T A^T AT n × m n\times m n×m
U : m × m U:m\times m Um×m

注意到, A A T AA^T AAT m × m m\times m m×m的方阵,也就是说可以对其进行特征值分解,由它的所有特征向量 u i u_i ui可以组成一个 m × m m\times m m×m的矩阵,这个矩阵就是矩阵 U U U,称作左奇异矩阵, U U U中的每一个特征向量称作矩阵 A A A的左奇异向量。

(3)求奇异值矩阵 ∑ \sum
A = U ∑ V T A V = U ∑ V T V A V = U ∑ A=U\sum V^T\\ AV=U\sum V^TV\\ AV=U\sum A=UVTAV=UVTVAV=U
A [ v 1 v 2 ⋯ v n ] = [ u 1 u 2 ⋯ u n ⋯ u m ] [ σ 1 0 0 ⋯ 0 0 σ 2 0 ⋯ 0 0 0 σ 3 ⋯ 0 ⋮ ⋮ ⋮ ⋱ ⋮ 0 0 0 ⋯ σ n ⋮ ⋮ ⋮ ⋯ ⋮ 0 0 0 ⋯ 0 ] m × n A\begin{bmatrix}v_1&v_2&\cdots&v_n\end{bmatrix}=\begin{bmatrix}u_1&u_2&\cdots&u_n&\cdots&u_m\end{bmatrix} \begin{bmatrix} \sigma_1&0&0&\cdots&0\\ 0&\sigma_2&0&\cdots&0\\ 0&0&\sigma_3&\cdots&0\\ \vdots&\vdots&\vdots&\ddots&\vdots\\ 0&0&0&\cdots&\sigma_n\\ \vdots&\vdots&\vdots&\cdots&\vdots\\ 0&0&0&\cdots&0 \end{bmatrix}_{m\times n} A[v1v2vn]=[u1u2unum]σ100000σ200000σ300000σn0m×n
由于奇异值矩阵只在对角线处有值,其他位置均是0,而 ∑ \sum 并不是标准的方阵,它的对角线如上式内所表示,只在 n × n n\times n n×n 处有值,并非从左上角一路划到右下角。

展开上面的矩阵乘法:
A v 1 = u 1 σ 1 A v 2 = u 2 σ 2 A v 3 = u 3 σ 3 . . . A v n = u n σ n Av_1=u_1\sigma_1\\ Av_2=u_2\sigma_2\\ Av_3=u_3\sigma_3\\ ...\\ Av_n=u_n\sigma_n Av1=u1σ1Av2=u2σ2Av3=u3σ3...Avn=unσn
可以看出,各奇异值的计算方式:
σ i = A m × n ( v i ) n × 1 ( u i ) m × 1 \sigma_i=\frac{A_{m\times n}(v_i)_{n\times 1}}{(u_i)_{m\times 1}} σi=(ui)m×1Am×n(vi)n×1
上式中,分子的结果是一个 m × 1 m\times 1 m×1的向量,分母是一个 m × 1 m\times 1 m×1的向量,但向量之间是没有除法的,除非两个向量共线(即平行),结果是两个共线向量的倍数关系。在SVD中,上式实际上就是求两个共线向量的倍数关系。

另一方面,特征值矩阵等于奇异值矩阵的平方,也就是说,特征值和奇异值满足如下关系:
σ i = λ i \sigma _i=\sqrt{\lambda_i} σi=λi
即,可以通过求出 A T A A^TA ATA n × n n\times n n×n的方阵)的特征值再取平方根来求奇异值。

3、SVD计算举例

[机器学习] 奇异值分解(SVD)_第1张图片
[机器学习] 奇异值分解(SVD)_第2张图片
[机器学习] 奇异值分解(SVD)_第3张图片
[机器学习] 奇异值分解(SVD)_第4张图片

4、SVD的性质

对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。

也就是说,我们也可以用最大的 k k k 个奇异值和它们对应的左右奇异向量来近似描述矩阵。

由于这个重要的性质,SVD可以用于PCA降维,来做数据压缩和去噪。也可以用于推荐算法,将用户和喜好对应的矩阵做特征分解,进而得到隐含的用户需求来做推荐。同时也可以用于NLP中的算法,比如潜在语义索引(LSI)。

实际上SVD在PCA降维上只是使用了 V V V 矩阵(右奇异矩阵),其原因就是 U U U 矩阵(左奇异矩阵)是进行行压缩,而 V V V 矩阵(右奇异矩阵)是对列进行压缩,而PCA降维只需要减少特征从而进行降维,所以PCA只用到了SVD的 V V V 矩阵(右奇异矩阵)。

你可能感兴趣的:(机器学习,矩阵)