@@ -107,7 +107,9 @@ def graph_lasso(emp_cov, alpha, cov_init=None, mode='cd', tol=1e-4,
107107
108108 enet_tol : positive float, optional
109109 The tolerance for the elastic net solver used to calculate the descent
110- direction. Only used for mode='cd'.
110+ direction. This parameter controls the accuracy of the search direction
111+ for a given column update, not of the overall parameter estimate. Only
112+ used for mode='cd'.
111113
112114 max_iter : integer, optional
113115 The maximum number of iterations.
@@ -280,6 +282,12 @@ class GraphLasso(EmpiricalCovariance):
280282 The tolerance to declare convergence: if the dual gap goes below
281283 this value, iterations are stopped.
282284
285+ enet_tol : positive float, optional
286+ The tolerance for the elastic net solver used to calculate the descent
287+ direction. This parameter controls the accuracy of the search direction
288+ for a given column update, not of the overall parameter estimate. Only
289+ used for mode='cd'.
290+
283291 max_iter : integer, default 100
284292 The maximum number of iterations.
285293
@@ -309,11 +317,12 @@ class GraphLasso(EmpiricalCovariance):
309317 graph_lasso, GraphLassoCV
310318 """
311319
312- def __init__ (self , alpha = .01 , mode = 'cd' , tol = 1e-4 , max_iter = 100 ,
313- verbose = False , assume_centered = False ):
320+ def __init__ (self , alpha = .01 , mode = 'cd' , tol = 1e-4 , enet_tol = 1e-4 ,
321+ max_iter = 100 , verbose = False , assume_centered = False ):
314322 self .alpha = alpha
315323 self .mode = mode
316324 self .tol = tol
325+ self .enet_tol = enet_tol
317326 self .max_iter = max_iter
318327 self .verbose = verbose
319328 self .assume_centered = assume_centered
@@ -330,14 +339,14 @@ def fit(self, X, y=None):
330339 X , assume_centered = self .assume_centered )
331340 self .covariance_ , self .precision_ , self .n_iter_ = graph_lasso (
332341 emp_cov , alpha = self .alpha , mode = self .mode , tol = self .tol ,
333- max_iter = self .max_iter , verbose = self .verbose ,
334- return_n_iter = True )
342+ enet_tol = self .enet_tol , max_iter = self .max_iter ,
343+ verbose = self . verbose , return_n_iter = True )
335344 return self
336345
337346
338347# Cross-validation with GraphLasso
339348def graph_lasso_path (X , alphas , cov_init = None , X_test = None , mode = 'cd' ,
340- tol = 1e-4 , max_iter = 100 , verbose = False ):
349+ tol = 1e-4 , enet_tol = 1e-4 , max_iter = 100 , verbose = False ):
341350 """l1-penalized covariance estimator along a path of decreasing alphas
342351
343352 Parameters
@@ -360,6 +369,12 @@ def graph_lasso_path(X, alphas, cov_init=None, X_test=None, mode='cd',
360369 The tolerance to declare convergence: if the dual gap goes below
361370 this value, iterations are stopped.
362371
372+ enet_tol : positive float, optional
373+ The tolerance for the elastic net solver used to calculate the descent
374+ direction. This parameter controls the accuracy of the search direction
375+ for a given column update, not of the overall parameter estimate. Only
376+ used for mode='cd'.
377+
363378 max_iter : integer, optional
364379 The maximum number of iterations.
365380
@@ -396,7 +411,7 @@ def graph_lasso_path(X, alphas, cov_init=None, X_test=None, mode='cd',
396411 # Capture the errors, and move on
397412 covariance_ , precision_ = graph_lasso (
398413 emp_cov , alpha = alpha , cov_init = covariance_ , mode = mode , tol = tol ,
399- max_iter = max_iter , verbose = inner_verbose )
414+ enet_tol = enet_tol , max_iter = max_iter , verbose = inner_verbose )
400415 covariances_ .append (covariance_ )
401416 precisions_ .append (precision_ )
402417 if X_test is not None :
@@ -445,6 +460,12 @@ class GraphLassoCV(GraphLasso):
445460 The tolerance to declare convergence: if the dual gap goes below
446461 this value, iterations are stopped.
447462
463+ enet_tol : positive float, optional
464+ The tolerance for the elastic net solver used to calculate the descent
465+ direction. This parameter controls the accuracy of the search direction
466+ for a given column update, not of the overall parameter estimate. Only
467+ used for mode='cd'.
468+
448469 max_iter: integer, optional
449470 Maximum number of iterations.
450471
@@ -506,12 +527,13 @@ class GraphLassoCV(GraphLasso):
506527 """
507528
508529 def __init__ (self , alphas = 4 , n_refinements = 4 , cv = None , tol = 1e-4 ,
509- max_iter = 100 , mode = 'cd' , n_jobs = 1 , verbose = False ,
510- assume_centered = False ):
530+ enet_tol = 1e-4 , max_iter = 100 , mode = 'cd' , n_jobs = 1 ,
531+ verbose = False , assume_centered = False ):
511532 self .alphas = alphas
512533 self .n_refinements = n_refinements
513534 self .mode = mode
514535 self .tol = tol
536+ self .enet_tol = enet_tol
515537 self .max_iter = max_iter
516538 self .verbose = verbose
517539 self .cv = cv
@@ -572,7 +594,7 @@ def fit(self, X, y=None):
572594 delayed (graph_lasso_path )(
573595 X [train ], alphas = alphas ,
574596 X_test = X [test ], mode = self .mode ,
575- tol = self .tol ,
597+ tol = self .tol , enet_tol = self . enet_tol ,
576598 max_iter = int (.1 * self .max_iter ),
577599 verbose = inner_verbose )
578600 for train , test in cv )
@@ -644,6 +666,6 @@ def fit(self, X, y=None):
644666 # Finally fit the model with the selected alpha
645667 self .covariance_ , self .precision_ , self .n_iter_ = graph_lasso (
646668 emp_cov , alpha = best_alpha , mode = self .mode , tol = self .tol ,
647- max_iter = self .max_iter , verbose = inner_verbose ,
648- return_n_iter = True )
669+ enet_tol = self .enet_tol , max_iter = self . max_iter ,
670+ verbose = inner_verbose , return_n_iter = True )
649671 return self
0 commit comments