Example #1
0
    def _forward_dataset(self, ds):
        targ = np.copy(ds.targets)
        mapped = None
        X = None
        i,j = ds.shape
        
        if self._stack=='v':
            chunks = np.unique(ds.sa[self._chunks_attr].value)
        else:
            chunks = np.unique(ds.fa[self._chunks_attr].value)
        
        for ch,chunk in enumerate(chunks):
            if self._stack == 'v':
                table = ds[ds.sa[self._chunks_attr].value==chunk,:]
            if self._stack == 'h':
                table = ds[:,ds.fa[self._chunks_attr].value==chunk]

            table = self.center_and_norm_table(table,
                    col_mean=self._subtable_stats[ch]['col_mean'],
                    col_norm=self._subtable_stats[ch]['col_norm'],
                    table_norm = self._subtable_stats[ch]['table_norm'])[0]


            if self._stack =='v':
                # Assume features align, use average Q
                Q_ = None
                for subtab in np.unique(self.subtable_idx):
                    if Q_ is None:
                        Q_ = self.Q[self.subtable_idx==subtab,:]
                    else:
                        Q_ = Q_ + self.Q[self.subtable_idx==subtab,:]
                Q_ = Q_ / len(np.unique(self.subtable_idx))
                part = Dataset(np.dot(table.samples,Q_))
                part.sa = table.sa
            if self._stack =='h':
                # Assume same number of features as in X
                part = Dataset(np.dot(table,self.Q[self.subtable_idx==chunk,:]))
                part.sa = table.sa
            part.sa['chunks'] = [chunk]*part.shape[0]

            if mapped is None:
                mapped = part.copy()
                X = table
            else:
                mapped.append(part.copy())
                X.append(table,'h')
        mapped.a['X'] = X
         
        if self.keep_dims == 'all':
            self.keep_dims = range(mapped.shape[1])
        return mapped[:,self.keep_dims]