Mercurial > hg > pycsalgos
comparison pyCSalgos/ABS/ABSexact.py @ 67:a8d96e67717e
Added the Analysis-By-Synthesis algorithms used in the papers "Analysis-based sparse reconstruction with synthesis-based solvers", "Choosing Analysis or Synthesis Recovery for Sparse Reconstruction" and "A generalization of synthesis and analysis sparsity"
author | Nic Cleju <nikcleju@gmail.com> |
---|---|
date | Tue, 09 Jul 2013 14:21:10 +0300 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
66:ee10ffb60428 | 67:a8d96e67717e |
---|---|
1 # -*- coding: utf-8 -*- | |
2 """ | |
3 Algorithms for exact analysis recovery based on synthesis solvers (a.k.a. Analysis by Synthesis, ABS). | |
4 Exact reconstruction. | |
5 | |
6 Author: Nicolae Cleju | |
7 """ | |
8 __author__ = "Nicolae Cleju" | |
9 __license__ = "GPL" | |
10 __email__ = "nikcleju@gmail.com" | |
11 | |
12 | |
13 import numpy | |
14 | |
15 # Import synthesis solvers from pyCSalgos package | |
16 import pyCSalgos.BP.l1eq_pd | |
17 import pyCSalgos.BP.cvxopt_lp | |
18 import pyCSalgos.OMP.omp_QR | |
19 import pyCSalgos.SL0.SL0 | |
20 import pyCSalgos.TST.RecommendedTST | |
21 | |
22 | |
23 def bp(y,M,Omega,x0, pdtol=1e-3, pdmaxiter=50, cgtol=1e-8, cgmaxiter=200, verbose=False): | |
24 """ | |
25 ABS-exact: Basis Pursuit (based on l1magic toolbox) | |
26 """ | |
27 N,n = Omega.shape | |
28 D = numpy.linalg.pinv(Omega) | |
29 U,S,Vt = numpy.linalg.svd(D) | |
30 Aextra = Vt[-(N-n):,:] | |
31 | |
32 # Create aggregate problem | |
33 Atilde = numpy.vstack((numpy.dot(M,D), Aextra)) | |
34 ytilde = numpy.concatenate((y,numpy.zeros(N-n))) | |
35 | |
36 return numpy.dot(D , pyCSalgos.BP.l1eq_pd.l1eq_pd(x0,Atilde,Atilde.T,ytilde, pdtol, pdmaxiter, cgtol, cgmaxiter, verbose)) | |
37 | |
38 def bp_cvxopt(y,M,Omega): | |
39 """ | |
40 ABS-exact: Basis Pursuit (based cvxopt) | |
41 """ | |
42 N,n = Omega.shape | |
43 D = numpy.linalg.pinv(Omega) | |
44 U,S,Vt = numpy.linalg.svd(D) | |
45 Aextra = Vt[-(N-n):,:] | |
46 | |
47 # Create aggregate problem | |
48 Atilde = numpy.vstack((numpy.dot(M,D), Aextra)) | |
49 ytilde = numpy.concatenate((y,numpy.zeros(N-n))) | |
50 | |
51 return numpy.dot(D , pyCSalgos.BP.cvxopt_lp.cvxopt_lp(ytilde, Atilde)) | |
52 | |
53 | |
54 def ompeps(y,M,Omega,epsilon): | |
55 """ | |
56 ABS-exact: OMP with stopping criterion residual < epsilon | |
57 """ | |
58 | |
59 N,n = Omega.shape | |
60 D = numpy.linalg.pinv(Omega) | |
61 U,S,Vt = numpy.linalg.svd(D) | |
62 Aextra = Vt[-(N-n):,:] | |
63 | |
64 # Create aggregate problem | |
65 Atilde = numpy.vstack((numpy.dot(M,D), Aextra)) | |
66 ytilde = numpy.concatenate((y,numpy.zeros(N-n))) | |
67 | |
68 opts = dict() | |
69 opts['stopCrit'] = 'mse' | |
70 opts['stopTol'] = epsilon | |
71 return numpy.dot(D , pyCSalgos.OMP.omp_QR.greed_omp_qr(ytilde,Atilde,Atilde.shape[1],opts)[0]) | |
72 | |
73 def ompk(y,M,Omega,k): | |
74 """ | |
75 ABS-exact: OMP with stopping criterion fixed number of atoms = k | |
76 """ | |
77 | |
78 N,n = Omega.shape | |
79 D = numpy.linalg.pinv(Omega) | |
80 U,S,Vt = numpy.linalg.svd(D) | |
81 Aextra = Vt[-(N-n):,:] | |
82 | |
83 # Create aggregate problem | |
84 Atilde = numpy.vstack((numpy.dot(M,D), Aextra)) | |
85 ytilde = numpy.concatenate((y,numpy.zeros(N-n))) | |
86 | |
87 opts = dict() | |
88 opts['stopTol'] = k | |
89 return numpy.dot(D , pyCSalgos.OMP.omp_QR.greed_omp_qr(ytilde,Atilde,Atilde.shape[1],opts)[0]) | |
90 | |
91 def sl0(y,M,Omega, sigma_min, sigma_decrease_factor=0.5, mu_0=2, L=3, true_s=None): | |
92 """ | |
93 ABS-exact: Smooth L0 (SL0) | |
94 """ | |
95 | |
96 N,n = Omega.shape | |
97 D = numpy.linalg.pinv(Omega) | |
98 U,S,Vt = numpy.linalg.svd(D) | |
99 Aextra = Vt[-(N-n):,:] | |
100 | |
101 # Create aggregate problem | |
102 Atilde = numpy.vstack((numpy.dot(M,D), Aextra)) | |
103 ytilde = numpy.concatenate((y,numpy.zeros(N-n))) | |
104 | |
105 return numpy.dot(D, pyCSalgos.SL0.SL0.SL0(Atilde,ytilde,sigma_min,sigma_decrease_factor,mu_0,L,true_s)) | |
106 | |
107 def tst_recom(y,M,Omega, nsweep=300, tol=0.00001, xinitial=None, ro=None): | |
108 """ | |
109 ABS-exact: Two Stage Thresholding (TST) with optimized parameters (see Maleki & Donoho) | |
110 """ | |
111 | |
112 N,n = Omega.shape | |
113 D = numpy.linalg.pinv(Omega) | |
114 U,S,Vt = numpy.linalg.svd(D) | |
115 Aextra = Vt[-(N-n):,:] | |
116 | |
117 # Create aggregate problem | |
118 Atilde = numpy.vstack((numpy.dot(M,D), Aextra)) | |
119 ytilde = numpy.concatenate((y,numpy.zeros(N-n))) | |
120 | |
121 return numpy.dot(D, pyCSalgos.TST.RecommendedTST.RecommendedTST(Atilde, ytilde, nsweep, tol, xinitial, ro)) | |
122 |