SVD概述
SVD概念
-
奇异值:奇异值和矩阵的特征值有关系。这里的奇异值Data*DataT特征值的平方根。
-
奇异值分解:SVD是矩阵分解的一种类型,用于提取信息,可以把SVD看成是从噪声数据中抽取相关特征。SVD将原始的数据集矩阵Data分解成三个矩阵U、Σ和VT。
D a t a m ∗ n = U m ∗ m Σ m ∗ n V T n ∗ n Data_{m*n} = U_{m*m} Σ_{m*n} VT_{n*n} Datam∗n=Um∗mΣm∗nVTn∗n
上述分解构造出一个矩阵Σ即为奇异值矩阵,该矩阵只有对角元素,其余元素均为0。这些对角元素由大到小排列,对应了原始数据矩阵Data的奇异值。U通常是项目矩阵,VT通常是用户矩阵。
奇异值数目
在科学和工程中,一直存在这样一个普遍事实:在某个奇异值的数目(r个)之后,其他的奇异值都置为0。这就意味着数据集中仅有r个重要特征,而其余特征则都是噪声或冗余特征。确定要保留的奇异值的数目有很多启发式的策略,其中一个典型的做法就是保留矩阵中90%的能量信息。为了计算总能量信息,我们将所有的奇异值求其平方和。于是可以将奇异值的平方和累加到总值的90%为止。
SVD降维
确定奇异值数目后,奇异值矩阵就会变为一个小很多的对角矩阵。例如取奇异值为3,那么上述矩阵Data就可以被近似为:
D a t a m ∗ n = U m ∗ 3 Σ 3 ∗ 3 V T 3 ∗ n Data_{m*n}=U_{m*3}Σ_{3*3} VT_{3*n} Datam∗n=Um∗3Σ3∗3VT3∗n
SVD分解:
from numpy import *
Data = [[1, 1, 1, 0, 0],
[2, 2, 2, 0, 0],
[1, 1, 1, 0, 0],
[5, 5, 5, 0, 0],
[1, 1, 0, 2, 2],
[0, 0, 0, 3, 3],
[0, 0, 0, 1, 1]]
U,Sigma,VT = linalg.svd(Data)
print(Sigma)
#[9.72140007e+00 5.29397912e+00 6.84226362e-01 1.50962387e-15 1.15387192e-31]后两个太小舍去
重构原始矩阵:
#构造奇异值矩阵
Sig3 = mat([[Sigma[0<