diff --git a/sklearn/decomposition/_kernel_pca.py b/sklearn/decomposition/_kernel_pca.py index 3e5652acb5fcf..d8910f8f49e5d 100644 --- a/sklearn/decomposition/_kernel_pca.py +++ b/sklearn/decomposition/_kernel_pca.py @@ -324,10 +324,10 @@ def _get_kernel(self, X, Y=None): X, Y, metric=self.kernel, filter_params=True, n_jobs=self.n_jobs, **params ) - def _fit_transform(self, K): + def _fit_transform_in_place(self, K): """Fit's using kernel K""" - # center kernel - K = self._centerer.fit_transform(K) + # center kernel in place + K = self._centerer.fit(K).transform(K, copy=False) # adjust n_components according to user inputs if self.n_components is None: @@ -438,7 +438,9 @@ def fit(self, X, y=None): self.gamma_ = 1 / X.shape[1] if self.gamma is None else self.gamma self._centerer = KernelCenterer().set_output(transform="default") K = self._get_kernel(X) - self._fit_transform(K) + # When kernel="precomputed", K is X but it's safe to perform in place operations + # on K because a copy was made before if requested by copy_X. + self._fit_transform_in_place(K) if self.fit_inverse_transform: # no need to use the kernel to transform X, use shortcut expression