文章目录
SPCArt算法,利用旋转(正交变换更为恰当,因为没有体现出旋转这个过程),交替迭代求解sparse PCA。
对以往一些SPCA算法复杂度的总结
注:
r
r
r是选取的主成分数目,
m
m
m为迭代次数,
p
p
p为样本维度,
n
n
n为样本数目。本文算法,需要先进行SVD,并未在上表中给出。
Notation
论文概述
A
=
U
Σ
V
T
A = U\Sigma V^{\mathrm{T}}
A=UΣVT
V
1
:
r
=
[
V
1
,
V
2
,
…
,
V
r
]
∈
R
p
×
r
V_{1:r}=[V_1,V_2,\ldots, V_r] \in \mathbb{R}^{p\times r}
V1:r=[V1,V2,…,Vr]∈Rp×r就是普通PCA的前
r
r
r个载荷向量(loadings,按照特征值降序排列)
∀
旋
转
矩
阵
(
正
交
矩
阵
)
R
∈
R
r
×
r
\forall 旋转矩阵(正交矩阵)R \in \mathbb{R}^{r \times r}
∀旋转矩阵(正交矩阵)R∈Rr×r
V
1
:
r
R
V_{1:r}R
V1:rR也是彼此正交的,张成同一子空间的向量组。
原始问题
如果能解出来,当然好,可是这是一个很难求解的问题,所以需要改进。
问题的变种
V 1 : r V_{1:r} V1:r直接用 V V V表示了,为了符号的简洁。
变成这个问题之后,我们所追求的便是
X
X
X了,
X
i
X_i
Xi,就是我们要的载荷向量,显然,这个问题所传达出来的含义是:
1.我们希望
X
R
XR
XR与
V
V
V相差不大,意味着
X
i
X_i
Xi近似正交且张成同一个子空间。
2.
∥
X
i
∥
1
\|X_i\|_1
∥Xi∥1作为惩罚项,可以起到稀疏化的作用(这是1-范数的特点)。
算法
这是一个交替迭代算法,我们来分别讨论。
固定 X X X,计算 R R R
当固定
X
X
X,之后,问题就退化为:
这个问题在Sparse Principal Component Analysis(Zou 06)这篇论文里面也有提到。
上述最小化问题,可以变换为
m
a
x
t
r
(
V
T
X
R
)
,
s
.
t
.
R
T
R
=
I
max \quad tr(V^{\mathrm{T}}XR), \quad s.t. \quad R^{\mathrm{T}}R=I
maxtr(VTXR),s.t.RTR=I
若
X
T
V
=
W
D
Q
T
X^{\mathrm{T}}V=WDQ^{\mathrm{T}}
XTV=WDQT
就是要最大化:
t
r
(
Q
D
W
T
R
)
=
t
r
(
D
W
T
R
Q
)
≤
t
r
(
D
)
tr(QDW^{\mathrm{T}}R)=tr(DW^{\mathrm{T}}RQ)\leq tr(D)
tr(QDWTR)=tr(DWTRQ)≤tr(D)
当
R
=
W
Q
T
R = WQ^{\mathrm{T}}
R=WQT(注意
W
T
R
Q
W^{\mathrm{T}}RQ
WTRQ是正交矩阵)。
固定 R R R,求解 X X X ( Z = V R T Z =VR^{\mathrm{T}} Z=VRT)
1-范数
注意:
∥
V
R
T
−
X
∥
F
2
=
∥
(
V
−
X
R
)
R
T
∥
F
2
\|VR^{\mathrm{T}}-X\|_F^2=\|(V-XR)R^{\mathrm{T}}\|_F^2
∥VRT−X∥F2=∥(V−XR)RT∥F2,所以这个问题和原始问题是等价的。
经过转换,上述问题还等价于:
m
a
x
X
i
Z
i
T
X
i
−
λ
∥
X
i
∥
1
i
=
1
,
2
,
…
,
r
max_{X_i} \quad Z_i^{\mathrm{T}}X_i-\lambda\|X_i\|_1 \quad i=1,2,\ldots,r
maxXiZiTXi−λ∥Xi∥1i=1,2,…,r
通过分析(蛮简单的,但是不好表述),可以得到:
X
i
∗
=
S
λ
(
Z
i
)
/
∥
S
λ
(
Z
i
)
∥
2
X_i^*=S_\lambda(Z_i)/\|S_\lambda(Z_i)\|_2
Xi∗=Sλ(Zi)/∥Sλ(Zi)∥2
T − ℓ 0 T-\ell_0 T−ℓ0(新的初始问题)
R
R
R的求解问题没有变化,考虑
R
R
R固定的时候,求解
X
X
X。
等价于:
m
i
n
X
i
j
,
Z
i
j
(
Z
i
j
−
X
i
j
)
2
+
λ
2
∥
X
i
j
∥
0
\mathop{min}\limits_{X_{ij},Z_{ij}} \quad (Z_{ij}-X_{ij})^2+\lambda^2\|X_{ij}\|_0
Xij,Zijmin(Zij−Xij)2+λ2∥Xij∥0
显然,若
X
i
j
∗
≠
0
X_{ij}^* \neq 0
Xij∗̸=0,
X
i
j
∗
=
Z
i
j
X_{ij}^*=Z_{ij}
Xij∗=Zij,此时函数值为
λ
2
\lambda^2
λ2
若
X
i
j
∗
=
0
X_{ij}^* = 0
Xij∗=0,值为
Z
i
j
2
Z_{ij}^2
Zij2,所以,为了最小化值,取:
m
i
n
{
Z
i
j
2
,
λ
2
}
min \{Z_{ij}^2,\lambda^2\}
min{Zij2,λ2},也就是说,
X
i
j
=
0
i
f
 
Z
i
j
2
>
λ
2
X_{ij}=0 \quad if\:Z_{ij}^2>\lambda^2
Xij=0ifZij2>λ2 否则,
X
i
j
=
Z
i
j
X_{ij}=Z_{ij}
Xij=Zij
X
i
∗
=
H
λ
(
Z
i
)
/
∥
H
λ
(
Z
i
)
∥
2
X_i^*=H_\lambda(Z_i)/\|H_\lambda(Z_i)\|_2
Xi∗=Hλ(Zi)/∥Hλ(Zi)∥2
T-sp 考虑稀疏度的初始问题
λ
∈
{
0
,
1
,
2
,
…
,
p
−
1
}
\lambda \in \{0, 1, 2,\ldots,p-1\}
λ∈{0,1,2,…,p−1}
R
R
R的求法如出一辙,依旧只需考虑在
R
R
R固定的情况下,如何求解
X
X
X的情况。
等价于:
m
a
x
Z
i
T
X
i
max \quad Z_i^{\mathrm{T}}X_i
maxZiTXi 在条件不变的情况下。
证明挺简单的,但不好表述,就此别过吧。
最优解是:
X
i
∗
=
P
λ
(
Z
i
)
/
∥
P
λ
(
Z
i
)
∥
2
X_i^*=P_\lambda(Z_i)/\|P_\lambda(Z_i)\|_2
Xi∗=Pλ(Zi)/∥Pλ(Zi)∥2
T-en 考虑Energy的问题
X i = E λ ( Z i ) / ∥ E λ ( Z i ) ∥ 2 X_i = E_\lambda(Z_i)/\|E_\lambda(Z_i)\|_2 Xi=Eλ(Zi)/∥Eλ(Zi)∥2
文章到此并没有结束,还提及了一些衡量算法优劣的指标,但是这里就不提了。大体的思想就在上面,我认为这篇论文好在,能够把各种截断方法和实际优化问题结合在一起,很不错。
代码
def Compute_R(X, V):
W, D, Q_T = np.linalg.svd(X.T @ V)
return W @ Q_T
def T_S(V, R, k): #k in [0,1)
Z = V @ R.T
sign = np.where(Z < 0, -1, 1)
truncate = np.where(np.abs(Z) - k < 0, 0, np.abs(Z) - k)
X = sign * truncate
X = X / np.sqrt((np.sum(X ** 2, 0)))
return X
def T_H(V, R, k): #k in [0,1) 没有测试过这个函数
Z = V @ R.T
X = np.where(np.abs(Z) > k, Z, 0)
X = X / np.sqrt((np.sum(X ** 2, 0)))
return X
def T_P(V, R, k): #k belongs to {0, 1, 2, ..., (p-1)} 没有测试过这个函数
Z = V @ R.T
Z[np.argsort(np.abs(Z), 0)[:k], np.arange(Z.shape[1])] = 0
X = Z / np.sqrt((np.sum(Z ** 2, 0)))
return X
def Main(C, r, Max_iter, k): #用T_S截断 可以用F范数判断是否收敛,为了简单直接限定次数
value, V_T = np.linalg.eig(C)
V = V_T[:r].T
R = np.eye(r)
while Max_iter > 0:
Max_iter -= 1
X = T_S(V, R, k)
R = Compute_R(X, V)
return X.T
结果,稀疏的程度大点,反而效果还好点。