Skip to content

Commit

Permalink
[MRG+1]Update discriminant analysis code for better memory usage (#10904
Browse files Browse the repository at this point in the history
)
  • Loading branch information
bobchennan authored and TomDLT committed Apr 25, 2018
1 parent 8c3e028 commit 481dac7
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 12 deletions.
4 changes: 4 additions & 0 deletions doc/whats_new/v0.20.rst
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,10 @@ Classifiers and regressors
:class:`neighbors.RadiusNeighborsClassifier` are now
parallelized according to ``n_jobs`` regardless of ``algorithm``.
:issue:`8003` by :user:`Joël Billaud <recamshak>`.

- Memory usage improvement for :func:`_class_means` and :func:`_class_cov`
in :class:`discriminant_analysis`.
:issue:`10898` by :user:`Nanxin Chen <bobchennan>`.`

Cluster

Expand Down
24 changes: 12 additions & 12 deletions sklearn/discriminant_analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,18 +83,18 @@ def _class_means(X, y):
Returns
-------
means : array-like, shape (n_features,)
means : array-like, shape (n_classes, n_features)
Class means.
"""
means = []
classes = np.unique(y)
for group in classes:
Xg = X[y == group, :]
means.append(Xg.mean(0))
return np.asarray(means)
classes, y = np.unique(y, return_inverse=True)
cnt = np.bincount(y)
means = np.zeros(shape=(len(classes), X.shape[1]))
np.add.at(means, y, X)
means /= cnt[:, None]
return means


def _class_cov(X, y, priors=None, shrinkage=None):
def _class_cov(X, y, priors, shrinkage=None):
"""Compute class covariance matrix.
Parameters
Expand All @@ -120,11 +120,11 @@ def _class_cov(X, y, priors=None, shrinkage=None):
Class covariance matrix.
"""
classes = np.unique(y)
covs = []
for group in classes:
cov = np.zeros(shape=(X.shape[1], X.shape[1]))
for idx, group in enumerate(classes):
Xg = X[y == group, :]
covs.append(np.atleast_2d(_cov(Xg, shrinkage)))
return np.average(covs, axis=0, weights=priors)
cov += priors[idx] * np.atleast_2d(_cov(Xg, shrinkage))
return cov


class LinearDiscriminantAnalysis(BaseEstimator, LinearClassifierMixin,
Expand Down

0 comments on commit 481dac7

Please sign in to comment.