def _compute_xDAWN_filters(self, X, D): # Compute xDAWN spatial filters # QR decompositions of X and D if map(int, __import__("scipy").__version__.split('.')) >= [0, 9, 0]: # NOTE: mode='economy'required since otherwise the memory # consumption is excessive Qx, Rx = qr(X, overwrite_a=True, mode='economic') Qd, Rd = qr(D, overwrite_a=True, mode='economic') else: # NOTE: econ=True required since otherwise the memory consumption # is excessive Qx, Rx = qr(X, overwrite_a=True, econ=True) Qd, Rd = qr(D, overwrite_a=True, econ=True) # Singular value decomposition of Qd.T Qx # NOTE: full_matrices=True required since otherwise we do not get # num_channels filters. Phi, Lambda, Psi = numpy.linalg.svd(numpy.dot(Qd.T, Qx), full_matrices=True) Psi = Psi.T # Construct the spatial filters for i in range(Psi.shape[1]): # Construct spatial filter with index i as Rx^-1*Psi_i ui = numpy.dot(numpy.linalg.inv(Rx), Psi[:, i]) if i == 0: filters = numpy.atleast_2d(ui).T else: filters = numpy.hstack((filters, numpy.atleast_2d(ui).T)) return filters
def _compute_xDAWN_filters(self, X, D): # Compute xDAWN spatial filters # QR decompositions of X and D if map(int, __import__("scipy").__version__.split('.')) >= [0,9,0]: # NOTE: mode='economy'required since otherwise the memory # consumption is excessive Qx, Rx = qr(X, overwrite_a=True, mode='economic') Qd, Rd = qr(D, overwrite_a=True, mode='economic') else: # NOTE: econ=True required since otherwise the memory consumption # is excessive Qx, Rx = qr(X, overwrite_a=True, econ=True) Qd, Rd = qr(D, overwrite_a=True, econ=True) # Singular value decomposition of Qd.T Qx # NOTE: full_matrices=True required since otherwise we do not get # num_channels filters. Phi, Lambda, Psi = numpy.linalg.svd(numpy.dot(Qd.T, Qx), full_matrices=True) Psi = Psi.T # Construct the spatial filters for i in range(Psi.shape[1]): # Construct spatial filter with index i as Rx^-1*Psi_i ui = numpy.dot(numpy.linalg.inv(Rx), Psi[:,i]) if i == 0: filters = numpy.atleast_2d(ui).T else: filters = numpy.hstack((filters, numpy.atleast_2d(ui).T)) return filters
def _stop_training(self, debug=False): # The following if statement is needed only to account for # different versions of scipy if map(int, __import__("scipy").__version__.split('.')) >= [0, 9, 0]: # NOTE: mode='economy'required since otherwise # the memory consumption is excessive; # QR decompositions of X Qx, Rx = qr(self.X, overwrite_a=True, mode='economic') # QR decompositions of D Qd, Rd = qr(self.D, overwrite_a=True, mode='economic') else: # NOTE: econ=True required since otherwise # the memory consumption is excessive # QR decompositions of X Qx, Rx = qr(self.X, overwrite_a=True, econ=True) # QR decompositions of D Qd, Rd = qr(self.D, overwrite_a=True, econ=True) # self.X = None # Free memory # self.D = None # Free memory # Singular value decomposition of Qd.T Qx # NOTE: full_matrices=True required since otherwise we do not get # num_channels filters. self.Phi, self.Lambda, self.Psi = \ numpy.linalg.svd(numpy.dot(Qd.T, Qx), full_matrices=True) self.Psi = self.Psi.T SNR = numpy.zeros(self.X.shape[1]) # Construct the spatial filters for i in range(self.Psi.shape[1]): # Construct spatial filter with index i as Rx^-1*Psi_i ui = numpy.dot(numpy.linalg.inv(Rx), self.Psi[:, i]) wi = numpy.dot(Rx.T, self.Psi[:, i]) if i < self.Phi.shape[1]: ai = numpy.dot(numpy.dot(numpy.linalg.inv(Rd), self.Phi[:, i]), self.Lambda[i]) if i == 0: self.filters = numpy.atleast_2d(ui).T self.wi = numpy.atleast_2d(wi) self.ai = numpy.atleast_2d(ai) else: self.filters = numpy.hstack( (self.filters, numpy.atleast_2d(ui).T)) self.wi = numpy.vstack((self.wi, numpy.atleast_2d(wi))) if i < self.Phi.shape[1]: self.ai = numpy.vstack((self.ai, numpy.atleast_2d(ai))) a = numpy.dot(self.D, ai.T) b = numpy.dot(self.X, ui) # b.view(numpy.ndarray) # bb = numpy.dot(b.T, b) # aa = numpy.dot(a.T, a) SNR[i] = numpy.dot(a.T, a) / numpy.dot(b.T, b) self.SNR = SNR self.D = None self.X = None
def _stop_training(self, debug=False): # The following if statement is needed only to account for # different versions of scipy if map(int, __import__("scipy").__version__.split('.')) >= [0, 9, 0]: # NOTE: mode='economy'required since otherwise # the memory consumption is excessive; # QR decompositions of X Qx, Rx = qr(self.X, overwrite_a=True, mode='economic') # QR decompositions of D Qd, Rd = qr(self.D, overwrite_a=True, mode='economic') else: # NOTE: econ=True required since otherwise # the memory consumption is excessive # QR decompositions of X Qx, Rx = qr(self.X, overwrite_a=True, econ=True) # QR decompositions of D Qd, Rd = qr(self.D, overwrite_a=True, econ=True) # self.X = None # Free memory # self.D = None # Free memory # Singular value decomposition of Qd.T Qx # NOTE: full_matrices=True required since otherwise we do not get # num_channels filters. self.Phi, self.Lambda, self.Psi = \ numpy.linalg.svd(numpy.dot(Qd.T, Qx), full_matrices=True) self.Psi = self.Psi.T SNR = numpy.zeros(self.X.shape[1]) # Construct the spatial filters for i in range(self.Psi.shape[1]): # Construct spatial filter with index i as Rx^-1*Psi_i ui = numpy.dot(numpy.linalg.inv(Rx), self.Psi[:,i]) wi = numpy.dot(Rx.T, self.Psi[:,i]) if i < self.Phi.shape[1]: ai = numpy.dot(numpy.dot(numpy.linalg.inv(Rd), self.Phi[:,i]), self.Lambda[i]) if i == 0: self.filters = numpy.atleast_2d(ui).T self.wi = numpy.atleast_2d(wi) self.ai = numpy.atleast_2d(ai) else: self.filters = numpy.hstack((self.filters, numpy.atleast_2d(ui).T)) self.wi = numpy.vstack((self.wi, numpy.atleast_2d(wi))) if i < self.Phi.shape[1]: self.ai = numpy.vstack((self.ai, numpy.atleast_2d(ai))) a = numpy.dot(self.D, ai.T) b = numpy.dot(self.X, ui) # b.view(numpy.ndarray) # bb = numpy.dot(b.T, b) # aa = numpy.dot(a.T, a) SNR[i] = numpy.dot(a.T, a)/numpy.dot(b.T, b) self.SNR = SNR self.D = None self.X = None