目录
奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,可以用于降维算法中的特征分解(如主成分分析)。
奇异值分解
对于一个 n n n阶方阵 A A A,如果它有 n n n个线性无关的特征向量,我们可以将其分解为 A = P Σ P − 1 A=P \Sigma P^{-1} A=PΣP−1的形式。但对于一个一般的 m × n m \times n m×n矩阵,需要用SVD进行分解1。
1)奇异值分解基本定理
若
A
A
A为
m
×
n
m \times n
m×n矩阵,
A
∈
R
m
×
n
A∈R^{m \times n}
A∈Rm×n,则
A
A
A的奇异值分解存在
A
=
U
Σ
V
T
A=U \Sigma V^{T}
A=UΣVT
其中
U
U
U是
m
m
m阶正交矩阵,
V
V
V是
n
n
n阶正交矩阵,
Σ
\Sigma
Σ是
m
×
n
m \times n
m×n阶矩形对角阵,其对角线元素非负,且按降序排列。
2)奇异值分解的计算
- 求对称矩阵 W = A T A W=A^TA W=ATA的特征值 λ i λ_i λi( i = 1 , 2 , . . . , n i=1,2,...,n i=1,2,...,n)和特征向量 v i v_i vi( i = 1 , 2 , . . . , n i=1,2,...,n i=1,2,...,n)
- 求
n
n
n阶正交矩阵
V
V
V:将特征向量单位化,构成
V
V
V
V = [ v 1 v 2 . . . v n ] V=[v_1 \quad v_2 \quad... \quad v_n] V=[v1v2...vn] - 求
m
×
n
m \times n
m×n阶矩形对角阵
Σ
\Sigma
Σ
σ i = λ i , i = 1 , 2 , . . . , n σ_i=\sqrt{λ_i},i=1,2,...,n σi=λi,i=1,2,...,n Σ = d i a g ( σ 1 , σ 2 , . . . , σ n ) \Sigma = diag(σ_1,σ_2,...,σ_n) Σ=diag(σ1,σ2,...,σn) - 求
m
m
m阶正交矩阵
U
U
U
对 A A A的前 r r r个奇异值( r r r为 A A A的秩),令 u j = 1 σ j A v j u_j=\frac{1}{\sigma_j}Av_j uj=σj1Avj U 1 = [ u 1 u 2 . . . u r ] U_1=[u_1 \quad u_2 \quad... \quad u_r] U1=[u1u2...ur]
求 A T A^T AT的零空间一组标准正交基 { u 1 u 2 . . . u m } {\left \{ u_1 \quad u_2 \quad ... \quad u_m \right \} } {u1u2...um},并令 U = [ U 1 U 2 ] U=[U_1 \quad U_2] U=[U1U2] - 得到奇异值分解 A = U Σ V T A=U \Sigma V^{T} A=UΣVT
3)紧奇异值分解和截断奇异值分解
1)定理中给出的奇异值分解 A = U Σ V T A=U \Sigma V^{T} A=UΣVT称为完全奇异值分解,而实际中常用的是奇异值分解的紧凑形式和截断形式。
-
紧奇异值分解
A = U r Σ r V r T A=U_r \Sigma_r V_r^{T} A=UrΣrVrT
其中 r r r为 A A A的秩, U r U_r Ur为 m × r m\times r m×r矩阵, V r V_r Vr为 n × r n\times r n×r矩阵, Σ r \Sigma_r Σr为 r × r r\times r r×r阶对角阵。
U r U_r Ur为 U U U的前 r r r列, V r V_r Vr为 V V V的前 r r r列, Σ r \Sigma_r Σr为 Σ \Sigma Σ的前 r r r个对角线元素。 -
截断奇异值分解
A ≈ U k Σ k V k T A\approx U_k \Sigma_k V_k^{T} A≈UkΣkVkT
其中 U k U_k Uk为 m × k m\times k m×k矩阵, V k V_k Vk为 n × k n\times k n×k矩阵, Σ k \Sigma_k Σk为 k × k k\times k k×k阶对角阵。
U k U_k Uk为 U U U的前 k k k列, V k V_k Vk为 V V V的前 k k k列, Σ k \Sigma_k Σk为 Σ \Sigma Σ的前 k k k个对角线元素。
在实际应用中,常常需要对矩阵数据进行压缩、降维,紧奇异值对应无损压缩,截断奇异值对应有损压缩。关于SVD的直观意义,可以看看这个视频。
主成分分析
PCA(Principal Component Analysis),即主成分分析方法,也称为主分量分析,是一种使用最广泛的数据降维算法。PCA通过线性变换将原始数据(n维特征)变换为一组各维度(k维特征)线性无关的数据,其中k维特征是全新的正交特征也被称为主成分2。关于详细的原理证明和推导这个视频讲的非常不错。
我们先记录PCA的算法步骤,再说明为什么PCA能够实现数据的降维。
1)PCA算法步骤(特征分解版)
设有 m m m条 n n n维数据,将其拼成 m × n m\times n m×n阶矩阵 X X X
- 将 X X X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
- 求出协方差矩阵 C = 1 n X X T C=\frac{1}{n}XX^T C=n1XXT
- 求协方差矩阵的特征值和对应的特征向量
- 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前 k k k行组成矩阵 P P P
- Y = P X Y=PX Y=PX即为降维到 k k k维后的数据
这里计算的核心问题落在了协方差矩阵 C = 1 n X X T C=\frac{1}{n}XX^T C=n1XXT的特征分解(求 P P P矩阵)上。
2)用SVD求解 P P P矩阵
前面提到,在
A
=
U
Σ
V
T
A=U \Sigma V^{T}
A=UΣVT中,有
A
T
A
=
(
U
Σ
V
T
)
T
U
Σ
V
T
=
V
Σ
T
U
T
U
Σ
V
T
=
V
Σ
T
Σ
V
T
=
V
Σ
2
V
T
A^{T} A=\left(U \Sigma V^{T}\right)^{T} U \Sigma V^{T}=V \Sigma^{T} U^{T} U \Sigma V^{T}=V \Sigma^{T} \Sigma V^{T}=V \Sigma^{2} V^{T}
ATA=(UΣVT)TUΣVT=VΣTUTUΣVT=VΣTΣVT=VΣ2VT 而
V
V
V是
A
T
A
A^TA
ATA特征值分解的特征向量按列组成的正交矩阵。
因此,若取
A
=
X
T
n
A=\frac{X^{T}}{\sqrt{n}}
A=nXT,则有
A
T
A
=
(
X
T
m
)
T
X
T
m
=
1
m
X
X
T
A^{T} A=\left(\frac{X^{T}}{\sqrt{m}}\right)^{T} \frac{X^{T}}{\sqrt{m}}=\frac{1}{m} X X^{T}
ATA=(mXT)TmXT=m1XXT
因此,SVD中的
V
V
V即为所求的
P
P
P。
那么,用SVD求解有什么好处呢?
- 一般 X X X的维度很高, A T A A^TA ATA的计算量很大
- 方阵的特征值分解计算效率不高
- SVD除了特征值分解这种求解方式外,还有更高效且更准确的迭代求解法(如Lanczos算法和lobpcg算法等3),避免了 A T A A^TA ATA特征值、特征向量的计算
3)PCA的数学原理
PCA(Principal Component Analysis)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维1 4。
首先,降维就意味着信息的丢失,不过鉴于实际数据本身常常存在的相关性,我们可以想办法在降维的同时将信息的损失尽量降低。直观的图形解释可以看看这个视频中的展示。
对于一个 N N N维的向量,直接舍弃其中的若干维度显然是不可行的。PCA的思想是,对坐标系进行旋转变换,使得数据投影到坐标轴上的方差最大,这样能使得投影后的投影值尽可能分散。同时,我们在选择坐标轴时,希望坐标轴之间相互“垂直”(即相互正交),这样能保证不同维度上尽可能的不包含相关的信息。
至此,我们得到了降维问题的优化目标:将一组 N N N维向量降为 K K K维( K K K大于0,小于 N N N),其目标是选择 K K K个单位(模为1)正交基,使得原始数据变换到这组基上后,各字段两两间协方差为0,而字段的方差则尽可能大(在正交的约束下,取最大的 K K K个方差)。
每个样本可以理解为一个p维的随机向量。同时,每个维度可以理解为一个随机变量。样本的协方差矩阵说的是,p个随机变量之间的协方差,所构成的矩阵。因此,上述优化,等价于将协方差矩阵对角化。
协方差矩阵的定义为 M = [ c o v ( x 1 , x 1 ) ⋯ c o v ( x 1 , x d ) ⋮ ⋱ ⋮ c o v ( x d , x 1 ) ⋯ c o v ( x m , x m ) ] ∈ R m × m M=\left[\begin{array}{ccc} cov\left(x_{1}, x_{1}\right) & \cdots & cov\left(x_{1}, x_{d}\right) \\ \vdots & \ddots & \vdots \\ cov\left(x_{d}, x_{1}\right) & \cdots & cov\left(x_{m}, x_{m}\right) \end{array}\right] \in \mathbb{R}^{m \times m} M= cov(x1,x1)⋮cov(xd,x1)⋯⋱⋯cov(x1,xd)⋮cov(xm,xm) ∈Rm×m
另一方面,协方差矩阵 M = 1 m X X T M=\frac{1}{m}XX^T M=m1XXT5。这就是PCA算法上来就对样本协方差矩阵进行特征分解的原因。
4)主成分方差贡献率
PCA的主要目的是降维,所以一般选择 k ( k < < n ) k(k<<n) k(k<<n)个主成分来代替原来 n n n个变量。选择 k k k的方法,通常用主成分的方差贡献率。
第
k
k
k个主成分
y
k
y_k
yk的方差贡献率为
η
k
=
λ
k
∑
i
=
1
n
λ
i
\eta_k = \frac { \lambda_k}{\sum_{i=1}^{n} \lambda_i}
ηk=∑i=1nλiλk
前
k
k
k个主成分
y
1
,
y
2
,
.
.
.
,
y
k
y_1,y_2,...,y_k
y1,y2,...,yk的累计方差贡献率为
∑
i
=
1
k
η
k
=
∑
i
=
1
k
λ
i
∑
i
=
1
n
λ
i
\sum_{i=1}^{k}\eta_k = \frac { \sum_{i=1}^{k}\lambda_i}{\sum_{i=1}^{n} \lambda_i}
i=1∑kηk=∑i=1nλi∑i=1kλi
通常取 k k k使得累计方差贡献率达到规定百分比以上。累计方差贡献率反映了主成分保留信息的比例。
5)因子负荷量
第
k
k
k个主成分
y
k
y_k
yk与变量
x
i
x_i
xi的相关系数
ρ
(
y
k
,
x
i
)
\rho(y_k,x_i)
ρ(yk,xi)称为因子负荷量,它表示第
k
k
k个主成分
y
k
y_k
yk与变量
x
i
x_i
xi的相关关系
ρ
(
y
k
,
x
i
)
=
λ
k
α
i
k
σ
i
i
\rho(y_k,x_i)=\frac{\sqrt{\lambda_k }\alpha_{ik}}{\sqrt{\sigma_{ii}}}
ρ(yk,xi)=σiiλkαik
自然地,前
k
k
k个主成分
y
1
,
y
2
,
.
.
.
,
y
k
y_1,y_2,...,y_k
y1,y2,...,yk对原有变量
x
i
x_i
xi的贡献率
v
i
v_i
vi定义为
x
i
x_i
xi与
(
y
1
,
y
2
,
.
.
.
,
y
k
)
(y_1,y_2,...,y_k)
(y1,y2,...,yk)的相关系数的平方
v
i
=
ρ
2
(
x
i
,
(
y
1
,
y
2
,
.
.
.
,
y
k
)
)
v_i=\rho^2(x_i,(y_1,y_2,...,y_k))
vi=ρ2(xi,(y1,y2,...,yk))
v
i
=
∑
j
=
1
k
ρ
2
(
x
i
,
y
j
)
=
∑
j
=
1
k
λ
j
α
i
j
2
σ
i
i
v_i=\sum_{j=1}^{k}\rho^2(x_i,y_j)= \sum_{j=1}^{k}\frac{\lambda_j\alpha_{ij}^2}{\sigma_{ii}}
vi=j=1∑kρ2(xi,yj)=j=1∑kσiiλjαij2