From 5ff9f36120de2d855b9b1b91892d35f1069e93b2 Mon Sep 17 00:00:00 2001 From: Luis Fabregas Date: Wed, 22 Jun 2022 09:36:22 +0200 Subject: [PATCH 1/3] selregparam: fix behavior of L-curve (LC method) selection criterion --- deerlab/selregparam.py | 1 + test/test_selregparam.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/deerlab/selregparam.py b/deerlab/selregparam.py index 1558a606d..0f3f6b521 100644 --- a/deerlab/selregparam.py +++ b/deerlab/selregparam.py @@ -163,6 +163,7 @@ def register_ouputs(optout): d1Penalty = np.gradient(np.log(penalties)) d2Penalty = np.gradient(d1Penalty) functional = (d1Residual*d2Penalty - d2Residual*d1Penalty)/(d1Residual**2 + d1Penalty**2)**(3/2) + functional = -functional # Maximize instead of minimize # Find minimum of the selection functional alphaOpt = alphaCandidates[np.argmin(functional)] diff --git a/test/test_selregparam.py b/test/test_selregparam.py index 64099eeb9..ceaeb1732 100644 --- a/test/test_selregparam.py +++ b/test/test_selregparam.py @@ -175,7 +175,7 @@ def test_lc_value(): "Check that the value returned by the LC selection method is correct" loga = get_alpha_from_method('lc') - logaref = -7.900 # Computed with DeerLab-Matlab (0.9.2) + logaref = -1.39 assert abs(1-loga/logaref) < 0.20 #======================================================================= From 9fc4676a31963dedf373dc8f1e93e769a07bef66 Mon Sep 17 00:00:00 2001 From: Luis Fabregas Date: Wed, 22 Jun 2022 09:37:07 +0200 Subject: [PATCH 2/3] selregparam: prevent `np.log(0)=np.inf ` cases in L-curve methods --- deerlab/selregparam.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/deerlab/selregparam.py b/deerlab/selregparam.py index 0f3f6b521..64439c570 100644 --- a/deerlab/selregparam.py +++ b/deerlab/selregparam.py @@ -151,23 +151,23 @@ def register_ouputs(optout): # L-curve minimum-radius method (LR) if method == 'lr': - Eta = np.log(penalties) - Rho = np.log(residuals) + Eta = np.log(np.asarray(penalties)+1e-20) + Rho = np.log(np.asarray(residuals)+1e-20) dd = lambda x: (x-np.min(x))/(np.max(x)-np.min(x)) functional = dd(Rho)**2 + dd(Eta)**2 + functional = functional # Maximize instead of minimize # L-curve maximum-curvature method (LC) elif method == 'lc': - d1Residual = np.gradient(np.log(residuals)) + d1Residual = np.gradient(np.log(np.asarray(residuals)+1e-20)) d2Residual = np.gradient(d1Residual) - d1Penalty = np.gradient(np.log(penalties)) + d1Penalty = np.gradient(np.log(np.asarray(penalties)+1e-20)) d2Penalty = np.gradient(d1Penalty) functional = (d1Residual*d2Penalty - d2Residual*d1Penalty)/(d1Residual**2 + d1Penalty**2)**(3/2) functional = -functional # Maximize instead of minimize # Find minimum of the selection functional alphaOpt = alphaCandidates[np.argmin(functional)] - else: raise KeyError("Search method not found. Must be either 'brent' or 'grid'.") From c86c2908be46d4af62465dc160c38b3fe92f8d26 Mon Sep 17 00:00:00 2001 From: Luis Fabregas Date: Thu, 23 Jun 2022 12:56:00 +0200 Subject: [PATCH 3/3] selregparam: remove useless line from a debugging stage --- deerlab/selregparam.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/deerlab/selregparam.py b/deerlab/selregparam.py index 64439c570..9a63d9657 100644 --- a/deerlab/selregparam.py +++ b/deerlab/selregparam.py @@ -155,8 +155,7 @@ def register_ouputs(optout): Rho = np.log(np.asarray(residuals)+1e-20) dd = lambda x: (x-np.min(x))/(np.max(x)-np.min(x)) functional = dd(Rho)**2 + dd(Eta)**2 - functional = functional # Maximize instead of minimize - + # L-curve maximum-curvature method (LC) elif method == 'lc': d1Residual = np.gradient(np.log(np.asarray(residuals)+1e-20))