Sparse Principal Component Analysis via Rotation and Truncation

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} RRr×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 Xi1作为惩罚项,可以起到稀疏化的作用(这是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 VRTXF2=(VXR)RTF2,所以这个问题和原始问题是等价的。

经过转换,上述问题还等价于:
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λXi1i=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 T0(新的初始问题)

在这里插入图片描述
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(ZijXij)2+λ2Xij0
显然,若 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,,p1}
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
      

结果,稀疏的程度大点,反而效果还好点。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值