def _demixing_matrix(dataset): """Calculate the linear transformation to demix two channels. Parameters ---------- dataset : ImagingDataset The dataset which is to be demixed. This must have two channels. Returns ------- array Matrix by which the data can be (left) multiplied to be demixed. """ from mdp.nodes import FastICANode # Make matrix of the time averaged channels. time_avgs = np.concatenate( [im.reshape(-1, 1) for im in dataset.time_averages], axis=1) # Perform ICA on the time averaged data. node = FastICANode() # TODO: switch to ICA from scikit-learn ? node(time_avgs) W = np.dot(node.white.v, node.filters).T # Reorder and normalize the rows so that the diagonal coefficients # are 1 and the off diagonals have minimal magnitude. if abs(old_div(W[0, 0], W[0, 1])) < abs(old_div(W[1, 0], W[1, 1])): W = W[::-1] W[0] /= W[0, 0] W[1] /= W[1, 1] assert np.allclose(np.diag(W), 1.) return W
def _train(self, data, label=None): """ Uses *data* to learn a decomposition into independent components.""" # We simply ignore the class label since we # are doing unsupervised learning if self.channel_names is None: self.channel_names = data.channel_names if self.wrapped_node is None: self.wrapped_node = FastICANode() self.wrapped_node.train(data)
def estimate_components_ica(d): """ Compute the ICA based on the input data d. """ U, s, Vt = pca_components_gf(d) U = U[:, :NUM_COMPONENTS] V = np.transpose(Vt) V = V[:, :NUM_COMPONENTS] f = FastICANode(whitened=True, max_it=10000, g='tanh', fine_g='tanh', max_it_fine=1000) f.execute(V) P = f.get_projmatrix() Ur = np.dot(U, P) Ur /= np.sum(Ur**2, axis=0)**0.5 return Ur