def fit( self, biadjacency: Union[sparse.csr_matrix, np.ndarray]) -> 'BiLouvainHierarchy': """Applies Louvain hierarchical clustering to :math:`A = \\begin{bmatrix} 0 & B \\\\ B^T & 0 \\end{bmatrix}` where :math:`B` is the biadjacency matrix of the graphs. Parameters ---------- biadjacency: Biadjacency matrix of the graph. Returns ------- self: :class:`BiLouvainHierarchy` """ biadjacency = check_format(biadjacency) adjacency = bipartite2undirected(biadjacency) self.dendrogram_ = self.louvain_hierarchy.fit_transform(adjacency) self._split_vars(biadjacency.shape) return self
def fit(self, biadjacency: Union[sparse.csr_matrix, np.ndarray], seeds_row: Union[np.ndarray, dict], seeds_col: Union[np.ndarray, dict, None] = None) -> 'RankClassifier': """Compute labels. Parameters ---------- biadjacency : Biadjacency matrix of the graph. seeds_row : Seed rows (labels as dictionary or array; negative values ignored). seeds_col : Seed columns (optional). Same format. Returns ------- self: :class:`BiPageRankClassifier` """ n_row, n_col = biadjacency.shape labels = stack_seeds(n_row, n_col, seeds_row, seeds_col) adjacency = bipartite2undirected(biadjacency) RankClassifier.fit(self, adjacency, labels) self.labels_row_ = self.labels_[:n_row] self.labels_col_ = self.labels_[n_row:] self.labels_ = self.labels_row_ self.membership_row_ = self.membership_[:n_row] self.membership_col_ = self.membership_[n_row:] self.membership_ = self.membership_row_ return self
def test_is_bipartite(self): biadjacency = star_wars(metadata=False) adjacency = bipartite2undirected(biadjacency) self.assertTrue(is_bipartite(adjacency)) bipartite, pred = is_bipartite(adjacency, return_biadjacency=True) self.assertEqual(bipartite, True) self.assertEqual(np.all(biadjacency.data == pred.data), True) adjacency = sparse.identity(2, format='csr') bipartite, biadjacency = is_bipartite(adjacency, return_biadjacency=True) self.assertEqual(bipartite, False) self.assertIsNone(biadjacency) adjacency = directed2undirected(cyclic_digraph(3)) bipartite, biadjacency = is_bipartite(adjacency, return_biadjacency=True) self.assertEqual(bipartite, False) self.assertIsNone(biadjacency) with self.assertRaises(ValueError): is_bipartite(cyclic_digraph(3)) self.assertTrue(~is_bipartite(sparse.eye(3)))
def fit( self, biadjacency: Union[sparse.csr_matrix, np.ndarray] ) -> 'BiPropagationClustering': """Clustering. Parameters ---------- biadjacency : Biadjacency matrix of the graph. Returns ------- self: :class:`BiPropagationClustering` """ n_row, n_col = biadjacency.shape biadjacency = check_format(biadjacency) adjacency = bipartite2undirected(biadjacency) propagation = PropagationClustering(self.n_iter, self.node_order, self.weighted) self.labels_ = propagation.fit_transform(adjacency) self._split_vars(n_row) self._secondary_outputs(biadjacency) return self
def fit(self, biadjacency: Union[sparse.csr_matrix, np.ndarray], seeds_row: Optional[Union[dict, np.ndarray]] = None, seeds_col: Optional[Union[dict, np.ndarray]] = None) \ -> 'BiPageRank': """Fit algorithm to data. Parameters ---------- biadjacency : Biadjacency matrix. seeds_row, seeds_col : Parameter to be used for Personalized BiPageRank. Restart distribution as vectors or dicts on rows, columns (node: weight). If both seeds_row and seeds_col are ``None`` (default), the uniform distribution on rows is used. Returns ------- self: :class:`BiPageRank` """ biadjacency = check_format(biadjacency) n_row, n_col = biadjacency.shape adjacency = bipartite2undirected(biadjacency) seeds = stack_seeds(n_row, n_col, seeds_row, seeds_col) PageRank.fit(self, adjacency, seeds) self._split_vars(n_row) self.scores_row_ /= self.scores_row_.sum() self.scores_col_ /= self.scores_col_.sum() self.scores_ = self.scores_row_ return self
def fit( self, biadjacency: Union[sparse.csr_matrix, np.ndarray], seeds_row: Union[np.ndarray, dict], seeds_col: Optional[Union[np.ndarray, dict]] = None) -> 'BiPropagation': """Node classification by k-nearest neighbors in the embedding space. Parameters ---------- biadjacency : Biadjacency matrix of the graph. seeds_row : Seed rows. Can be a dict {node: label} or an array where "-1" means no label. seeds_col : Seed columns (optional). Same format. Returns ------- self: :class:`BiPropagation` """ n_row, n_col = biadjacency.shape biadjacency = check_format(biadjacency) adjacency = bipartite2undirected(biadjacency) seeds = stack_seeds(n_row, n_col, seeds_row, seeds_col).astype(int) Propagation.fit(self, adjacency, seeds) self._split_vars(n_row) return self
def fit(self, biadjacency: Union[sparse.csr_matrix, np.ndarray], seeds_row: Optional[Union[dict, np.ndarray]] = None, seeds_col: Optional[Union[dict, np.ndarray]] = None) \ -> 'BiPageRank': """Fit algorithm to data. Parameters ---------- biadjacency : Biadjacency matrix. seeds_row : Seed rows, as a dict or a vector. seeds_col : Seed columns, as a dict or a vector. If both seeds_row and seeds_col are ``None``, the uniform distribution is used. Returns ------- self: :class:`BiPageRank` """ biadjacency = check_format(biadjacency) n_row, n_col = biadjacency.shape adjacency = bipartite2undirected(biadjacency) seeds = stack_seeds(n_row, n_col, seeds_row, seeds_col) PageRank.fit(self, adjacency, seeds) self._split_vars(n_row) self.scores_row_ /= self.scores_row_.sum() self.scores_col_ /= self.scores_col_.sum() self.scores_ = self.scores_row_ return self
def fit(self, biadjacency: Union[sparse.csr_matrix, np.ndarray], seeds_row: Optional[Union[dict, np.ndarray]] = None, seeds_col: Optional[Union[dict, np.ndarray]] = None, init: Optional[float] = None) -> 'BiDirichlet': """Compute the solution to the Dirichlet problem (temperatures at equilibrium). Parameters ---------- biadjacency : Biadjacency matrix, shape (n_row, n_col). seeds_row : Temperatures of seed rows (dictionary or vector of size n_row). Negative temperatures ignored. seeds_col : Temperatures of seed columns (dictionary or vector of size n_col). Negative temperatures ignored. init : Temperature of non-seed nodes in initial state. If ``None``, use the average temperature of seed nodes (default). Returns ------- self: :class:`BiDirichlet` """ biadjacency = check_format(biadjacency) n_row, n_col = biadjacency.shape seeds = stack_seeds(n_row, n_col, seeds_row, seeds_col) adjacency = bipartite2undirected(biadjacency) Dirichlet.fit(self, adjacency, seeds, init) self._split_vars(n_row) return self
def fit(self, biadjacency: Union[sparse.csr_matrix, np.ndarray], seeds_row: Optional[Union[dict, np.ndarray]] = None, seeds_col: Optional[Union[dict, np.ndarray]] = None, initial_state: Optional = None) -> 'BiDiffusion': """Compute the diffusion (temperature at equilibrium). Parameters ---------- biadjacency : Biadjacency matrix, shape (n_row, n_col). seeds_row : Temperatures of row border nodes (dictionary or vector of size n_row). Negative temperatures ignored. seeds_col : Temperatures of column border nodes (dictionary or vector of size n_row). Negative temperatures ignored. initial_state : Initial state of temperatures. Returns ------- self: :class:`BiDiffusion` """ biadjacency = check_format(biadjacency) n_row, n_col = biadjacency.shape seeds = stack_seeds(n_row, n_col, seeds_row, seeds_col) adjacency = bipartite2undirected(biadjacency) Diffusion.fit(self, adjacency, seeds) self._split_vars(n_row) return self
def fit(self, biadjacency: Union[sparse.csr_matrix, np.ndarray]) -> 'BiRandomProjection': """Compute the embedding. Parameters ---------- biadjacency: Biadjacency matrix of the graph. Returns ------- self: :class:`BiRandomProjection` """ biadjacency = check_format(biadjacency) n_row, _ = biadjacency.shape RandomProjection.fit(self, bipartite2undirected(biadjacency)) self._split_vars(n_row) return self
def fit(self, biadjacency: Union[sparse.csr_matrix, np.ndarray]) -> 'BiKatz': """Katz centrality. Parameters ---------- biadjacency : Biadjacency matrix of the graph. Returns ------- self: :class:`BiKatz` """ biadjacency = check_format(biadjacency) n_row, n_col = biadjacency.shape adjacency = bipartite2undirected(biadjacency) Katz.fit(self, adjacency) self._split_vars(n_row) return self
def fit( self, biadjacency: Union[sparse.csr_matrix, np.ndarray] ) -> 'BiHLouvainEmbedding': """Embedding of graphs from a clustering obtained with Louvain. Parameters ---------- biadjacency: Biadjacency matrix of the graph. Returns ------- self: :class:`BiLouvainNE` """ biadjacency = check_format(biadjacency) n_row, _ = biadjacency.shape HLouvainEmbedding.fit(self, bipartite2undirected(biadjacency)) self._split_vars(n_row) return self
def fit(self, biadjacency: Union[sparse.csr_matrix, np.ndarray]) -> 'BiLouvain': """Apply the Louvain algorithm to the corresponding directed graph, with adjacency matrix: :math:`A = \\begin{bmatrix} 0 & B \\\\ 0 & 0 \\end{bmatrix}` where :math:`B` is the input (biadjacency matrix). Parameters ---------- biadjacency: Biadjacency matrix of the graph. Returns ------- self: :class:`BiLouvain` """ louvain = Louvain(resolution=self.resolution, modularity=self.modularity, tol_aggregation=self.tol_aggregation, n_aggregations=self.n_aggregations, shuffle_nodes=self.shuffle_nodes, sort_clusters=self.sort_clusters, return_membership=self.return_membership, return_aggregate=False, random_state=self.random_state, verbose=self.log.verbose) biadjacency = check_format(biadjacency) n_row, _ = biadjacency.shape if self.modularity == 'dugue': adjacency = bipartite2directed(biadjacency) else: adjacency = bipartite2undirected(biadjacency) louvain.fit(adjacency) self.labels_ = louvain.labels_ self._split_vars(n_row) self._secondary_outputs(biadjacency) return self
def fit(self, biadjacency: Union[sparse.csr_matrix, np.ndarray]) -> 'BiSpectral': """Spectral embedding of the bipartite graph considered as undirected, with adjacency matrix: :math:`A = \\begin{bmatrix} 0 & B \\\\ B^T & 0 \\end{bmatrix}` where :math:`B` is the biadjacency matrix (or the adjacency matrix of a directed graph). Parameters ---------- biadjacency: Biadjacency matrix of the graph. Returns ------- self: :class:`BiSpectral` """ biadjacency = check_format(biadjacency) n_row, _ = biadjacency.shape Spectral.fit(self, bipartite2undirected(biadjacency)) self._split_vars(n_row) return self
def fit(self, biadjacency: Union[sparse.csr_matrix, np.ndarray], seeds_row: Optional[Union[dict, np.ndarray]] = None, seeds_col: Optional[Union[dict, np.ndarray]] = None, init: Optional[float] = None) -> 'BiDiffusion': """Compute the diffusion (temperatures at equilibrium). Parameters ---------- biadjacency : Biadjacency matrix, shape (n_row, n_col). seeds_row : Temperatures of seed rows in initial state (dictionary or vector of size n_row). Negative temperatures ignored. seeds_col : Temperatures of seed columns in initial state (dictionary or vector of size n_col). Negative temperatures ignored. init : Temperature of non-seed nodes in initial state. If ``None``, use the average temperature of seed nodes (default). Returns ------- self: :class:`BiDiffusion` """ biadjacency = check_format(biadjacency) n_row, n_col = biadjacency.shape seeds = stack_seeds(n_row, n_col, seeds_row, seeds_col) adjacency = bipartite2undirected(biadjacency) Diffusion.fit(self, adjacency, seeds, init) # average over 2 successive iterations because the graph is bipartite diffusion = DirichletOperator(adjacency, self.damping_factor) self.scores_ += diffusion.dot(self.scores_) self.scores_ /= 2 self._split_vars(n_row) return self