diff --git a/sklearn/covariance/graph_lasso_.py b/sklearn/covariance/graph_lasso_.py index 72a02a2bf1f3cd6be161094167fd8ef57f746453..ade0b71b62bf28595234a4f13217cd534d81d62b 100644 --- a/sklearn/covariance/graph_lasso_.py +++ b/sklearn/covariance/graph_lasso_.py @@ -69,14 +69,15 @@ def alpha_max(emp_cov): ############################################################################### # The g-lasso algorithm -def graph_lasso(X, alpha, cov_init=None, mode='cd', tol=1e-4, max_iter=100, - verbose=False, return_costs=False, eps=np.finfo(np.float).eps): +def graph_lasso(emp_cov, alpha, cov_init=None, mode='cd', tol=1e-4, + max_iter=100, verbose=False, return_costs=False, + eps=np.finfo(np.float).eps): """l1-penalized covariance estimator Parameters ---------- - X: 2D ndarray, shape (n_samples, n_features) - Data from which to compute the covariance estimate + emp_cov: 2D ndarray, shape (n_features, n_features) + Empirical covariance from which to compute the covariance estimate alpha: positive float The regularization parameter: the higher alpha, the more regularization, the sparser the inverse covariance @@ -126,8 +127,7 @@ def graph_lasso(X, alpha, cov_init=None, mode='cd', tol=1e-4, max_iter=100, One possible difference with the `glasso` R package is that the diagonal coefficients are not penalized. """ - _, n_features = X.shape - emp_cov = empirical_covariance(X) + _, n_features = emp_cov.shape if alpha == 0: return emp_cov, linalg.inv(emp_cov) if cov_init is None: @@ -202,7 +202,7 @@ def graph_lasso(X, alpha, cov_init=None, mode='cd', tol=1e-4, max_iter=100, ConvergenceWarning) except FloatingPointError, e: e.args = (e.args[0] - + 'The system is too ill-conditioned for this solver', + + '. The system is too ill-conditioned for this solver', ) raise e if return_costs: @@ -246,8 +246,8 @@ class GraphLasso(EmpiricalCovariance): graph_lasso, GraphLassoCV """ - def __init__(self, alpha=.01, mode='cd', tol=1e-4, - max_iter=100, verbose=False): + def __init__(self, alpha=.01, mode='cd', tol=1e-4, max_iter=100, + verbose=False): self.alpha = alpha self.mode = mode self.tol = tol @@ -255,7 +255,8 @@ class GraphLasso(EmpiricalCovariance): self.verbose = verbose def fit(self, X, y=None): - self.covariance_, self.precision_ = graph_lasso(X, + emp_cov = empirical_covariance(X) + self.covariance_, self.precision_ = graph_lasso(emp_cov, alpha=self.alpha, mode=self.mode, tol=self.tol, max_iter=self.max_iter, verbose=self.verbose, @@ -301,8 +302,9 @@ def graph_lasso_path(X, alphas, cov_init=None, X_test=None, mode='cd', Returned only if test data is passed. """ inner_verbose = max(0, verbose - 1) + emp_cov = empirical_covariance(X) if cov_init is None: - covariance_ = empirical_covariance(X) + covariance_ = emp_cov.copy() else: covariance_ = cov_init covariances_ = list() @@ -313,7 +315,7 @@ def graph_lasso_path(X, alphas, cov_init=None, X_test=None, mode='cd', for alpha in alphas: try: # Capture the errors, and move on - covariance_, precision_ = graph_lasso(X, alpha=alpha, + covariance_, precision_ = graph_lasso(emp_cov, alpha=alpha, cov_init=covariance_, mode=mode, tol=tol, max_iter=max_iter, verbose=inner_verbose) @@ -408,7 +410,6 @@ class GraphLassoCV(GraphLasso): def __init__(self, alphas=4, n_refinements=4, cv=None, tol=1e-4, max_iter=100, mode='cd', n_jobs=1, verbose=False): - self.alphas = alphas self.n_refinements = n_refinements self.mode = mode @@ -420,6 +421,7 @@ class GraphLassoCV(GraphLasso): def fit(self, X, y=None): X = np.asarray(X) + emp_cov = empirical_covariance(X) cv = check_cv(self.cv, X, y, classifier=False) @@ -433,7 +435,6 @@ class GraphLassoCV(GraphLasso): n_refinements = 1 else: n_refinements = self.n_refinements - emp_cov = empirical_covariance(X) alpha_1 = alpha_max(emp_cov) alpha_0 = 1e-2 * alpha_1 alphas = np.logspace(np.log10(alpha_0), @@ -526,7 +527,7 @@ class GraphLassoCV(GraphLasso): self.cv_alphas_ = alphas # Finally fit the model with the selected alpha - self.covariance_, self.precision_ = graph_lasso(X, alpha=best_alpha, - mode=self.mode, tol=self.tol, max_iter=self.max_iter, - verbose=inner_verbose) + self.covariance_, self.precision_ = graph_lasso(emp_cov, + alpha=best_alpha, mode=self.mode, tol=self.tol, + max_iter=self.max_iter, verbose=inner_verbose) return self