33from time import time
44
55from 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
77from 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
109from 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
0 commit comments