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()