def _fit(self, X, y): """ Parameters ---------- X: list of 2d-arrays, (n_classes, n_dims, n_samples) y: array, (n_classes) """ dic = [subspace_bases(_X, self.n_subdims) for _X in X] # dic, (n_classes, n_dims, n_subdims) dic = np.array(dic) # all_bases, (n_dims, n_classes * n_subdims) all_bases = np.hstack(dic) # n_gds_dims if 0.0 < self.n_gds_dims <= 1.0: n_gds_dims = int(all_bases.shape[1] * self.n_gds_dims) else: n_gds_dims = self.n_gds_dims # gds, (n_dims, n_gds_dims) self.gds = subspace_bases(all_bases, n_gds_dims, higher=False) dic = self._gds_projection(dic) self.dic = dic
def _fit(self, X, y): """ Parameters ---------- X: list of 2d-arrays, (n_classes, n_dims, n_samples) y: array, (n_classes) """ dic = [subspace_bases(_X, self.n_subdims) for _X in X] # dic, (n_classes, n_dims, n_subdims) dic = np.array(dic) self.dic = dic
def _get_gramians(self, X): """ Parameters ---------- X: array, (n_dims, n_samples) Returns ------- G: array, (n_class, n_subdims, n_subdims) gramian matricies of references of each class """ # bases, (n_dims, n_subdims) bases = subspace_bases(X, self.test_n_subdims) # grammians, (n_classes, n_subdims, n_subdims or greater) dic = self.dic[:, :, :self.n_subdims] gramians = np.dot(dic.transpose(0, 2, 1), bases) return gramians
def _get_gramians(self, X): """ Parameters ---------- X: array, (n_dims, n_samples) Returns ------- G: array, (n_class, n_subdims, n_subdims) gramian matricies of references of each class """ # bases, (n_dims, n_subdims) bases = subspace_bases(X, self.n_subdims) # bases, (n_gds_dims, n_subdims) bases = self._gds_projection(bases) # gramians, (n_classes, n_subdims, n_subdims) gramians = np.dot(self.dic.transpose(0, 2, 1), bases) return gramians
def _get_gramians(self, X): """ Parameters ---------- X: array, (n_dims, n_samples) Returns ------- G: array, (n_class, n_subdims, n_subdims) gramian matricies of references of each class """ # K, (n_class * n_samples_train, n_samples) K = rbf_kernel(self.train_stack_X, X) # X_gds, (n_gds_dims, n_samples) X_gds = np.dot(self.gds_coeff.T, K) # input subspace bases bases = subspace_bases(X_gds, self.n_subdims) # grammians, (n_classes, n_subdims, n_subdims) gramians = np.dot(self.dic.transpose(0, 2, 1), bases) return gramians
def _fit(self, X, y): """ Parameters ---------- X: list of 2d-arrays, (n_classes, n_dims, n_samples) y: array, (n_classes) """ # mapings, (n_classes * n_samples) mappings = np.array([ i for i, _X in enumerate(X) for _ in range(_X.shape[1]) ]) # stack_X, (n_dims, n_classes * n_samples) stack_X = np.hstack(X) # K, (n_classes * n_samples, n_classes * n_samples) K = rbf_kernel(stack_X, stack_X, self.sigma) coeff = [] for i, _ in enumerate(X): p = (mappings == i) # clipping K(X[y==c], X[y==c]) # _K, (n_samples_i, n_samples_i) _K = K[p][:, p] _coeff, _ = dual_vectors(_K, self.n_subdims) coeff.append(_coeff) # coeff, (n_classes * n_samples, n_classes * n_subdims) coeff = block_diag(*coeff) # gramian, (n_classes * n_subdims, n_classes * n_subdims) gramian = coeff.T @ K @ coeff # n_gds_dims if 0.0 < self.n_gds_dims <= 1.0: n_gds_dims = int(gramian.shape[0] * self.n_gds_dims) else: n_gds_dims = self.n_gds_dims # coefficients of `bases in feature space` to get GDS bases in feature space # gds_coeff, (n_classes * n_subdims, n_gds_dims) gds_coeff, _ = dual_vectors(gramian, n_gds_dims, higher=False) # coefficients of `given data X in feature space` to get GDS bases in features space # gds_coeff, (n_classes * n_samples, n_gds_dims) gds_coeff = np.dot(coeff, gds_coeff) # X_gds = (GDS bases in feature space).T @ (X_stacked in feature space) # projection coefficients of GDS in feature space. # this vectors have finite dimension, such as n_gds_dims, # and these vectors can treat as linear feature. # X_gds, (n_gds_dims, n_classes * n_samples) X_gds = np.dot(gds_coeff.T, K) # X_gds, (n_classes, n_gds_dims, n_samples) X_gds = [X_gds[:, mappings == i] for i, _ in enumerate(X)] # dic, (n_classes, n_dims, n_subdims) dic = [subspace_bases(_X, self.n_subdims) for _X in X_gds] dic = np.array(dic) self.train_stack_X = stack_X self.mappings = mappings self.gds_coeff = gds_coeff self.dic = dic