(Symmetric) Stochastic Block Model Parameters ---------- n_blocks : int Number of blocks. block_size : int Block size. p : float Probability for intra-community edge. q : float Probability for inter-community edge. rng : numpy.random.Rando
(n_blocks, block_size, p, q, rng=None)
| 14 | |
| 15 | |
| 16 | def sbm(n_blocks, block_size, p, q, rng=None): |
| 17 | """(Symmetric) Stochastic Block Model |
| 18 | |
| 19 | Parameters |
| 20 | ---------- |
| 21 | n_blocks : int |
| 22 | Number of blocks. |
| 23 | block_size : int |
| 24 | Block size. |
| 25 | p : float |
| 26 | Probability for intra-community edge. |
| 27 | q : float |
| 28 | Probability for inter-community edge. |
| 29 | rng : numpy.random.RandomState, optional |
| 30 | Random number generator. |
| 31 | |
| 32 | Returns |
| 33 | ------- |
| 34 | scipy sparse matrix |
| 35 | The adjacency matrix of generated graph. |
| 36 | """ |
| 37 | n = n_blocks * block_size |
| 38 | p /= n |
| 39 | q /= n |
| 40 | rng = np.random.RandomState() if rng is None else rng |
| 41 | |
| 42 | rows = [] |
| 43 | cols = [] |
| 44 | for i in range(n_blocks): |
| 45 | for j in range(i, n_blocks): |
| 46 | density = p if i == j else q |
| 47 | block = sp.sparse.random( |
| 48 | block_size, |
| 49 | block_size, |
| 50 | density, |
| 51 | random_state=rng, |
| 52 | data_rvs=lambda n: np.ones(n), |
| 53 | ) |
| 54 | rows.append(block.row + i * block_size) |
| 55 | cols.append(block.col + j * block_size) |
| 56 | |
| 57 | rows = np.hstack(rows) |
| 58 | cols = np.hstack(cols) |
| 59 | a = sp.sparse.coo_matrix( |
| 60 | (np.ones(rows.shape[0]), (rows, cols)), shape=(n, n) |
| 61 | ) |
| 62 | adj = sp.sparse.triu(a) + sp.sparse.triu(a, 1).transpose() |
| 63 | return adj |
| 64 | |
| 65 | |
| 66 | class SBMMixtureDataset(DGLDataset): |