Source code for spalor.algorithms.cx_algorithms
import numpy as np
[docs]def group_sparse_regression_CX(A,c,eps=1e-8,max_iter=1000):
(d1,d2)=A.shape
AtA=A.transpose().dot(A)
X=np.random.randn(d2,d2)
I=np.eye(d2)
res=1;
for iter in range(0,max_iter):
res0=res
g=AtA.dot(X-I)
step_size=np.sum(np.sum(np.multiply(A.dot(g),A-A.dot(X))))/np.linalg.norm(A.dot(g),ord='fro')**2
X=X+ step_size*g
row_norms=np.sum(np.multiply(X,X), axis=1)
threshhold=np.sort(row_norms)[-c]-0.001
for row in range(0,d2):
if row_norms[row]<threshhold:
X[row,:]=np.zeros(X[row,:].shape)
else:
X[row,:]=X[row,:]*(row_norms[row]-threshhold)/row_norms[row]
res=np.linalg.norm(A-A.dot(X),ord='fro')/np.linalg.norm(A,ord='fro')
if abs(res-res0)<eps:
break
cols=np.where(row_norms>threshhold)
C=np.squeeze(A[:,cols])
X=np.squeeze(X[cols,:])
return (C,X,cols)