def connected_components(self): """returns a labelling of the domain into connected components """ if self.topology is not None: return wgraph_from_coo_matrix(self.topology).cc() else: return []
def reduce_coo_matrix(mat, mask): """Reduce a supposedly coo_matrix to the vertices in the mask Parameters ---------- mat: sparse coo_matrix, input matrix mask: boolean array of shape mat.shape[0], desired elements """ G = wgraph_from_coo_matrix(mat) K = G.subgraph(mask) if K is None: return None return K.to_coo_matrix()
def _bsa_dpmm(hrois, prior_h0, subjects, coords, sigma, prevalence_pval, prevalence_threshold, dof=10, alpha=.5, n_iter=1000, burnin=100, algorithm='density'): """ Estimation of the population level model of activation density using dpmm and inference Parameters ---------- hrois: list of nipy.labs.spatial_models.hroi.HierarchicalROI instances representing individual ROIs Let nr be the number of terminal regions across subjects prior_h0: array of shape (nr) mixture-based prior probability that the terminal regions are true positives subjects: array of shape (nr) subject index associated with the terminal regions coords: array of shape (nr, coord.shape[1]) coordinates of the of the terminal regions sigma: float > 0, expected cluster scatter in the common space in units of coord prevalence_pval: float in the [0,1] interval, optional p-value of the prevalence test prevalence_threshold: float in the rannge [0,nsubj] null hypothesis on region prevalence dof: float > 0, optional, degrees of freedom of the prior alpha: float > 0, optional, creation parameter of the DPMM niter: int, optional, number of iterations of the DPMM burnin: int, optional, number of iterations of the DPMM algorithm: {'density', 'co_occurrence'}, optional, algorithm used in the DPMM inference Returns ------- landmarks: instance of sbf.LandmarkRegions that describes the ROIs found in inter-subject inference If no such thing can be defined landmarks is set to None hrois: List of nipy.labs.spatial_models.hroi.HierarchicalROI instances representing individual ROIs """ from nipy.algorithms.graph.field import field_from_coo_matrix_and_data domain = hrois[0].domain n_subjects = len(hrois) landmarks = None density = np.zeros(domain.size) if len(subjects) < 1: return landmarks, hrois null_density = 1. / domain.local_volume.sum() # prepare the DPMM dim = domain.em_dim prior_precision = 1. / (sigma ** 2) * np.ones((1, dim)) # n_iter = number of iterations to estimate density if algorithm == 'density': density, post_proba = _dpmm( coords, alpha, null_density, dof, prior_precision, prior_h0, subjects, domain.coord, n_iter=n_iter, burnin=burnin) # associate labels with coords Fbeta = field_from_coo_matrix_and_data(domain.topology, density) _, label = Fbeta.custom_watershed(0, null_density) midx = np.array([np.argmin(np.sum((domain.coord - coord_) ** 2, 1)) for coord_ in coords]) components = label[midx] elif algorithm == 'co-occurrence': post_proba, density, co_clustering = _dpmm( coords, alpha, null_density, dof, prior_precision, prior_h0, subjects, n_iter=n_iter, burnin=burnin, co_clust=True) contingency_graph = wgraph_from_coo_matrix(co_clustering) if contingency_graph.E > 0: contingency_graph.remove_edges(contingency_graph.weights > .5) components = contingency_graph.cc() components[density < null_density] = components.max() + 1 +\ np.arange(np.sum(density < null_density)) else: raise ValueError('Unknown algorithm') # append some information to the hroi in each subject for subject in range(n_subjects): bfs = hrois[subject] if bfs is None: continue if bfs.k == 0: bfs.set_roi_feature('label', np.array([])) continue leaves_pos = [bfs.select_id(k) for k in bfs.get_leaves_id()] # save posterior proba post_proba_ = np.zeros(bfs.k) post_proba_[leaves_pos] = post_proba[subjects == subject] bfs.set_roi_feature('posterior_proba', post_proba_) # save prior proba prior_proba = np.zeros(bfs.k) prior_proba[leaves_pos] = 1 - prior_h0[subjects == subject] bfs.set_roi_feature('prior_proba', prior_proba) # assign labels to ROIs roi_label = - np.ones(bfs.k).astype(np.int) roi_label[leaves_pos] = components[subjects == subject] # when parent regions has similarly labelled children, # include it also roi_label = bfs.make_forest().propagate_upward(roi_label) bfs.set_roi_feature('label', roi_label) # derive the group-level landmarks # with a threshold on the number of subjects # that are represented in each one landmarks, new_labels = build_landmarks( domain, coords, subjects, np.array(components), 1 - prior_h0, prevalence_pval, prevalence_threshold, sigma) # relabel the regions _update_hroi_labels(hrois, new_labels) return landmarks, hrois
def bsa_dpmm2(bf, gf0, sub, gfc, dmax, thq, ths, verbose): """ Estimation of the population level model of activation density using dpmm and inference Parameters ---------- bf list of nipy.labs.spatial_models.hroi.HierarchicalROI instances representing individual ROIs let nr be the number of terminal regions across subjects gf0, array of shape (nr) the mixture-based prior probability that the terminal regions are false positives sub, array of shape (nr) the subject index associated with the terminal regions gfc, array of shape (nr, coord.shape[1]) the coordinates of the of the terminal regions dmax float>0: expected cluster std in the common space in units of coord thq = 0.5 (float in the [0,1] interval) p-value of the prevalence test ths=0, float in the rannge [0,nsubj] null hypothesis on region prevalence that is rejected during inference verbose=0, verbosity mode Returns ------- crmap: array of shape (nnodes): the resulting group-level labelling of the space LR: a instance of sbf.LandmarkRegions that describes the ROIs found in inter-subject inference If no such thing can be defined LR is set to None bf: List of nipy.labs.spatial_models.hroi.Nroi instances representing individual ROIs Coclust: array of shape (nr,nr): co-labelling matrix that gives for each pair of inputs how likely they are in the same class according to the model """ dom = bf[0].domain n_subj = len(bf) crmap = - np.ones(dom.size, np.int) LR = None p = np.zeros(dom.size) if len(sub) < 1: return crmap, LR, bf, p sub = np.concatenate(sub).astype(np.int) gfc = np.concatenate(gfc) gf0 = np.concatenate(gf0) # prepare the DPMM g0 = 1. / (np.sum(dom.local_volume)) g1 = g0 prior_precision = 1. / (dmax * dmax) * np.ones((1, dom.em_dim), np.float) dof = 10 burnin = 100 nis = 300 q, p, CoClust = dpmm(gfc, .5, g0, g1, dof, prior_precision, 1 - gf0, sub, burnin, nis=nis, co_clust=True) cg = wgraph_from_coo_matrix(CoClust) if cg.E > 0: cg.remove_edges(cg.weights > .5) u = cg.cc() u[p < g0] = u.max() + 1 + np.arange(np.sum(p < g0)) if verbose: cg.show(gfc) # append some information to the hroi in each subject for s in range(n_subj): bfs = bf[s] if bfs is not None: leaves = np.asarray( [bfs.select_id(id) for id in bfs.get_leaves_id()]) us = - np.ones(bfs.k).astype(np.int) lq = np.zeros(bfs.k) lq[leaves] = q[sub == s] bfs.set_roi_feature('posterior_proba', lq) lq = np.zeros(bfs.k) lq[leaves] = 1 - gf0[sub == s] bfs.set_roi_feature('prior_proba', lq) us[leaves] = u[sub == s] # when parent regions has similarly labelled children, # include it also us = bfs.make_forest().propagate_upward(us) bfs.set_roi_feature('label', us) # derive the group-level landmarks # with a threshold on the number of subjects # that are represented in each one LR, nl = build_LR(bf, thq, ths, dmax, verbose=verbose) # make a group-level map of the landmark position crmap = - np.ones(dom.size) # not implemented at the moment return crmap, LR, bf, CoClust
def _bsa_dpmm(hrois, prior_h0, subjects, coords, sigma, prevalence_pval, prevalence_threshold, dof=10, alpha=.5, n_iter=1000, burnin=100, algorithm='density'): """ Estimation of the population level model of activation density using dpmm and inference Parameters ---------- hrois: list of nipy.labs.spatial_models.hroi.HierarchicalROI instances representing individual ROIs Let nr be the number of terminal regions across subjects prior_h0: array of shape (nr) mixture-based prior probability that the terminal regions are true positives subjects: array of shape (nr) subject index associated with the terminal regions coords: array of shape (nr, coord.shape[1]) coordinates of the of the terminal regions sigma: float > 0, expected cluster scatter in the common space in units of coord prevalence_pval: float in the [0,1] interval, optional p-value of the prevalence test prevalence_threshold: float in the rannge [0,nsubj] null hypothesis on region prevalence dof: float > 0, optional, degrees of freedom of the prior alpha: float > 0, optional, creation parameter of the DPMM niter: int, optional, number of iterations of the DPMM burnin: int, optional, number of iterations of the DPMM algorithm: {'density', 'co_occurrence'}, optional, algorithm used in the DPMM inference Returns ------- landmarks: instance of sbf.LandmarkRegions that describes the ROIs found in inter-subject inference If no such thing can be defined landmarks is set to None hrois: List of nipy.labs.spatial_models.hroi.HierarchicalROI instances representing individual ROIs """ from nipy.algorithms.graph.field import field_from_coo_matrix_and_data domain = hrois[0].domain n_subjects = len(hrois) landmarks = None density = np.zeros(domain.size) if len(subjects) < 1: return landmarks, hrois null_density = 1. / domain.local_volume.sum() # prepare the DPMM dim = domain.em_dim prior_precision = 1. / (sigma**2) * np.ones((1, dim)) # n_iter = number of iterations to estimate density if algorithm == 'density': density, post_proba = _dpmm(coords, alpha, null_density, dof, prior_precision, prior_h0, subjects, domain.coord, n_iter=n_iter, burnin=burnin) # associate labels with coords Fbeta = field_from_coo_matrix_and_data(domain.topology, density) _, label = Fbeta.custom_watershed(0, null_density) midx = np.array([ np.argmin(np.sum((domain.coord - coord_)**2, 1)) for coord_ in coords ]) components = label[midx] elif algorithm == 'co-occurrence': post_proba, density, co_clustering = _dpmm(coords, alpha, null_density, dof, prior_precision, prior_h0, subjects, n_iter=n_iter, burnin=burnin, co_clust=True) contingency_graph = wgraph_from_coo_matrix(co_clustering) if contingency_graph.E > 0: contingency_graph.remove_edges(contingency_graph.weights > .5) components = contingency_graph.cc() components[density < null_density] = components.max() + 1 +\ np.arange(np.sum(density < null_density)) else: raise ValueError('Unknown algorithm') # append some information to the hroi in each subject for subject in range(n_subjects): bfs = hrois[subject] if bfs is None: continue if bfs.k == 0: bfs.set_roi_feature('label', np.array([])) continue leaves_pos = [bfs.select_id(k) for k in bfs.get_leaves_id()] # save posterior proba post_proba_ = np.zeros(bfs.k) post_proba_[leaves_pos] = post_proba[subjects == subject] bfs.set_roi_feature('posterior_proba', post_proba_) # save prior proba prior_proba = np.zeros(bfs.k) prior_proba[leaves_pos] = 1 - prior_h0[subjects == subject] bfs.set_roi_feature('prior_proba', prior_proba) # assign labels to ROIs roi_label = -np.ones(bfs.k).astype(np.int) roi_label[leaves_pos] = components[subjects == subject] # when parent regions has similarly labelled children, # include it also roi_label = bfs.make_forest().propagate_upward(roi_label) bfs.set_roi_feature('label', roi_label) # derive the group-level landmarks # with a threshold on the number of subjects # that are represented in each one landmarks, new_labels = build_landmarks(domain, coords, subjects, np.array(components), 1 - prior_h0, prevalence_pval, prevalence_threshold, sigma) # relabel the regions _update_hroi_labels(hrois, new_labels) return landmarks, hrois
def cc_array_mask(mask, size_threshold): """Filter the mask to keep only connected components above a given size""" graph = wgraph_from_coo_matrix(grid_domain_from_binary_array(mask).topology) mask[mask] = cc_mask(graph, mask[mask], size_threshold) return mask
def bsa_dpmm2(bf, gf0, sub, gfc, dmax, thq, ths, verbose): """ Estimation of the population level model of activation density using dpmm and inference Parameters ---------- bf list of nipy.labs.spatial_models.hroi.HierarchicalROI instances representing individual ROIs let nr be the number of terminal regions across subjects gf0, array of shape (nr) the mixture-based prior probability that the terminal regions are false positives sub, array of shape (nr) the subject index associated with the terminal regions gfc, array of shape (nr, coord.shape[1]) the coordinates of the of the terminal regions dmax float>0: expected cluster std in the common space in units of coord thq = 0.5 (float in the [0,1] interval) p-value of the prevalence test ths=0, float in the rannge [0,nsubj] null hypothesis on region prevalence that is rejected during inference verbose=0, verbosity mode Returns ------- crmap: array of shape (nnodes): the resulting group-level labelling of the space LR: a instance of sbf.LandmarkRegions that describes the ROIs found in inter-subject inference If no such thing can be defined LR is set to None bf: List of nipy.labs.spatial_models.hroi.Nroi instances representing individual ROIs Coclust: array of shape (nr,nr): co-labelling matrix that gives for each pair of inputs how likely they are in the same class according to the model """ dom = bf[0].domain n_subj = len(bf) crmap = -np.ones(dom.size, np.int) LR = None p = np.zeros(dom.size) if len(sub) < 1: return crmap, LR, bf, p sub = np.concatenate(sub).astype(np.int) gfc = np.concatenate(gfc) gf0 = np.concatenate(gf0) # prepare the DPMM g0 = 1. / (np.sum(dom.local_volume)) g1 = g0 prior_precision = 1. / (dmax * dmax) * np.ones((1, dom.em_dim), np.float) dof = 10 burnin = 100 nis = 300 q, p, CoClust = dpmm(gfc, .5, g0, g1, dof, prior_precision, 1 - gf0, sub, burnin, nis=nis, co_clust=True) cg = wgraph_from_coo_matrix(CoClust) if cg.E > 0: cg.remove_edges(cg.weights > .5) u = cg.cc() u[p < g0] = u.max() + 1 + np.arange(np.sum(p < g0)) if verbose: cg.show(gfc) # append some information to the hroi in each subject for s in range(n_subj): bfs = bf[s] if bfs is not None: leaves = np.asarray( [bfs.select_id(id) for id in bfs.get_leaves_id()]) us = -np.ones(bfs.k).astype(np.int) lq = np.zeros(bfs.k) lq[leaves] = q[sub == s] bfs.set_roi_feature('posterior_proba', lq) lq = np.zeros(bfs.k) lq[leaves] = 1 - gf0[sub == s] bfs.set_roi_feature('prior_proba', lq) us[leaves] = u[sub == s] # when parent regions has similarly labelled children, # include it also us = bfs.make_forest().propagate_upward(us) bfs.set_roi_feature('label', us) # derive the group-level landmarks # with a threshold on the number of subjects # that are represented in each one LR, nl = build_LR(bf, thq, ths, dmax, verbose=verbose) # make a group-level map of the landmark position crmap = -np.ones(dom.size) # not implemented at the moment return crmap, LR, bf, CoClust