抱歉,真的没怎么看懂,当然,估计和我现在没法静下心来好好看也有关系。
算法
想法非常非常简单吧,就是在原来幂法的基础上,每次迭代的时候再加个截断。当然,论文里给出了,为什么这么做的理由,把我弄得晕晕的,但是思想就是这么朴素。现在的问题是:
1.k怎么选?
2.初始(x)的选择
k的选择
这个我没在论文里找到,但是看数值实验,感觉在k上面是有操作空间的。
(x)的初始化
(x)的初始化,是这篇论文的大头,讲了怎么样怎么样就能怎么样怎么样。
总结就是有如下3种方案:
- (x=e_j,j=argmax{A_{ii}})实在是简单粗暴啊。
- 分俩步,第一步先把(k)放大一些,然后进行迭代(初始化估计就用第一种吧),迭代几步之后,把(k)变回来,再继续迭代。
- 当(kapprox p)的时候,采用Moghaddam et al. 2006后向选取的方法。
注:文章还提到,当(A)具有唯一的稀疏的主特征向量,那么,TPower方法能够从(A)的带噪声的观测中,讲该特征向量近似地恢复出来。
代码
def You_eig_value(C, x, k): #幂法
p = C.shape[1]
x1 = x #初始化
while True:
x2 = C @ x1
truncate(x, k)
x2 = x2 / np.sqrt(x2 @ x2)
if np.sum(np.abs(x2-x1)) < 0.0001:
break
else:
x1 = x2
return x1
def truncate(x, k): #截断
p = len(x)
label = np.argsort(np.abs(x))[:p-k]
x[label] = 0