Mercurial > hg > pycsalgos
comparison pyCSalgos/RecomTST/RecommendedTST.py @ 4:4393ad5bffc1
Implemented the RecommendedTST algorithm
Test file written, but test not yet working.
author | nikcleju |
---|---|
date | Mon, 24 Oct 2011 23:39:53 +0000 |
parents | |
children | 5f46ff51c7ff |
comparison
equal
deleted
inserted
replaced
3:537f7798e186 | 4:4393ad5bffc1 |
---|---|
1 | |
2 import numpy as np | |
3 import math | |
4 | |
5 #function beta = RecommendedTST(X,Y, nsweep,tol,xinitial,ro) | |
6 def RecommendedTST(X, Y, nsweep=300, tol=0.00001, xinitial=None, ro=0): | |
7 | |
8 # function beta=RecommendedTST(X,y, nsweep,tol,xinitial,ro) | |
9 # This function gets the measurement matrix and the measurements and | |
10 # the number of runs and applies the TST algorithm with optimally tuned parameters | |
11 # to the problem. For more information you may refer to the paper, | |
12 # "Optimally tuned iterative reconstruction algorithms for compressed | |
13 # sensing," by Arian Maleki and David L. Donoho. | |
14 # X : Measurement matrix; We assume that all the columns have | |
15 # almost equal $\ell_2$ norms. The tunning has been done on | |
16 # matrices with unit column norm. | |
17 # y : output vector | |
18 # nsweep : number of iterations. The default value is 300. | |
19 # tol : if the relative prediction error i.e. ||Y-Ax||_2/ ||Y||_2 < | |
20 # tol the algorithm will stop. If not provided the default | |
21 # value is zero and tha algorithm will run for nsweep | |
22 # iterations. The Default value is 0.00001. | |
23 # xinitial : This is an optional parameter. It will be used as an | |
24 # initialization of the algorithm. All the results mentioned | |
25 # in the paper have used initialization at the zero vector | |
26 # which is our default value. For default value you can enter | |
27 # 0 here. | |
28 # ro : This is a again an optional parameter. If not given the | |
29 # algorithm will use the default optimal values. It specifies | |
30 # the sparsity level. For the default value you may also used if | |
31 # rostar=0; | |
32 # | |
33 # Outputs: | |
34 # beta : the estimated coeffs. | |
35 # | |
36 # References: | |
37 # For more information about this algorithm and to find the papers about | |
38 # related algorithms like CoSaMP and SP please refer to the paper mentioned | |
39 # above and the references of that paper. | |
40 # | |
41 #--------------------- | |
42 # Original Matab code: | |
43 # | |
44 #colnorm=mean((sum(X.^2)).^(.5)); | |
45 #X=X./colnorm; | |
46 #Y=Y./colnorm; | |
47 #[n,p]=size(X); | |
48 #delta=n/p; | |
49 #if nargin<3 | |
50 # nsweep=300; | |
51 #end | |
52 #if nargin<4 | |
53 # tol=0.00001; | |
54 #end | |
55 #if nargin<5 | xinitial==0 | |
56 # xinitial = zeros(p,1); | |
57 #end | |
58 #if nargin<6 | ro==0 | |
59 # ro=0.044417*delta^2+ 0.34142*delta+0.14844; | |
60 #end | |
61 # | |
62 # | |
63 #k1=floor(ro*n); | |
64 #k2=floor(ro*n); | |
65 # | |
66 # | |
67 ##initialization | |
68 #x1=xinitial; | |
69 #I=[]; | |
70 # | |
71 #for sweep=1:nsweep | |
72 # r=Y-X*x1; | |
73 # c=X'*r; | |
74 # [csort, i_csort]=sort(abs(c)); | |
75 # I=union(I,i_csort(end-k2+1:end)); | |
76 # xt = X(:,I) \ Y; | |
77 # [xtsort, i_xtsort]=sort(abs(xt)); | |
78 # | |
79 # J=I(i_xtsort(end-k1+1:end)); | |
80 # x1=zeros(p,1); | |
81 # x1(J)=xt(i_xtsort(end-k1+1:end)); | |
82 # I=J; | |
83 # if norm(Y-X*x1)/norm(Y)<tol | |
84 # break | |
85 # end | |
86 # | |
87 #end | |
88 # | |
89 #beta=x1; | |
90 # | |
91 # End of original Matab code | |
92 #---------------------------- | |
93 | |
94 #colnorm=mean((sum(X.^2)).^(.5)); | |
95 colnorm = np.mean(np.sqrt((X**2).sum(0))) | |
96 X = X / colnorm | |
97 Y = Y / colnorm | |
98 [n,p] = X.shape | |
99 delta = float(n) / p | |
100 # if nargin<3 | |
101 # nsweep=300; | |
102 # end | |
103 # if nargin<4 | |
104 # tol=0.00001; | |
105 # end | |
106 # if nargin<5 | xinitial==0 | |
107 # xinitial = zeros(p,1); | |
108 # end | |
109 # if nargin<6 | ro==0 | |
110 # ro=0.044417*delta^2+ 0.34142*delta+0.14844; | |
111 # end | |
112 if xinitial is None: | |
113 xinitial = np.zeros(p) | |
114 if ro == 0: | |
115 ro = 0.044417*delta**2 + 0.34142*delta + 0.14844 | |
116 | |
117 k1 = math.floor(ro*n) | |
118 k2 = math.floor(ro*n) | |
119 | |
120 #initialization | |
121 x1 = xinitial.copy() | |
122 I = [] | |
123 | |
124 for sweep in np.arange(nsweep): | |
125 r = Y - np.dot(X,x1) | |
126 c = np.dot(X.T, r) | |
127 #[csort, i_csort] = np.sort(np.abs(c)) | |
128 i_csort = np.argsort(np.abs(c)) | |
129 #I = numpy.union1d(I , i_csort(end-k2+1:end)) | |
130 I = np.union1d(I , i_csort[-k2:]) | |
131 #xt = X[:,I] \ Y | |
132 # Make sure X[:,np.int_(I)] is a 2-dimensional matrix even if I has a single value (and therefore yields a column) | |
133 if I.size is 1: | |
134 a = np.reshape(X[:,np.int_(I)],(X.shape[0],1)) | |
135 else: | |
136 a = X[:,np.int_(I)] | |
137 xt = np.linalg.lstsq(a, Y)[0] | |
138 #[xtsort, i_xtsort] = np.sort(np.abs(xt)) | |
139 i_xtsort = np.argsort(np.abs(xt)) | |
140 | |
141 J = I[i_xtsort[-k1:]] | |
142 x1 = np.zeros(p) | |
143 x1[np.int_(J)] = xt[i_xtsort[-k1:]] | |
144 I = J.copy() | |
145 if np.linalg.norm(Y-np.dot(X,x1)) / np.linalg.norm(Y) < tol: | |
146 break | |
147 #end | |
148 | |
149 #end | |
150 | |
151 return x1.copy() | |
152 |