Mercurial > hg > pycsalgos
comparison scripts/ABSapprox.py @ 29:bc2a96a03b0a
2011 nov 10. Rewrote a single ABSapprox file, reorganized functions
author | nikcleju |
---|---|
date | Thu, 10 Nov 2011 18:49:38 +0000 |
parents | 1a88766113a9 |
children | 5f46ff51c7ff |
comparison
equal
deleted
inserted
replaced
28:efe3f43a2b59 | 29:bc2a96a03b0a |
---|---|
6 """ | 6 """ |
7 | 7 |
8 import numpy as np | 8 import numpy as np |
9 import scipy.io | 9 import scipy.io |
10 import math | 10 import math |
11 doplot = True | 11 |
12 try: | |
13 import matplotlib.pyplot as plt | |
14 except: | |
15 doplot = False | |
16 if doplot: | |
17 import matplotlib.cm as cm | |
18 import pyCSalgos | 12 import pyCSalgos |
19 import pyCSalgos.GAP.GAP | 13 import pyCSalgos.GAP.GAP |
20 import pyCSalgos.SL0.SL0_approx | 14 import pyCSalgos.SL0.SL0_approx |
21 | 15 |
22 # Define functions that prepare arguments for each algorithm call | 16 #========================== |
17 # Algorithm functions | |
18 #========================== | |
23 def run_gap(y,M,Omega,epsilon): | 19 def run_gap(y,M,Omega,epsilon): |
24 gapparams = {"num_iteration" : 1000,\ | 20 gapparams = {"num_iteration" : 1000,\ |
25 "greedy_level" : 0.9,\ | 21 "greedy_level" : 0.9,\ |
26 "stopping_coefficient_size" : 1e-4,\ | 22 "stopping_coefficient_size" : 1e-4,\ |
27 "l2solver" : 'pseudoinverse',\ | 23 "l2solver" : 'pseudoinverse',\ |
28 "noise_level": epsilon} | 24 "noise_level": epsilon} |
29 return pyCSalgos.GAP.GAP.GAP(y,M,M.T,Omega,Omega.T,gapparams,np.zeros(Omega.shape[1]))[0] | 25 return pyCSalgos.GAP.GAP.GAP(y,M,M.T,Omega,Omega.T,gapparams,np.zeros(Omega.shape[1]))[0] |
30 | 26 |
31 def run_sl0(y,M,Omega,D,U,S,Vt,epsilon,lbd): | 27 def run_sl0(y,M,Omega,D,U,S,Vt,epsilon,lbd): |
32 | 28 |
33 N,n = Omega.shape | 29 N,n = Omega.shape |
34 #D = np.linalg.pinv(Omega) | 30 #D = np.linalg.pinv(Omega) |
35 #U,S,Vt = np.linalg.svd(D) | 31 #U,S,Vt = np.linalg.svd(D) |
58 sigma_decrease_factor = 0.5 | 54 sigma_decrease_factor = 0.5 |
59 mu_0 = 2 | 55 mu_0 = 2 |
60 L = 10 | 56 L = 10 |
61 return pyCSalgos.SL0.SL0_approx.SL0_approx(aggD,aggy,epsilon,sigmamin,sigma_decrease_factor,mu_0,L) | 57 return pyCSalgos.SL0.SL0_approx.SL0_approx(aggD,aggy,epsilon,sigmamin,sigma_decrease_factor,mu_0,L) |
62 | 58 |
63 | 59 #========================== |
64 # Define tuples (algorithm setup function, algorithm function, name) | 60 # Define tuples (algorithm function, name) |
61 #========================== | |
65 gap = (run_gap, 'GAP') | 62 gap = (run_gap, 'GAP') |
66 sl0 = (run_sl0, 'SL0_approx') | 63 sl0 = (run_sl0, 'SL0_approx') |
64 bp = (run_bp, 'BP') | |
67 | 65 |
68 # Define which algorithms to run | 66 # Define which algorithms to run |
69 # 1. Algorithms not depending on lambda | 67 # 1. Algorithms not depending on lambda |
70 algosN = gap, # tuple | 68 algosN = gap, # tuple |
71 # 2. Algorithms depending on lambda (our ABS approach) | 69 # 2. Algorithms depending on lambda (our ABS approach) |
72 algosL = sl0, # tuple | 70 algosL = sl0, # tuple |
73 | 71 |
74 def mainrun(): | 72 #========================== |
75 | 73 # Interface functions |
76 nalgosN = len(algosN) | 74 #========================== |
77 nalgosL = len(algosL) | 75 def run_multiproc(ncpus=None): |
78 | 76 d,sigma,deltas,rhos,lambdas,numvects,SNRdb,dosavedata,savedataname = standard_params() |
79 #Set up experiment parameters | 77 run_multi(algosN, algosL, d,sigma,deltas,rhos,lambdas,numvects,SNRdb,dosavedata=dosavedata,savedataname=savedataname,\ |
78 doparallel=True, ncpus=ncpus) | |
79 | |
80 def run(): | |
81 d,sigma,deltas,rhos,lambdas,numvects,SNRdb,dosavedata,savedataname = standard_params() | |
82 run_multi(algosN, algosL, d,sigma,deltas,rhos,lambdas,numvects,SNRdb,dosavedata=dosavedata,savedataname=savedataname,\ | |
83 doparallel=False) | |
84 | |
85 def standard_params(): | |
86 #Set up standard experiment parameters | |
80 d = 50.0; | 87 d = 50.0; |
81 sigma = 2.0 | 88 sigma = 2.0 |
82 #deltas = np.arange(0.05,1.,0.05) | 89 #deltas = np.arange(0.05,1.,0.05) |
83 #rhos = np.arange(0.05,1.,0.05) | 90 #rhos = np.arange(0.05,1.,0.05) |
84 deltas = np.array([0.05, 0.45, 0.95]) | 91 deltas = np.array([0.05, 0.45, 0.95]) |
91 SNRdb = 20.; # This is norm(signal)/norm(noise), so power, not energy | 98 SNRdb = 20.; # This is norm(signal)/norm(noise), so power, not energy |
92 # Values for lambda | 99 # Values for lambda |
93 #lambdas = [0 10.^linspace(-5, 4, 10)]; | 100 #lambdas = [0 10.^linspace(-5, 4, 10)]; |
94 #lambdas = np.concatenate((np.array([0]), 10**np.linspace(-5, 4, 10))) | 101 #lambdas = np.concatenate((np.array([0]), 10**np.linspace(-5, 4, 10))) |
95 lambdas = np.array([0., 0.0001, 0.01, 1, 100, 10000]) | 102 lambdas = np.array([0., 0.0001, 0.01, 1, 100, 10000]) |
96 | 103 |
104 dosavedata = True | |
105 savedataname = 'ABSapprox.mat' | |
106 | |
107 | |
108 return d,sigma,deltas,rhos,lambdas,numvects,SNRdb,dosavedata,savedataname | |
109 | |
110 #========================== | |
111 # Main functions | |
112 #========================== | |
113 def run_multi(algosN, algosL, d, sigma, deltas, rhos, lambdas, numvects, SNRdb, | |
114 doparallel=False, ncpus=None,\ | |
115 doshowplot=False, dosaveplot=False, saveplotbase=None, saveplotexts=None,\ | |
116 dosavedata=False, savedataname=None): | |
117 | |
118 if doparallel: | |
119 from multiprocessing import Pool | |
120 | |
121 # TODO: load different engine for matplotlib that allows saving without showing | |
122 try: | |
123 import matplotlib.pyplot as plt | |
124 except: | |
125 dosaveplot = False | |
126 doshowplot = False | |
127 if dosaveplot and doshowplot: | |
128 import matplotlib.cm as cm | |
129 | |
130 nalgosN = len(algosN) | |
131 nalgosL = len(algosL) | |
132 | |
97 meanmatrix = dict() | 133 meanmatrix = dict() |
98 for i,algo in zip(np.arange(nalgosN),algosN): | 134 for i,algo in zip(np.arange(nalgosN),algosN): |
99 meanmatrix[algo[1]] = np.zeros((rhos.size, deltas.size)) | 135 meanmatrix[algo[1]] = np.zeros((rhos.size, deltas.size)) |
100 for i,algo in zip(np.arange(nalgosL),algosL): | 136 for i,algo in zip(np.arange(nalgosL),algosL): |
101 meanmatrix[algo[1]] = np.zeros((lambdas.size, rhos.size, deltas.size)) | 137 meanmatrix[algo[1]] = np.zeros((lambdas.size, rhos.size, deltas.size)) |
102 | 138 |
139 # Prepare parameters | |
140 jobparams = [] | |
103 for idelta,delta in zip(np.arange(deltas.size),deltas): | 141 for idelta,delta in zip(np.arange(deltas.size),deltas): |
104 for irho,rho in zip(np.arange(rhos.size),rhos): | 142 for irho,rho in zip(np.arange(rhos.size),rhos): |
105 | 143 |
106 # Generate data and operator | 144 # Generate data and operator |
107 Omega,x0,y,M,realnoise = genData(d,sigma,delta,rho,numvects,SNRdb) | 145 Omega,x0,y,M,realnoise = generateData(d,sigma,delta,rho,numvects,SNRdb) |
108 | 146 |
109 # Run algorithms | 147 #Save the parameters, and run after |
110 print "***** delta = ",delta," rho = ",rho | 148 print "***** delta = ",delta," rho = ",rho |
111 mrelerrN,mrelerrL = runonce(algosN,algosL,Omega,y,lambdas,realnoise,M,x0) | 149 jobparams.append((algosN,algosL, Omega,y,lambdas,realnoise,M,x0)) |
112 | 150 |
151 # Run | |
152 jobresults = [] | |
153 if doparallel: | |
154 pool = Pool(4) | |
155 jobresults = pool.map(run_once_tuple,jobparams) | |
156 else: | |
157 for jobparam in jobparams: | |
158 jobresults.append(run_once(algosN,algosL,Omega,y,lambdas,realnoise,M,x0)) | |
159 | |
160 # Read results | |
161 idx = 0 | |
162 for idelta,delta in zip(np.arange(deltas.size),deltas): | |
163 for irho,rho in zip(np.arange(rhos.size),rhos): | |
164 mrelerrN,mrelerrL = jobresults[idx] | |
165 idx = idx+1 | |
113 for algotuple in algosN: | 166 for algotuple in algosN: |
114 meanmatrix[algotuple[1]][irho,idelta] = 1 - mrelerrN[algotuple[1]] | 167 meanmatrix[algotuple[1]][irho,idelta] = 1 - mrelerrN[algotuple[1]] |
115 if meanmatrix[algotuple[1]][irho,idelta] < 0 or math.isnan(meanmatrix[algotuple[1]][irho,idelta]): | 168 if meanmatrix[algotuple[1]][irho,idelta] < 0 or math.isnan(meanmatrix[algotuple[1]][irho,idelta]): |
116 meanmatrix[algotuple[1]][irho,idelta] = 0 | 169 meanmatrix[algotuple[1]][irho,idelta] = 0 |
117 for algotuple in algosL: | 170 for algotuple in algosL: |
126 # showmats[algo[1]] = np.zeros(rhos.size, deltas.size) | 179 # showmats[algo[1]] = np.zeros(rhos.size, deltas.size) |
127 # for i,algo in zip(np.arange(nalgosL),algosL): | 180 # for i,algo in zip(np.arange(nalgosL),algosL): |
128 # showmats[algo[1]] = np.zeros(lambdas.size, rhos.size, deltas.size) | 181 # showmats[algo[1]] = np.zeros(lambdas.size, rhos.size, deltas.size) |
129 | 182 |
130 # Save | 183 # Save |
131 tosave = dict() | 184 if dosavedata: |
132 tosave['meanmatrix'] = meanmatrix | 185 tosave = dict() |
133 tosave['d'] = d | 186 tosave['meanmatrix'] = meanmatrix |
134 tosave['sigma'] = sigma | 187 tosave['d'] = d |
135 tosave['deltas'] = deltas | 188 tosave['sigma'] = sigma |
136 tosave['rhos'] = rhos | 189 tosave['deltas'] = deltas |
137 tosave['numvects'] = numvects | 190 tosave['rhos'] = rhos |
138 tosave['SNRdb'] = SNRdb | 191 tosave['numvects'] = numvects |
139 tosave['lambdas'] = lambdas | 192 tosave['SNRdb'] = SNRdb |
140 try: | 193 tosave['lambdas'] = lambdas |
141 scipy.io.savemat('ABSapprox.mat',tosave) | 194 try: |
142 except TypeError: | 195 scipy.io.savemat(savedataname, tosave) |
143 print "Oops, Type Error" | 196 except: |
144 raise | 197 print "Save error" |
145 # Show | 198 # Show |
146 if doplot: | 199 if doshowplot or dosaveplot: |
147 for algotuple in algosN: | 200 for algotuple in algosN: |
201 algoname = algotuple[1] | |
148 plt.figure() | 202 plt.figure() |
149 plt.imshow(meanmatrix[algotuple[1]], cmap=cm.gray, interpolation='nearest',origin='lower') | 203 plt.imshow(meanmatrix[algoname], cmap=cm.gray, interpolation='nearest',origin='lower') |
204 if dosaveplot: | |
205 for ext in saveplotexts: | |
206 plt.savefig(saveplotbase + algoname + '.' + ext) | |
150 for algotuple in algosL: | 207 for algotuple in algosL: |
208 algoname = algotuple[1] | |
151 for ilbd in np.arange(lambdas.size): | 209 for ilbd in np.arange(lambdas.size): |
152 plt.figure() | 210 plt.figure() |
153 plt.imshow(meanmatrix[algotuple[1]][ilbd], cmap=cm.gray, interpolation='nearest',origin='lower') | 211 plt.imshow(meanmatrix[algoname][ilbd], cmap=cm.gray, interpolation='nearest',origin='lower') |
154 plt.show() | 212 if dosaveplot: |
213 for ext in saveplotexts: | |
214 plt.savefig(saveplotbase + algoname + lambdas[ilbd] + '.' + ext) | |
215 if doshowplot: | |
216 plt.show() | |
217 | |
155 print "Finished." | 218 print "Finished." |
156 | 219 |
157 def genData(d,sigma,delta,rho,numvects,SNRdb): | 220 def run_once_tuple(t): |
158 | 221 return run_once(*t) |
159 # Process parameters | 222 |
160 noiselevel = 1.0 / (10.0**(SNRdb/10.0)); | 223 def run_once(algosN,algosL,Omega,y,lambdas,realnoise,M,x0): |
161 p = round(sigma*d); | |
162 m = round(delta*d); | |
163 l = round(d - rho*m); | |
164 | |
165 # Generate Omega and data based on parameters | |
166 Omega = pyCSalgos.GAP.GAP.Generate_Analysis_Operator(d, p); | |
167 # Optionally make Omega more coherent | |
168 U,S,Vt = np.linalg.svd(Omega); | |
169 Sdnew = S * (1+np.arange(S.size)) # Make D coherent, not Omega! | |
170 Snew = np.vstack((np.diag(Sdnew), np.zeros((Omega.shape[0] - Omega.shape[1], Omega.shape[1])))) | |
171 Omega = np.dot(U , np.dot(Snew,Vt)) | |
172 | |
173 # Generate data | |
174 x0,y,M,Lambda,realnoise = pyCSalgos.GAP.GAP.Generate_Data_Known_Omega(Omega, d,p,m,l,noiselevel, numvects,'l0'); | |
175 | |
176 return Omega,x0,y,M,realnoise | |
177 | |
178 def runonce(algosN,algosL,Omega,y,lambdas,realnoise,M,x0): | |
179 | 224 |
180 d = Omega.shape[1] | 225 d = Omega.shape[1] |
181 | 226 |
182 nalgosN = len(algosN) | 227 nalgosN = len(algosN) |
183 nalgosL = len(algosL) | 228 nalgosL = len(algosL) |
229 mrelerrL = dict() | 274 mrelerrL = dict() |
230 for algotuple in algosL: | 275 for algotuple in algosL: |
231 mrelerrL[algotuple[1]] = np.mean(relerr[algotuple[1]],1) | 276 mrelerrL[algotuple[1]] = np.mean(relerr[algotuple[1]],1) |
232 | 277 |
233 return mrelerrN,mrelerrL | 278 return mrelerrN,mrelerrL |
279 | |
280 def generateData(d,sigma,delta,rho,numvects,SNRdb): | |
281 | |
282 # Process parameters | |
283 noiselevel = 1.0 / (10.0**(SNRdb/10.0)); | |
284 p = round(sigma*d); | |
285 m = round(delta*d); | |
286 l = round(d - rho*m); | |
287 | |
288 # Generate Omega and data based on parameters | |
289 Omega = pyCSalgos.GAP.GAP.Generate_Analysis_Operator(d, p); | |
290 # Optionally make Omega more coherent | |
291 U,S,Vt = np.linalg.svd(Omega); | |
292 Sdnew = S * (1+np.arange(S.size)) # Make D coherent, not Omega! | |
293 Snew = np.vstack((np.diag(Sdnew), np.zeros((Omega.shape[0] - Omega.shape[1], Omega.shape[1])))) | |
294 Omega = np.dot(U , np.dot(Snew,Vt)) | |
295 | |
296 # Generate data | |
297 x0,y,M,Lambda,realnoise = pyCSalgos.GAP.GAP.Generate_Data_Known_Omega(Omega, d,p,m,l,noiselevel, numvects,'l0'); | |
298 | |
299 return Omega,x0,y,M,realnoise | |
234 | 300 |
235 # Script main | 301 # Script main |
236 if __name__ == "__main__": | 302 if __name__ == "__main__": |
237 | |
238 #import cProfile | 303 #import cProfile |
239 #cProfile.run('mainrun()', 'profile') | 304 #cProfile.run('mainrun()', 'profile') |
240 mainrun() | 305 run() |