Source code for cca_zoo.linear._gradient._stochasticpls

from typing import List, Optional

import numpy as np

from cca_zoo.linear._gradient._ey import PLS_EY
from cca_zoo.linear._pls import PLSMixin


[docs] class PLSStochasticPower(PLS_EY, PLSMixin): def loss( self, representations: List[np.ndarray], independent_representations: Optional[List[np.ndarray]] = None, ): cov = np.cov(np.hstack(representations).T) return { "objective": np.trace( cov[: representations[0].shape[1], representations[0].shape[1] :] ) } def derivative( self, views: List[np.ndarray], representations: List[np.ndarray], independent_views: Optional[List[np.ndarray]] = None, independent_representations: Optional[List[np.ndarray]] = None, ): grads = [views[0].T @ representations[1], views[1].T @ representations[0]] return grads def on_training_step_start(self): self.weights_ = [self._orth(weights) for weights in self.weights_] @staticmethod def _orth(U): Qu, Ru = np.linalg.qr(U) Su = np.sign(np.sign(np.diag(Ru)) + 0.5) return Qu @ np.diag(Su)