SPCArt算法,利用旋轉(zhuǎn)(正交變換更為恰當(dāng),因?yàn)闆](méi)有體現(xiàn)出旋轉(zhuǎn)這個(gè)過(guò)程),交替迭代求解sparse PCA。
對(duì)以往一些SPCA算法復(fù)雜度的總結(jié)
在這里插入圖片描述
注:
Notation
在這里插入圖片描述
論文概述
就是普通PCA的前
個(gè)載荷向量(loadings,按照特征值降序排列)
也是彼此正交的,張成同一子空間的向量組。
原始問(wèn)題

在這里插入圖片描述
如果能解出來(lái),當(dāng)然好,可是這是一個(gè)很難求解的問(wèn)題,所以需要改進(jìn)。
問(wèn)題的變種
直接用
表示了,為了符號(hào)的簡(jiǎn)潔。

在這里插入圖片描述
變成這個(gè)問(wèn)題之后,我們所追求的便是
1.我們希望
2.
算法
在這里插入圖片描述
這是一個(gè)交替迭代算法,我們來(lái)分別討論。
固定
,計(jì)算
當(dāng)固定,之后,問(wèn)題就退化為:

在這里插入圖片描述
這個(gè)問(wèn)題在Sparse Principal Component Analysis(Zou 06)這篇論文里面也有提到。
上述最小化問(wèn)題,可以變換為
若
就是要最大化:
當(dāng)(注意
是正交矩陣)。
固定
,求解
(
)
1-范數(shù)

在這里插入圖片描述
注意:
經(jīng)過(guò)轉(zhuǎn)換,上述問(wèn)題還等價(jià)于:
通過(guò)分析(蠻簡(jiǎn)單的,但是不好表述),可以得到:
(新的初始問(wèn)題)

在這里插入圖片描述
等價(jià)于:
顯然,若,
,此時(shí)函數(shù)值為
若,值為
,所以,為了最小化值,?。?br>
,也就是說(shuō),
否則,
T-sp 考慮稀疏度的初始問(wèn)題

在這里插入圖片描述
等價(jià)于:
在條件不變的情況下。
證明挺簡(jiǎn)單的,但不好表述,就此別過(guò)吧。
最優(yōu)解是:
T-en 考慮Energy的問(wèn)題
文章到此并沒(méi)有結(jié)束,還提及了一些衡量算法優(yōu)劣的指標(biāo),但是這里就不提了。大體的思想就在上面,我認(rèn)為這篇論文好在,能夠把各種截?cái)喾椒ê蛯?shí)際優(yōu)化問(wèn)題結(jié)合在一起,很不錯(cuò)。
代碼
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) 沒(méi)有測(cè)試過(guò)這個(gè)函數(shù)
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)} 沒(méi)有測(cè)試過(guò)這個(gè)函數(shù)
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截?cái)? 可以用F范數(shù)判斷是否收斂,為了簡(jiǎn)單直接限定次數(shù)
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
結(jié)果,稀疏的程度大點(diǎn),反而效果還好點(diǎn)。