diff --git a/sklearn/covariance/robust_covariance.py b/sklearn/covariance/robust_covariance.py index afacb1fa4a690..1d80b34fc4ce1 100644 --- a/sklearn/covariance/robust_covariance.py +++ b/sklearn/covariance/robust_covariance.py @@ -118,7 +118,7 @@ def _c_step(X, n_support, random_state, remaining_iterations=30, # Iterative procedure for Minimum Covariance Determinant computation det = fast_logdet(covariance) previous_det = np.inf - while (det < previous_det) and (remaining_iterations > 0): + while (det < previous_det) and (remaining_iterations > 0) and not (np.isinf(det)): # save old estimates values previous_location = location previous_covariance = covariance @@ -140,14 +140,9 @@ def _c_step(X, n_support, random_state, remaining_iterations=30, previous_dist = dist dist = (np.dot(X - location, precision) * (X - location)).sum(axis=1) - # Catch computation errors + # Check if best fit already found (det => 0, logdet => -inf) if np.isinf(det): - raise ValueError( - "Singular covariance matrix. " - "Please check that the covariance matrix corresponding " - "to the dataset is full rank and that MinCovDet is used with " - "Gaussian-distributed data (or at least data drawn from a " - "unimodal, symmetric distribution.") + results = location, covariance, det, support, dist # Check convergence if np.allclose(det, previous_det): # c_step procedure converged @@ -361,9 +356,10 @@ def fast_mcd(X, support_fraction=None, X = np.asarray(X) if X.ndim == 1: - X = np.reshape(X, (1, -1)) - warnings.warn("Only one sample available. " - "You may want to reshape your data array") + X = np.reshape(X, (-1, 1)) + warnings.warn("1D array passed in. " + "Assuming the array contains samples, not features. " + "You may wish to reshape your data.") n_samples, n_features = X.shape # minimum breakdown value