8000 Fix sparse_cg solver when max_iter is specified. · scikit-learn/scikit-learn@c1eb8f9 · GitHub
[go: up one dir, main page]

Skip to content

Commit c1eb8f9

Browse files
committed
Fix sparse_cg solver when max_iter is specified.
1 parent 58be184 commit c1eb8f9

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

sklearn/linear_model/ridge.py

Lines changed: 12 additions & 4 deletions
8000
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from ..metrics.scorer import check_scoring
3030

3131

32-
def _solve_sparse_cg(X, y, alpha, max_iter=None, tol=1e-3):
32+
def _solve_sparse_cg(X, y, alpha, max_iter=None, tol=1e-3, verbose=0):
3333
n_samples, n_features = X.shape
3434
X1 = sp_linalg.aslinearoperator(X)
3535
coefs = np.empty((y.shape[1], n_features))
@@ -64,9 +64,13 @@ def _mv(x):
6464
(n_features, n_features), matvec=mv, dtype=X.dtype)
6565
coefs[i], info = sp_linalg.cg(C, y_column, maxiter=max_iter,
6666
tol=tol)
67-
if info != 0:
67+
if info < 0:
6868
raise ValueError("Failed with error code %d" % info)
6969

70+
if max_iter is None and info > 0 and verbose:
71+
warnings.warn("sparse_cg did not converge after %d iterations." %
72+
info)
73+
7074
return coefs
7175

7276

@@ -187,7 +191,7 @@ def _deprecate_dense_cholesky(solver):
187191

188192

189193
def ridge_regression(X, y, alpha, sample_weight=None, solver='auto',
190-
max_iter=None, tol=1e-3):
194+
max_iter=None, tol=1e-3, verbose=0):
191195
"""Solve the ridge equation by the method of normal equations.
192196
193197
Parameters
@@ -239,6 +243,10 @@ def ridge_regression(X, y, alpha, sample_weight=None, solver='auto',
239243
tol: float
240244
Precision of the solution.
241245
246+
verbose: int
247+
Verbosity level. Setting verbose > 0 will display additional information
248+
depending on the solver used.
249+
242250
Returns
243251
-------
244252
coef: array, shape = [n_features] or [n_targets, n_features]
@@ -306,7 +314,7 @@ def ridge_regression(X, y, alpha, sample_weight=None, solver='auto',
306314
raise ValueError('Solver %s not understood' % solver)
307315

308316
if solver == 'sparse_cg':
309-
coef = _solve_sparse_cg(X, y, alpha, max_iter, tol)
317+
coef = _solve_sparse_cg(X, y, alpha, max_iter, tol, verbose)
310318

311319
elif solver == "lsqr":
312320
coef = _solve_lsqr(X, y, alpha, max_iter, tol)

sklearn/linear_model/tests/test_ridge.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,3 +681,9 @@ def func():
681681
ridge_regression(X, y, alpha=1., solver=wrong_solver)
682682

683683
assert_raise_message(exception, message, func)
684+
685+
686+
def test_sparse_cg_max_iter():
687+
reg = Ridge(solver="sparse_cg", max_iter=1)
688+
reg.fit(X_diabetes, y_diabetes)
689+
assert_equal(reg.coef_.shape[0], X_diabetes.shape[1])

0 commit comments

Comments
 (0)
0