def SPD_Project(mat): # force symmetric mat = (mat + mat.T) / 2.0 eig, eigv = linalg.eig(mat) eig = T.maximum(eig, 0) eig = T.diag(eig) return eigv.dot(eig).dot(eigv.T)
def th_MvLDAN(data_inputs, labels): n_view = len(data_inputs) dtype = 'float32' mean = [] std = [] data = [] for v in range(n_view): _data = theano.shared(data_inputs[v]) _mean = T.mean(_data, axis=0).reshape([1, -1]) _std = T.std(_data, axis=0).reshape([1, -1]) _std += T.eq(_std, 0).astype(dtype) data.append((_data - _mean) / _std) mean.append(_mean) std.append(_std) Sw, Sb, _ = th_MvLDAN_Sw_Sb(data, labels) from theano.tensor import nlinalg eigvals, eigvecs = nlinalg.eig(T.dot(nlinalg.matrix_inverse(Sw), Sb)) # evals = slinalg.eigvalsh(Sb, Sw) mean = list(theano.function([], mean)()) std = list(theano.function([], std)()) eigvals, eigvecs = theano.function([], [eigvals, eigvecs])() inx = np.argsort(eigvals)[::-1] eigvals = eigvals[inx] eigvecs = eigvecs[:, inx] W = [] pre = 0 for v in range(n_view): W.append(eigvecs[pre:pre + mean[v].shape[1], :]) pre += mean[v].shape[1] return [mean, std], W, eigvals
def SPD_Project(mat): # force symmetric mat = (mat+mat.T)/2.0 eig, eigv = linalg.eig(mat) eig = T.maximum(eig, 0) eig = T.diag(eig) return eigv.dot(eig).dot(eigv.T)
def __theano_SPDproject(self, mat): # force symmetric mat = (mat + mat.T) / 2.0 eig, eigv = linalg.eig(mat) eig = T.maximum(eig, 0) eig = T.diag(eig) return eigv.dot(eig).dot(eigv.T)
def __theano_SPDproject(self, mat): # force symmetric mat = (mat+mat.T)/2.0 eig, eigv = linalg.eig(mat) eig = T.maximum(eig, 0) eig = T.diag(eig) return eigv.dot(eig).dot(eigv.T)
def PSD_Project(mat): mat = (mat+mat.T)/2.0 eig, eigv = linalg.eig(mat) eig = T.maximum(eig, 0) eig = T.diag(eig) return eigv.dot(eig).dot(eigv.T)
def _project_sd(self, mat): eig, eigv = linalg.eig(mat) eig = T.diag(T.maximum(eig, 0)) return eigv.dot(eig).dot(linalg.matrix_inverse(eigv))