Source code for cca_zoo.linear._pls

import numpy as np

from cca_zoo.linear._mcca import MCCA, rCCA


def reduce_dims(x):
    U, S, _ = np.linalg.svd(x, full_matrices=False)
    return U @ np.diag(S)


class PLSMixin:
    def _more_tags(self):
        # Indicate that this class is for multiview data
        return {"pls": True}


[docs] class PLS(rCCA, PLSMixin): r""" A class used to fit a simple PLS model. This model finds the linear projections of two representations that maximize their covariance. Implements PLS by inheriting regularised CCA with maximal regularisation. This is equivalent to solving the following optimization problem: .. math:: w_{opt}=\underset{w}{\mathrm{argmax}}\{ w_1^TX_1^TX_2w_2 \}\\ \text{subject to:} w_1^Tw_1=1 w_2^Tw_2=1 Parameters ---------- latent_dimensions: int, optional Number of latent dimensions to use, by default 1 copy_data: bool, optional Whether to copy the data, by default True random_state: int, optional Random state, by default None Examples -------- >>> import numpy as np >>> X1 = np.random.rand(100, 5) >>> X2 = np.random.rand(100, 5) >>> pls = PLS(latent_dimensions=2) >>> pls.fit([X1, X2]) """ def __init__( self, latent_dimensions: int = 1, copy_data=True, random_state=None, ): # Call the parent class constructor with c=1 to enable maximal regularization super().__init__( latent_dimensions=latent_dimensions, copy_data=copy_data, c=1, random_state=random_state, )
[docs] class MPLS(MCCA, PLSMixin): r""" A class used to fit a mutiview PLS model. This model finds the linear projections of two representations that maximize their covariance. Implements PLS by inheriting regularised CCA with maximal regularisation. This is equivalent to solving the following optimization problem: Parameters ---------- latent_dimensions: int, optional Number of latent dimensions to use, by default 1 copy_data: bool, optional Whether to copy the data, by default True random_state: int, optional Random state, by default None """ def __init__( self, latent_dimensions: int = 1, copy_data=True, random_state=None, ): # Call the parent class constructor with c=1 to enable maximal regularization super().__init__( latent_dimensions=latent_dimensions, copy_data=copy_data, c=1, random_state=random_state, )