|
33 | 33 | from ..exceptions import ConvergenceWarning
|
34 | 34 |
|
35 | 35 |
|
36 |
| -def _solve_sparse_cg(X, y, alpha, max_iter=None, tol=1e-3, verbose=0, |
37 |
| - X_offset=None, X_scale=None): |
38 |
| - |
39 |
| - def _get_rescaled_operator(X): |
40 |
| - |
41 |
| - X_offset_scale = X_offset / X_scale |
42 |
| - |
43 |
| - def matvec(b): |
44 |
| - return X.dot(b) - b.dot(X_offset_scale) |
45 |
| - |
46 |
| - def rmatvec(b): |
47 |
| - return X.T.dot(b) - X_offset_scale * np.sum(b) |
48 |
| - |
49 |
| - X1 = sparse.linalg.LinearOperator(shape=X.shape, |
50 |
| - matvec=matvec, |
51 |
| - rmatvec=rmatvec) |
52 |
| - return X1 |
53 |
| - |
| 36 | +def _solve_sparse_cg(X, y, alpha, max_iter=None, tol=1e-3, verbose=0): |
54 | 37 | n_samples, n_features = X.shape
|
55 |
| - |
56 |
| - if X_offset is None or X_scale is None: |
57 |
| - X1 = sp_linalg.aslinearoperator(X) |
58 |
| - else: |
59 |
| - X1 = _get_rescaled_operator(X) |
60 |
| - |
| 38 | + X1 = sp_linalg.aslinearoperator(X) |
61 | 39 | coefs = np.empty((y.shape[1], n_features), dtype=X.dtype)
|
62 | 40 |
|
63 | 41 | if n_features > n_samples:
|
@@ -348,25 +326,6 @@ def ridge_regression(X, y, alpha, sample_weight=None, solver='auto',
|
348 | 326 | -----
|
349 | 327 | This function won't compute the intercept.
|
350 | 328 | """
|
351 |
| - |
352 |
| - return _ridge_regression(X, y, alpha, |
353 |
| - sample_weight=sample_weight, |
354 |
| - solver=solver, |
355 |
| - max_iter=max_iter, |
356 |
| - tol=tol, |
357 |
| - verbose=verbose, |
358 |
| - random_state=random_state, |
359 |
| - return_n_iter=return_n_iter, |
360 |
| - return_intercept=return_intercept, |
361 |
| - X_scale=None, |
362 |
| - X_offset=None) |
363 |
| - |
364 |
| - |
365 |
| -def _ridge_regression(X, y, alpha, sample_weight=None, solver='auto', |
366 |
| - max_iter=None, tol=1e-3, verbose=0, random_state=None, |
367 |
| - return_n_iter=False, return_intercept=False, |
368 |
| - X_scale=None, X_offset=None): |
369 |
| - |
370 | 329 | if return_intercept and sparse.issparse(X) and solver != 'sag':
|
371 | 330 | if solver != 'auto':
|
372 | 331 | warnings.warn("In Ridge, only 'sag' solver can currently fit the "
|
@@ -436,12 +395,7 @@ def _ridge_regression(X, y, alpha, sample_weight=None, solver='auto',
|
436 | 395 |
|
437 | 396 | n_iter = None
|
438 | 397 | if solver == 'sparse_cg':
|
439 |
| - coef = _solve_sparse_cg(X, y, alpha, |
440 |
| - max_iter=max_iter, |
441 |
| - tol=tol, |
442 |
| - verbose=verbose, |
443 |
| - X_offset=X_offset, |
444 |
| - X_scale=X_scale) |
| 398 | + coef = _solve_sparse_cg(X, y, alpha, max_iter, tol, verbose) |
445 | 399 |
|
446 | 400 | elif solver == 'lsqr':
|
447 | 401 | coef, n_iter = _solve_lsqr(X, y, alpha, max_iter, tol)
|
@@ -538,35 +492,24 @@ def fit(self, X, y, sample_weight=None):
|
538 | 492 | np.atleast_1d(sample_weight).ndim > 1):
|
539 | 493 | raise ValueError("Sample weights must be 1D array or scalar")
|
540 | 494 |
|
541 |
| - # when X is sparse we only remove offset from y |
542 | 495 | X, y, X_offset, y_offset, X_scale = self._preprocess_data(
|
543 | 496 | X, y, self.fit_intercept, self.normalize, self.copy_X,
|
544 |
| - sample_weight=sample_weight, return_mean=True) |
| 497 | + sample_weight=sample_weight) |
545 | 498 |
|
546 | 499 | # temporary fix for fitting the intercept with sparse data using 'sag'
|
547 |
| - if (sparse.issparse(X) and self.fit_intercept and |
548 |
| - self.solver != 'sparse_cg'): |
549 |
| - self.coef_, self.n_iter_, self.intercept_ = _ridge_regression( |
| 500 | + if sparse.issparse(X) and self.fit_intercept: |
| 501 | + self.coef_, self.n_iter_, self.intercept_ = ridge_regression( |
550 | 502 | X, y, alpha=self.alpha, sample_weight=sample_weight,
|
551 | 503 | max_iter=self.max_iter, tol=self.tol, solver=self.solver,
|
552 | 504 | random_state=self.random_state, return_n_iter=True,
|
553 | 505 | return_intercept=True)
|
554 |
| - # add the offset which was subtracted by _preprocess_data |
555 | 506 | self.intercept_ += y_offset
|
556 | 507 | else:
|
557 |
| - if sparse.issparse(X): |
558 |
| - # required to fit intercept with sparse_cg solver |
559 |
| - params = {'X_offset': X_offset, 'X_scale': X_scale} |
560 |
| - else: |
561 |
| - # for dense matrices or when intercept is set to 0 |
562 |
| - params = {} |
563 |
| - |
564 |
| - self.coef_, self.n_iter_ = _ridge_regression( |
| 508 | + self.coef_, self.n_iter_ = ridge_regression( |
565 | 509 | X, y, alpha=self.alpha, sample_weight=sample_weight,
|
566 | 510 | max_iter=self.max_iter, tol=self.tol, solver=self.solver,
|
567 | 511 | random_state=self.random_state, return_n_iter=True,
|
568 |
| - return_intercept=False, **params) |
569 |
| - |
| 512 | + return_intercept=False) |
570 | 513 | self._set_intercept(X_offset, y_offset, X_scale)
|
571 | 514 |
| 572 | 515 | return self
|
|
0 commit comments