From bd09eb878ceb6186c874a1656ce239c5822d1972 Mon Sep 17 00:00:00 2001 From: jiawei-zhang-a Date: Wed, 29 Mar 2023 17:26:48 -0400 Subject: [PATCH 01/17] Bypassing initialization when initial values weights, means, and precision are given --- sklearn/mixture/_base.py | 15 ++++++++++++++- sklearn/mixture/_gaussian_mixture.py | 25 +++++++++++++++++++------ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/sklearn/mixture/_base.py b/sklearn/mixture/_base.py index a298dfec6a0da..c11faa1cffb11 100644 --- a/sklearn/mixture/_base.py +++ b/sklearn/mixture/_base.py @@ -48,6 +48,12 @@ class BaseMixture(DensityMixin, BaseEstimator, metaclass=ABCMeta): provides basic common methods for mixture models. """ + # _init_weights_means_precisions_skipped is intended to be used by + # derived classes to skip the initialization of parameters if all + # parameters are provided by the user. This is useful for example in + # BayesianGaussianMixture where the user can provide an initial value + _init_weights_means_precisions_skipped = False + _parameter_constraints: dict = { "n_components": [Interval(Integral, 1, None, closed="left")], "tol": [Interval(Real, 0.0, None, closed="left")], @@ -86,6 +92,7 @@ def __init__( self.warm_start = warm_start self.verbose = verbose self.verbose_interval = verbose_interval + self.all_params_enough_to_skip_initilization = False @abstractmethod def _check_parameters(self, X): @@ -110,11 +117,17 @@ def _initialize_parameters(self, X, random_state): """ n_samples, _ = X.shape + if self._init_weights_means_precisions_skipped: + self._initialize(X, None) + return + if self.init_params == "kmeans": resp = np.zeros((n_samples, self.n_components)) label = ( cluster.KMeans( - n_clusters=self.n_components, n_init=1, random_state=random_state + n_clusters=self.n_components, + n_init=1, + random_state=random_state, ) .fit(X) .labels_ diff --git a/sklearn/mixture/_gaussian_mixture.py b/sklearn/mixture/_gaussian_mixture.py index e0b630f37c163..66a63771e9442 100644 --- a/sklearn/mixture/_gaussian_mixture.py +++ b/sklearn/mixture/_gaussian_mixture.py @@ -685,6 +685,14 @@ def _check_parameters(self, X): """Check the Gaussian mixture parameters are well defined.""" _, n_features = X.shape + weights_initialized = self.weights_init is not None + means_initialized = self.means_init is not None + precisions_initialized = self.precisions_init is not None + + self._init_weights_means_precisions_skipped = ( + weights_initialized and means_initialized and precisions_initialized + ) + if self.weights_init is not None: self.weights_init = _check_weights(self.weights_init, self.n_components) @@ -711,14 +719,19 @@ def _initialize(self, X, resp): resp : array-like of shape (n_samples, n_components) """ n_samples, _ = X.shape + covariances = None - weights, means, covariances = _estimate_gaussian_parameters( - X, resp, self.reg_covar, self.covariance_type - ) - weights /= n_samples + if self._init_weights_means_precisions_skipped: + self.weights_ = self.weights_init + self.means_ = self.means_init + else: + weights, means, covariances = _estimate_gaussian_parameters( + X, resp, self.reg_covar, self.covariance_type + ) + weights /= n_samples - self.weights_ = weights if self.weights_init is None else self.weights_init - self.means_ = means if self.means_init is None else self.means_init + self.weights_ = weights if self.weights_init is None else self.weights_init + self.means_ = means if self.means_init is None else self.means_init if self.precisions_init is None: self.covariances_ = covariances From cbe04d6f4a67ed7503ff19dc6ea63417497806ac Mon Sep 17 00:00:00 2001 From: jiawei-zhang-a Date: Wed, 29 Mar 2023 17:29:02 -0400 Subject: [PATCH 02/17] Bypassing initialization when initial values weights, means, and precision are given --- sklearn/mixture/_base.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sklearn/mixture/_base.py b/sklearn/mixture/_base.py index c11faa1cffb11..fa1ce642d7311 100644 --- a/sklearn/mixture/_base.py +++ b/sklearn/mixture/_base.py @@ -92,7 +92,6 @@ def __init__( self.warm_start = warm_start self.verbose = verbose self.verbose_interval = verbose_interval - self.all_params_enough_to_skip_initilization = False @abstractmethod def _check_parameters(self, X): From c978dbfeecc3d9db9636174b277b593ba6c2fc62 Mon Sep 17 00:00:00 2001 From: jiawei-zhang-a Date: Fri, 31 Mar 2023 01:38:23 -0400 Subject: [PATCH 03/17] change the variable name to meet the standard --- sklearn/mixture/_base.py | 6 +++--- sklearn/mixture/_gaussian_mixture.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sklearn/mixture/_base.py b/sklearn/mixture/_base.py index fa1ce642d7311..739d5945a7895 100644 --- a/sklearn/mixture/_base.py +++ b/sklearn/mixture/_base.py @@ -48,11 +48,11 @@ class BaseMixture(DensityMixin, BaseEstimator, metaclass=ABCMeta): provides basic common methods for mixture models. """ - # _init_weights_means_precisions_skipped is intended to be used by + # init_skipped is intended to be used by # derived classes to skip the initialization of parameters if all # parameters are provided by the user. This is useful for example in # BayesianGaussianMixture where the user can provide an initial value - _init_weights_means_precisions_skipped = False + init_skipped = False _parameter_constraints: dict = { "n_components": [Interval(Integral, 1, None, closed="left")], @@ -116,7 +116,7 @@ def _initialize_parameters(self, X, random_state): """ n_samples, _ = X.shape - if self._init_weights_means_precisions_skipped: + if self.init_skipped: self._initialize(X, None) return diff --git a/sklearn/mixture/_gaussian_mixture.py b/sklearn/mixture/_gaussian_mixture.py index 66a63771e9442..8869d379abdd0 100644 --- a/sklearn/mixture/_gaussian_mixture.py +++ b/sklearn/mixture/_gaussian_mixture.py @@ -689,7 +689,7 @@ def _check_parameters(self, X): means_initialized = self.means_init is not None precisions_initialized = self.precisions_init is not None - self._init_weights_means_precisions_skipped = ( + self.init_skipped = ( weights_initialized and means_initialized and precisions_initialized ) @@ -721,7 +721,7 @@ def _initialize(self, X, resp): n_samples, _ = X.shape covariances = None - if self._init_weights_means_precisions_skipped: + if self.init_skipped: self.weights_ = self.weights_init self.means_ = self.means_init else: From f86fbba4e3246c83f5d9fc912b8771162034500e Mon Sep 17 00:00:00 2001 From: jiawei-zhang-a Date: Fri, 31 Mar 2023 09:42:14 -0400 Subject: [PATCH 04/17] Merged --- sklearn/mixture/_gaussian_mixture.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sklearn/mixture/_gaussian_mixture.py b/sklearn/mixture/_gaussian_mixture.py index 8869d379abdd0..c4b64c7a3e945 100644 --- a/sklearn/mixture/_gaussian_mixture.py +++ b/sklearn/mixture/_gaussian_mixture.py @@ -688,7 +688,6 @@ def _check_parameters(self, X): weights_initialized = self.weights_init is not None means_initialized = self.means_init is not None precisions_initialized = self.precisions_init is not None - self.init_skipped = ( weights_initialized and means_initialized and precisions_initialized ) From 2c99237e90b778323b98fbeb758105a080add3b2 Mon Sep 17 00:00:00 2001 From: jiawei-zhang-a Date: Fri, 31 Mar 2023 10:21:43 -0400 Subject: [PATCH 05/17] make the parameter private for base and GaussianMixture --- sklearn/mixture/_base.py | 6 +++--- sklearn/mixture/_gaussian_mixture.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sklearn/mixture/_base.py b/sklearn/mixture/_base.py index 739d5945a7895..b473be8e2b372 100644 --- a/sklearn/mixture/_base.py +++ b/sklearn/mixture/_base.py @@ -48,11 +48,11 @@ class BaseMixture(DensityMixin, BaseEstimator, metaclass=ABCMeta): provides basic common methods for mixture models. """ - # init_skipped is intended to be used by + # _init_skipped is intended to be used by # derived classes to skip the initialization of parameters if all # parameters are provided by the user. This is useful for example in # BayesianGaussianMixture where the user can provide an initial value - init_skipped = False + _init_skipped = False _parameter_constraints: dict = { "n_components": [Interval(Integral, 1, None, closed="left")], @@ -116,7 +116,7 @@ def _initialize_parameters(self, X, random_state): """ n_samples, _ = X.shape - if self.init_skipped: + if self._init_skipped: self._initialize(X, None) return diff --git a/sklearn/mixture/_gaussian_mixture.py b/sklearn/mixture/_gaussian_mixture.py index c4b64c7a3e945..157aa8d4a7c58 100644 --- a/sklearn/mixture/_gaussian_mixture.py +++ b/sklearn/mixture/_gaussian_mixture.py @@ -688,7 +688,7 @@ def _check_parameters(self, X): weights_initialized = self.weights_init is not None means_initialized = self.means_init is not None precisions_initialized = self.precisions_init is not None - self.init_skipped = ( + self._init_skipped = ( weights_initialized and means_initialized and precisions_initialized ) @@ -720,7 +720,7 @@ def _initialize(self, X, resp): n_samples, _ = X.shape covariances = None - if self.init_skipped: + if self._init_skipped: self.weights_ = self.weights_init self.means_ = self.means_init else: From 5cb80f696942cbaa9f318ed973d6c60b60410672 Mon Sep 17 00:00:00 2001 From: jiawei-zhang-a Date: Thu, 13 Apr 2023 21:12:03 -0400 Subject: [PATCH 06/17] no var --- doc/whats_new/v1.3.rst | 8 +++++++ sklearn/mixture/_base.py | 14 +------------ sklearn/mixture/_gaussian_mixture.py | 31 ++++++++++++++-------------- 3 files changed, 25 insertions(+), 28 deletions(-) diff --git a/doc/whats_new/v1.3.rst b/doc/whats_new/v1.3.rst index e47c74a54edd6..909b37142108b 100644 --- a/doc/whats_new/v1.3.rst +++ b/doc/whats_new/v1.3.rst @@ -43,6 +43,7 @@ random sampling procedures. :user:`Jérémie du Boisberranger `, :user:`Guillaume Lemaitre `. + Changes impacting all modules ----------------------------- @@ -366,6 +367,13 @@ Changelog - |API| The `eps` parameter of the :func:`log_loss` has been deprecated and will be removed in 1.5. :pr:`25299` by :user:`Omar Salman `. +:mod:`sklearn.mixture` +...................... + +- |Efficiency| :class:`GaussianMixture` is more efficient now and will bypass unnecessary + initialization like kmeans if the weights, means, and precision are given by users. + :pr:`26021` by :user:`Jiawei Zhang `. + :mod:`sklearn.model_selection` .............................. diff --git a/sklearn/mixture/_base.py b/sklearn/mixture/_base.py index b473be8e2b372..a298dfec6a0da 100644 --- a/sklearn/mixture/_base.py +++ b/sklearn/mixture/_base.py @@ -48,12 +48,6 @@ class BaseMixture(DensityMixin, BaseEstimator, metaclass=ABCMeta): provides basic common methods for mixture models. """ - # _init_skipped is intended to be used by - # derived classes to skip the initialization of parameters if all - # parameters are provided by the user. This is useful for example in - # BayesianGaussianMixture where the user can provide an initial value - _init_skipped = False - _parameter_constraints: dict = { "n_components": [Interval(Integral, 1, None, closed="left")], "tol": [Interval(Real, 0.0, None, closed="left")], @@ -116,17 +110,11 @@ def _initialize_parameters(self, X, random_state): """ n_samples, _ = X.shape - if self._init_skipped: - self._initialize(X, None) - return - if self.init_params == "kmeans": resp = np.zeros((n_samples, self.n_components)) label = ( cluster.KMeans( - n_clusters=self.n_components, - n_init=1, - random_state=random_state, + n_clusters=self.n_components, n_init=1, random_state=random_state ) .fit(X) .labels_ diff --git a/sklearn/mixture/_gaussian_mixture.py b/sklearn/mixture/_gaussian_mixture.py index 157aa8d4a7c58..e8a8f88ff0328 100644 --- a/sklearn/mixture/_gaussian_mixture.py +++ b/sklearn/mixture/_gaussian_mixture.py @@ -685,13 +685,6 @@ def _check_parameters(self, X): """Check the Gaussian mixture parameters are well defined.""" _, n_features = X.shape - weights_initialized = self.weights_init is not None - means_initialized = self.means_init is not None - precisions_initialized = self.precisions_init is not None - self._init_skipped = ( - weights_initialized and means_initialized and precisions_initialized - ) - if self.weights_init is not None: self.weights_init = _check_weights(self.weights_init, self.n_components) @@ -708,6 +701,17 @@ def _check_parameters(self, X): n_features, ) + def _initialize_parameters(self, X, random_state): + compute_resp = ( + self.weights_init is None + or self.means_init is None + or self.precisions_init is None + ) + if compute_resp: + super()._initialize_parameters(X, random_state) + else: + self._initialize(X, None) + def _initialize(self, X, resp): """Initialization of the Gaussian mixture parameters. @@ -718,19 +722,16 @@ def _initialize(self, X, resp): resp : array-like of shape (n_samples, n_components) """ n_samples, _ = X.shape - covariances = None - if self._init_skipped: - self.weights_ = self.weights_init - self.means_ = self.means_init - else: + if resp is not None: weights, means, covariances = _estimate_gaussian_parameters( X, resp, self.reg_covar, self.covariance_type ) - weights /= n_samples + if self.weights_init is None: + weights /= n_samples - self.weights_ = weights if self.weights_init is None else self.weights_init - self.means_ = means if self.means_init is None else self.means_init + self.weights_ = weights if self.weights_init is None else self.weights_init + self.means_ = means if self.means_init is None else self.means_init if self.precisions_init is None: self.covariances_ = covariances From b480670caa89870bdbc2f3eb6dd136ba1a6534bf Mon Sep 17 00:00:00 2001 From: Jiawei Zhang Date: Fri, 28 Apr 2023 14:04:42 -0400 Subject: [PATCH 07/17] Update sklearn/mixture/_gaussian_mixture.py Co-authored-by: Thomas J. Fan --- sklearn/mixture/_gaussian_mixture.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sklearn/mixture/_gaussian_mixture.py b/sklearn/mixture/_gaussian_mixture.py index e8a8f88ff0328..8bc7436c5dabe 100644 --- a/sklearn/mixture/_gaussian_mixture.py +++ b/sklearn/mixture/_gaussian_mixture.py @@ -702,6 +702,8 @@ def _check_parameters(self, X): ) def _initialize_parameters(self, X, random_state): + # If all the initial parameters are all provided, then there is no need to run + # the initialization. compute_resp = ( self.weights_init is None or self.means_init is None From b95b2f740834005aa463226031f2b30416e1c845 Mon Sep 17 00:00:00 2001 From: jiawei-zhang-a Date: Fri, 28 Apr 2023 14:29:14 -0400 Subject: [PATCH 08/17] Add test for bypassing --- doc/whats_new/v1.3.rst | 1 - .../mixture/tests/test_gaussian_mixture.py | 30 ++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/doc/whats_new/v1.3.rst b/doc/whats_new/v1.3.rst index 909b37142108b..1af5bc1a32650 100644 --- a/doc/whats_new/v1.3.rst +++ b/doc/whats_new/v1.3.rst @@ -43,7 +43,6 @@ random sampling procedures. :user:`Jérémie du Boisberranger `, :user:`Guillaume Lemaitre `. - Changes impacting all modules ----------------------------- diff --git a/sklearn/mixture/tests/test_gaussian_mixture.py b/sklearn/mixture/tests/test_gaussian_mixture.py index f2d634b3fffe5..9fc3ac2915ac3 100644 --- a/sklearn/mixture/tests/test_gaussian_mixture.py +++ b/sklearn/mixture/tests/test_gaussian_mixture.py @@ -34,7 +34,8 @@ from sklearn.utils._testing import assert_array_almost_equal from sklearn.utils._testing import assert_array_equal from sklearn.utils._testing import ignore_warnings - +from unittest.mock import Mock +import sklearn COVARIANCE_TYPE = ["full", "tied", "diag", "spherical"] @@ -1334,3 +1335,30 @@ def test_gaussian_mixture_single_component_stable(): X = rng.multivariate_normal(np.zeros(2), np.identity(2), size=3) gm = GaussianMixture(n_components=1) gm.fit(X).sample() + + +def test_gaussian_mixture_all_init_does_not_estimate_gaussian_parameters(monkeypatch): + """When all init are provided, the Gaussian parameters are not estimated. + + Non-regression test for gh26015. + """ + + mock = Mock(side_effect=_estimate_gaussian_parameters) + monkeypatch.setattr( + sklearn.mixture._gaussian_mixture, "_estimate_gaussian_parameters", mock + ) + + rng = np.random.RandomState(0) + rand_data = RandomData(rng) + + gm = GaussianMixture( + n_components=rand_data.n_components, + weights_init=rand_data.weights, + means_init=rand_data.means, + precisions_init=rand_data.precisions["full"], + random_state=rng, + ) + gm.fit(rand_data.X["full"]) + # The initial gaussian parameters are not estimated. They are estimated for every + # m_step. + assert mock.call_count == gm.n_iter_ From 83b7a7f17c862b31a822ef2954aa8d5806162584 Mon Sep 17 00:00:00 2001 From: Jiawei Zhang Date: Fri, 28 Apr 2023 14:55:08 -0400 Subject: [PATCH 09/17] Update sklearn/mixture/tests/test_gaussian_mixture.py Co-authored-by: Thomas J. Fan --- sklearn/mixture/tests/test_gaussian_mixture.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sklearn/mixture/tests/test_gaussian_mixture.py b/sklearn/mixture/tests/test_gaussian_mixture.py index 9fc3ac2915ac3..f0029cdcb3b40 100644 --- a/sklearn/mixture/tests/test_gaussian_mixture.py +++ b/sklearn/mixture/tests/test_gaussian_mixture.py @@ -1340,7 +1340,7 @@ def test_gaussian_mixture_single_component_stable(): def test_gaussian_mixture_all_init_does_not_estimate_gaussian_parameters(monkeypatch): """When all init are provided, the Gaussian parameters are not estimated. - Non-regression test for gh26015. + Non-regression test for gh-26015. """ mock = Mock(side_effect=_estimate_gaussian_parameters) From 403031cdb104228dbe5ec34fcc6b5c371742e302 Mon Sep 17 00:00:00 2001 From: jiawei-zhang-a Date: Fri, 28 Apr 2023 14:57:34 -0400 Subject: [PATCH 10/17] small adjustment --- sklearn/mixture/tests/test_gaussian_mixture.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sklearn/mixture/tests/test_gaussian_mixture.py b/sklearn/mixture/tests/test_gaussian_mixture.py index 9fc3ac2915ac3..4908e028df67f 100644 --- a/sklearn/mixture/tests/test_gaussian_mixture.py +++ b/sklearn/mixture/tests/test_gaussian_mixture.py @@ -34,6 +34,7 @@ from sklearn.utils._testing import assert_array_almost_equal from sklearn.utils._testing import assert_array_equal from sklearn.utils._testing import ignore_warnings + from unittest.mock import Mock import sklearn From bef22c6768998d232a2012059690c73cd45d1cce Mon Sep 17 00:00:00 2001 From: Jiawei Zhang Date: Wed, 9 Aug 2023 09:57:22 -0400 Subject: [PATCH 11/17] Update doc/whats_new/v1.3.rst Co-authored-by: Omar Salman --- doc/whats_new/v1.3.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/whats_new/v1.3.rst b/doc/whats_new/v1.3.rst index 1af5bc1a32650..24b7c81d09d9a 100644 --- a/doc/whats_new/v1.3.rst +++ b/doc/whats_new/v1.3.rst @@ -370,7 +370,7 @@ Changelog ...................... - |Efficiency| :class:`GaussianMixture` is more efficient now and will bypass unnecessary - initialization like kmeans if the weights, means, and precision are given by users. + initialization if the weights, means, and precision are given by users. :pr:`26021` by :user:`Jiawei Zhang `. :mod:`sklearn.model_selection` From a080d40a73ee6b6ec98c96260529f2a521a13921 Mon Sep 17 00:00:00 2001 From: Jiawei Zhang Date: Wed, 9 Aug 2023 09:57:38 -0400 Subject: [PATCH 12/17] Update sklearn/mixture/_gaussian_mixture.py Co-authored-by: Omar Salman --- sklearn/mixture/_gaussian_mixture.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sklearn/mixture/_gaussian_mixture.py b/sklearn/mixture/_gaussian_mixture.py index 8bc7436c5dabe..8ae7db1cc2985 100644 --- a/sklearn/mixture/_gaussian_mixture.py +++ b/sklearn/mixture/_gaussian_mixture.py @@ -724,7 +724,7 @@ def _initialize(self, X, resp): resp : array-like of shape (n_samples, n_components) """ n_samples, _ = X.shape - + weights, means, covariances = None, None, None if resp is not None: weights, means, covariances = _estimate_gaussian_parameters( X, resp, self.reg_covar, self.covariance_type From 67a26403050618e6129624b81abab5b6011c5cb5 Mon Sep 17 00:00:00 2001 From: Jiawei Zhang Date: Thu, 10 Aug 2023 09:04:15 -0400 Subject: [PATCH 13/17] Update doc/whats_new/v1.3.rst Co-authored-by: Omar Salman --- doc/whats_new/v1.3.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/whats_new/v1.3.rst b/doc/whats_new/v1.3.rst index 2a38d12fc73ad..932ca1e01b6d6 100644 --- a/doc/whats_new/v1.3.rst +++ b/doc/whats_new/v1.3.rst @@ -623,7 +623,7 @@ Changelog ...................... - |Efficiency| :class:`GaussianMixture` is more efficient now and will bypass unnecessary - initialization if the weights, means, and precision are given by users. + initialization if the weights, means, and precisions are given by users. :pr:`26021` by :user:`Jiawei Zhang `. :mod:`sklearn.model_selection` From 3e3d8287fa016e20dd54691a3a0decddd44695f6 Mon Sep 17 00:00:00 2001 From: Jiawei Zhang Date: Thu, 10 Aug 2023 09:04:21 -0400 Subject: [PATCH 14/17] Update sklearn/mixture/tests/test_gaussian_mixture.py Co-authored-by: Omar Salman --- sklearn/mixture/tests/test_gaussian_mixture.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sklearn/mixture/tests/test_gaussian_mixture.py b/sklearn/mixture/tests/test_gaussian_mixture.py index bc5ca19a9a649..0dca1c91bfd92 100644 --- a/sklearn/mixture/tests/test_gaussian_mixture.py +++ b/sklearn/mixture/tests/test_gaussian_mixture.py @@ -1391,7 +1391,10 @@ def test_gaussian_mixture_single_component_stable(): gm.fit(X).sample() -def test_gaussian_mixture_all_init_does_not_estimate_gaussian_parameters(monkeypatch): +def test_gaussian_mixture_all_init_does_not_estimate_gaussian_parameters( + monkeypatch, + global_random_seed, +): """When all init are provided, the Gaussian parameters are not estimated. Non-regression test for gh-26015. From 981301cbdfef4324b0213b8141885bb780f36965 Mon Sep 17 00:00:00 2001 From: Jiawei Zhang Date: Thu, 10 Aug 2023 09:04:34 -0400 Subject: [PATCH 15/17] Update sklearn/mixture/tests/test_gaussian_mixture.py Co-authored-by: Omar Salman --- sklearn/mixture/tests/test_gaussian_mixture.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sklearn/mixture/tests/test_gaussian_mixture.py b/sklearn/mixture/tests/test_gaussian_mixture.py index 0dca1c91bfd92..ce6fd573e4a22 100644 --- a/sklearn/mixture/tests/test_gaussian_mixture.py +++ b/sklearn/mixture/tests/test_gaussian_mixture.py @@ -1395,7 +1395,7 @@ def test_gaussian_mixture_all_init_does_not_estimate_gaussian_parameters( monkeypatch, global_random_seed, ): - """When all init are provided, the Gaussian parameters are not estimated. + """When all init parameters are provided, the Gaussian parameters are not estimated. Non-regression test for gh-26015. """ From 9f38ea7071db7b89cd7c5be9eddd7cc1772d44c4 Mon Sep 17 00:00:00 2001 From: Jiawei Zhang Date: Thu, 10 Aug 2023 09:04:40 -0400 Subject: [PATCH 16/17] Update sklearn/mixture/tests/test_gaussian_mixture.py Co-authored-by: Omar Salman --- sklearn/mixture/tests/test_gaussian_mixture.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sklearn/mixture/tests/test_gaussian_mixture.py b/sklearn/mixture/tests/test_gaussian_mixture.py index ce6fd573e4a22..8656a453d22aa 100644 --- a/sklearn/mixture/tests/test_gaussian_mixture.py +++ b/sklearn/mixture/tests/test_gaussian_mixture.py @@ -1405,7 +1405,7 @@ def test_gaussian_mixture_all_init_does_not_estimate_gaussian_parameters( sklearn.mixture._gaussian_mixture, "_estimate_gaussian_parameters", mock ) - rng = np.random.RandomState(0) + rng = np.random.RandomState(global_random_seed) rand_data = RandomData(rng) gm = GaussianMixture( From 9ce05cecc8f8dd02bd3b65b68c2decc5c5c955fe Mon Sep 17 00:00:00 2001 From: jiawei-zhang-a Date: Thu, 10 Aug 2023 09:15:25 -0400 Subject: [PATCH 17/17] change line for > 80 character --- sklearn/mixture/tests/test_gaussian_mixture.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sklearn/mixture/tests/test_gaussian_mixture.py b/sklearn/mixture/tests/test_gaussian_mixture.py index 8656a453d22aa..e24a6af966374 100644 --- a/sklearn/mixture/tests/test_gaussian_mixture.py +++ b/sklearn/mixture/tests/test_gaussian_mixture.py @@ -1395,7 +1395,8 @@ def test_gaussian_mixture_all_init_does_not_estimate_gaussian_parameters( monkeypatch, global_random_seed, ): - """When all init parameters are provided, the Gaussian parameters are not estimated. + """When all init parameters are provided, the Gaussian parameters + are not estimated. Non-regression test for gh-26015. """