annotate ABSlambda.py @ 21:d395461b92ae tip

Lots and lots of modifications. Approximate recovery script working.
author Nic Cleju <nikcleju@gmail.com>
date Mon, 23 Apr 2012 10:54:57 +0300
parents 7fdf964f4edd
children
rev   line source
nikcleju@10 1 # -*- coding: utf-8 -*-
nikcleju@10 2 """
nikcleju@17 3 Algorithms for approximate analysis recovery based on synthesis solvers (a.k.a. Analysis by Synthesis, ABS).
nikcleju@17 4 Approximate reconstruction, ABS-lambda.
nikcleju@10 5
nikcleju@17 6 Author: Nicolae Cleju
nikcleju@10 7 """
nikcleju@17 8 __author__ = "Nicolae Cleju"
nikcleju@17 9 __license__ = "GPL"
nikcleju@17 10 __email__ = "nikcleju@gmail.com"
nikcleju@17 11
nikcleju@10 12
nikcleju@10 13 import numpy
nikcleju@17 14
nikcleju@17 15 # Import synthesis solvers from pyCSalgos package
nikcleju@10 16 import pyCSalgos.BP.l1qc
nikcleju@13 17 import pyCSalgos.SL0.SL0_approx
nikcleju@10 18 import pyCSalgos.OMP.omp_QR
nikcleju@10 19 import pyCSalgos.TST.RecommendedTST
nikcleju@10 20
nikcleju@10 21 def sl0(y,M,Omega,epsilon,lbd,sigma_min, sigma_decrease_factor=0.5, mu_0=2, L=3, A_pinv=None, true_s=None):
nikcleju@17 22 """
nikcleju@17 23 ABS-lambda: Smooth L0 (SL0)
nikcleju@17 24 """
nikcleju@10 25 N,n = Omega.shape
nikcleju@10 26 D = numpy.linalg.pinv(Omega)
nikcleju@10 27 U,S,Vt = numpy.linalg.svd(D)
nikcleju@10 28 aggDupper = numpy.dot(M,D)
nikcleju@10 29 aggDlower = Vt[-(N-n):,:]
nikcleju@13 30 aggD = numpy.vstack((aggDupper, lbd * aggDlower))
nikcleju@10 31 aggy = numpy.concatenate((y, numpy.zeros(N-n)))
nikcleju@10 32
nikcleju@21 33 #return numpy.dot(D, pyCSalgos.SL0.SL0_approx.SL0_approx(aggD,aggy,epsilon,sigma_min,sigma_decrease_factor,mu_0,L,A_pinv,true_s))
nikcleju@21 34 return numpy.dot(D, pyCSalgos.SL0.SL0_approx.SL0_approx_dai(aggD,aggy,epsilon,sigma_min,sigma_decrease_factor,mu_0,L,A_pinv,true_s))
nikcleju@10 35
nikcleju@13 36 def bp(y,M,Omega,epsilon,lbd, x0, lbtol=1e-3, mu=10, cgtol=1e-8, cgmaxiter=200, verbose=False):
nikcleju@17 37 """
nikcleju@17 38 ABS-lambda: Basis Pursuit (based on l1magic toolbox)
nikcleju@17 39 """
nikcleju@10 40 N,n = Omega.shape
nikcleju@10 41 D = numpy.linalg.pinv(Omega)
nikcleju@10 42 U,S,Vt = numpy.linalg.svd(D)
nikcleju@10 43 aggDupper = numpy.dot(M,D)
nikcleju@10 44 aggDlower = Vt[-(N-n):,:]
nikcleju@13 45 aggD = numpy.vstack((aggDupper, lbd * aggDlower))
nikcleju@10 46 aggy = numpy.concatenate((y, numpy.zeros(N-n)))
nikcleju@10 47
nikcleju@16 48 return numpy.dot(D, pyCSalgos.BP.l1qc.l1qc_logbarrier(x0,aggD,aggD.T,aggy,epsilon, lbtol, mu, cgtol, cgmaxiter, verbose))
nikcleju@10 49
nikcleju@10 50 def ompeps(y,M,Omega,epsilon,lbd):
nikcleju@17 51 """
nikcleju@17 52 ABS-lambda: OMP with stopping criterion residual < epsilon
nikcleju@17 53 """
nikcleju@10 54 N,n = Omega.shape
nikcleju@10 55 D = numpy.linalg.pinv(Omega)
nikcleju@10 56 U,S,Vt = numpy.linalg.svd(D)
nikcleju@10 57 aggDupper = numpy.dot(M,D)
nikcleju@10 58 aggDlower = Vt[-(N-n):,:]
nikcleju@21 59 aggD = numpy.vstack((aggDupper, lbd * aggDlower))
nikcleju@10 60 aggy = numpy.concatenate((y, numpy.zeros(N-n)))
nikcleju@10 61
nikcleju@10 62 opts = dict()
nikcleju@10 63 opts['stopCrit'] = 'mse'
nikcleju@10 64 opts['stopTol'] = epsilon**2 / aggy.size
nikcleju@16 65 return numpy.dot(D, pyCSalgos.OMP.omp_QR.greed_omp_qr(aggy,aggD,aggD.shape[1],opts)[0])
nikcleju@10 66
nikcleju@10 67 def tst_recom(y,M,Omega,epsilon,lbd, nsweep=300, xinitial=None, ro=None):
nikcleju@17 68 """
nikcleju@17 69 ABS-lambda: Two Stage Thresholding (TST) with optimized parameters (see Maleki & Donoho)
nikcleju@17 70 """
nikcleju@10 71 N,n = Omega.shape
nikcleju@10 72 D = numpy.linalg.pinv(Omega)
nikcleju@10 73 U,S,Vt = numpy.linalg.svd(D)
nikcleju@10 74 aggDupper = numpy.dot(M,D)
nikcleju@10 75 aggDlower = Vt[-(N-n):,:]
nikcleju@13 76 aggD = numpy.vstack((aggDupper, lbd * aggDlower))
nikcleju@10 77 aggy = numpy.concatenate((y, numpy.zeros(N-n)))
nikcleju@10 78
nikcleju@10 79 tol = epsilon / numpy.linalg.norm(aggy)
nikcleju@21 80 return numpy.dot(D, pyCSalgos.TST.RecommendedTST.RecommendedTST(aggD, aggy, nsweep, tol, xinitial, ro))
nikcleju@10 81