Skip to content

Commit af969ae

Browse files
committed
up
1 parent 91bb437 commit af969ae

2 files changed

Lines changed: 37 additions & 35 deletions

File tree

ya_glm/backends/cvxpy/glm_solver.py

Lines changed: 24 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@
33
from time import time
44

55
from ya_glm.utils import clip_zero
6-
from ya_glm.cvxpy.penalty import lasso, ridge
6+
from ya_glm.cvxpy.penalty import lasso_penalty, ridge_penalty, tikhonov_penalty
77
from ya_glm.cvxpy.loss_functions import lin_reg_loss, log_reg_loss,\
88
quantile_reg_loss
9-
# from ya_glm.cvxpy.utils import solve_with_backups
109
from ya_glm.backends.fista.glm_solver import process_param_path
1110

1211

@@ -48,8 +47,7 @@ def solve_glm(X, y,
4847
coef_init=coef_init,
4948
intercept_init=intercept_init)
5049

51-
# problem.solve(solver=solver, **cp_kws)
52-
# solve_with_backups(problem=problem, variable=coef, **cp_kws)
50+
problem.solve(solver=solver, **cp_kws)
5351

5452
if coef.value is None:
5553
raise RuntimeError("cvxpy solvers failed")
@@ -93,7 +91,6 @@ def solve_glm_path(fit_intercept=True, solver=None, cp_kws={}, zero_tol=1e-8,
9391
ridge_pen.value = params['ridge_pen']
9492

9593
problem.solve(solver=solver, **cp_kws)
96-
# solve_with_backups(problem=problem, variable=coef, **cp_kws)
9794

9895
if coef.value is None:
9996
raise RuntimeError("cvxpy solvers failed")
@@ -152,8 +149,6 @@ def setup_problem(X, y,
152149
glm_loss = get_glm_loss(loss_func)
153150

154151
# TODO: add these
155-
if tikhonov is not None:
156-
raise NotImplementedError
157152
if groups is not None:
158153
raise NotImplementedError
159154
if L1to2:
@@ -167,45 +162,41 @@ def setup_problem(X, y,
167162
if ridge_pen is None and ridge_weights is not None:
168163
ridge_pen = 1
169164

165+
if ridge_weights is not None:
166+
assert tikhonov is None
167+
168+
###################
169+
# Setup variables #
170+
###################
170171
if lasso_pen is not None:
171172
lasso_pen = cp.Parameter(nonneg=True, value=lasso_pen)
172173

173174
if ridge_pen is not None:
174175
ridge_pen = cp.Parameter(nonneg=True, value=ridge_pen)
175176

176-
if lasso_pen is not None and ridge_pen is not None:
177-
178-
def objective(coef, intercept):
179-
return glm_loss(X=X, y=y, coef=coef, intercept=intercept) + \
180-
lasso_pen * lasso(coef, weights=lasso_weights) + \
181-
ridge_pen * ridge(coef, weights=ridge_weights)
182-
183-
elif lasso_pen is not None:
184-
def objective(coef, intercept):
185-
return glm_loss(X=X, y=y, coef=coef, intercept=intercept) + \
186-
lasso_pen * lasso(coef, weights=lasso_weights)
187-
188-
elif ridge_pen is not None:
189-
def objective(coef, intercept):
190-
return glm_loss(X=X, y=y, coef=coef, intercept=intercept) + \
191-
ridge_pen * ridge(coef, weights=ridge_weights)
192-
193-
else:
194-
def objective(coef, intercept):
195-
return glm_loss(X=X, y=y, coef=coef, intercept=intercept)
196-
197-
###############################
198-
# setup variables and problem #
199-
###############################
200-
201177
coef = cp.Variable(shape=X.shape[1], value=coef_init)
202178
if fit_intercept:
203179
intercept = cp.Variable(value=intercept_init)
204180
else:
205181
intercept = None
206182

207-
problem = cp.Problem(cp.Minimize(objective(coef, intercept)))
183+
# set objective
184+
objective = glm_loss(X=X, y=y, coef=coef, intercept=intercept)
185+
186+
# Add lasso
187+
if lasso_pen is not None:
188+
objective += lasso_pen * lasso_penalty(coef, weights=lasso_weights)
189+
190+
# Add ridge
191+
if ridge_pen is not None:
192+
if tikhonov:
193+
objective += ridge_pen * \
194+
tikhonov_penalty(coef, tikT_tik=tikhonov.T @ tikhonov)
195+
196+
else:
197+
objective += ridge_pen * ridge_penalty(coef, weights=ridge_weights)
208198

199+
problem = cp.Problem(cp.Minimize(objective))
209200
return problem, coef, intercept, lasso_pen, ridge_pen
210201

211202

ya_glm/cvxpy/penalty.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,26 @@
11
import cvxpy as cp
22

33

4-
def lasso(coef, weights=None):
4+
def lasso_penalty(coef, weights=None):
55
if weights is not None:
66
return cp.norm1(cp.multiply(coef, weights))
77
else:
88
return cp.norm1(coef)
99

1010

11-
def ridge(coef, weights=None):
11+
def ridge_penalty(coef, weights=None):
1212
if weights is not None:
1313
return 0.5 * sum(cp.multiply(coef ** 2, weights))
1414
else:
1515
return 0.5 * cp.sum_squares(coef)
16+
17+
18+
def tikhonov_penalty(coef, tikT_tik):
19+
"""
20+
Parameters
21+
----------
22+
tik_tik: array-like, shape (n_features, n_features)
23+
The squared tikhonov matrix tikT_tik = tikhonov.T @ tikhonov
24+
25+
"""
26+
return 0.5 * cp.quad_form(coef, tikT_tik)

0 commit comments

Comments
 (0)