模拟

graspologic.simulations.er_np(n, p, directed=False, loops=False, wt=1, wtargs=None, dc=None, dc_kws={})[源代码]

使用指定的边概率采样一个Erdos Renyi (n, p)图。

Erdos Renyi (n, p) 图是一个具有 n 个顶点且边连接概率为 p 的简单图。

了解更多内容,请访问Erdos-Renyi (ER) 模型教程

Parameters:
n: int

顶点数量

p: float

两个顶点之间存在边的概率,介于0和1之间。

directed: boolean, optional (default=False)

如果为False,输出的邻接矩阵将是对称的。否则,输出的邻接矩阵将是非对称的。

loops: boolean, optional (default=False)

如果为False,则不会在对角线上采样任何边。否则,将在对角线上采样边。

wt: object, optional (default=1)

每条边的权重函数,仅接受一个大小参数。 此权重函数将随机分配给选定的边。 如果为1,生成的图是二元的。

wtargs: dictionary, optional (default=None)

可以传递给权重函数 wt 的参数的可选参数。

dc: function or array-like, shape (n_vertices)

dc 用于生成一个度校正的Erdos Renyi模型,其中图中的每个节点都有一个参数来指定其相对于其他节点的期望度数。

  • function:

    应该生成一个非负数,用作度数校正,以创建异质度数分布。将为每个顶点生成一个权重,并进行归一化,使权重之和为1。

  • array-like of scalars, shape (n_vertices):

    权重之和应为1;否则,它们将被归一化并抛出警告。与每个顶点相关联的标量是节点的相对预期度。

dc_kws: dictionary

如果dc为none或标量数组,则忽略。 如果dc是一个函数,dc_kws对应于其命名参数。 如果未指定,在任何情况下所有函数都将假定其默认参数。

Returns:
Andarray, shape (n, n)

采样邻接矩阵

Parameters:
Return type:

ndarray

Examples

>>> np.random.seed(1)
>>> n = 4
>>> p = 0.25

要采样一个二元的Erdos Renyi (n, p)图:

>>> er_np(n, p)
array([[0., 0., 1., 0.],
       [0., 0., 1., 0.],
       [1., 1., 0., 0.],
       [0., 0., 0., 0.]])

要使用均匀分布(0, 1)对加权的Erdos Renyi (n, p)图进行采样:

>>> wt = np.random.uniform
>>> wtargs = dict(low=0, high=1)
>>> er_np(n, p, wt=wt, wtargs=wtargs)
array([[0.        , 0.        , 0.95788953, 0.53316528],
       [0.        , 0.        , 0.        , 0.        ],
       [0.95788953, 0.        , 0.        , 0.31551563],
       [0.53316528, 0.        , 0.31551563, 0.        ]])
graspologic.simulations.er_nm(n, m, directed=False, loops=False, wt=1, wtargs=None)[源代码]

采样一个具有指定边数的Erdos Renyi (n, m)图。

Erdos Renyi (n, m) 图是一个具有 n 个顶点和恰好 m 条总边数的简单图。

了解更多内容,请访问Erdos-Renyi (ER) 模型教程

Parameters:
n: int

顶点数量

m: int

边的数量,一个介于1和\(n^2\)之间的值。

directed: boolean, optional (default=False)

如果为False,输出的邻接矩阵将是对称的。否则,输出的邻接矩阵将是非对称的。

loops: boolean, optional (default=False)

如果为False,则不会在对角线上采样任何边。否则,将在对角线上采样边。

wt: object, optional (default=1)

每条边的权重函数,仅接受一个大小参数。 此权重函数将随机分配给选定的边。 如果为1,生成的图是二元的。

wtargs: dictionary, optional (default=None)

可以传递给权重函数 wt 的参数的可选参数。

Returns:
A: ndarray, shape (n, n)

采样邻接矩阵

Parameters:
Return type:

ndarray

Examples

>>> np.random.seed(1)
>>> n = 4
>>> m = 4

要采样一个二元的Erdos Renyi (n, m)图:

>>> er_nm(n, m)
array([[0., 1., 1., 1.],
       [1., 0., 0., 1.],
       [1., 0., 0., 0.],
       [1., 1., 0., 0.]])

要使用均匀分布(0, 1)对加权Erdos Renyi(n, m)图进行采样:

>>> wt = np.random.uniform
>>> wtargs = dict(low=0, high=1)
>>> er_nm(n, m, wt=wt, wtargs=wtargs)
array([[0.        , 0.66974604, 0.        , 0.38791074],
       [0.66974604, 0.        , 0.        , 0.39658073],
       [0.        , 0.        , 0.        , 0.93553907],
       [0.38791074, 0.39658073, 0.93553907, 0.        ]])
graspologic.simulations.sbm(n, p, directed=False, loops=False, wt=1, wtargs=None, dc=None, dc_kws={}, return_labels=False)[source]

从随机块模型(SBM)中采样一个图。

SBM生成一个具有指定社区的图,其中每个社区可以有不同的规模和边概率。

了解更多信息,请访问随机块模型(SBM)教程

Parameters:
n: list of int, shape (n_communities)

每个社区中的顶点数。社区被分配为 n[0], n[1], ...

p: array-like, shape (n_communities, n_communities)

每个社区之间的边的概率,其中p[i, j]表示社区[i, j]之间的连接概率。 对于所有的i, j0 < p[i, j] < 1

directed: boolean, optional (default=False)

如果为False,输出的邻接矩阵将是对称的。否则,输出的邻接矩阵将是非对称的。

loops: boolean, optional (default=False)

如果为False,则不会在对角线上采样任何边。否则,将在对角线上采样边。

wt: object or array-like, shape (n_communities, n_communities)

如果 wt 是一个对象,则是一个全局用于 sbm 的权重函数,用于分配权重。1 表示生成一个二值图。如果 wt 是一个类数组,则为每个边社区的权重函数。wt[i, j] 对应于社区 i 和 j 之间的权重函数。如果条目是一个函数,则应接受一个大小参数。条目 wt[i, j] = 1 将在 i, j 社区上生成一个二值子图。

wtargs: dictionary or array-like, shape (n_communities, n_communities)

如果 wt 是一个对象,wtargs 对应于传递给权重函数的尾部参数。如果 Wt 是一个类似数组的对象,wtargs[i, j] 对应于传递给 wt[i, j] 的尾部参数。

dc: function or array-like, shape (n_vertices) or (n_communities), optional

dc 用于生成一个度校正的随机块模型 [1],在该模型中,图中的每个节点都有一个参数,用于指定其在其社区内相对于其他节点的期望度数。

  • function:

    应该生成一个非负数,用作度数校正,以创建异质度数分布。将为每个顶点生成一个权重,并进行归一化,使得每个块中的权重总和为1。

  • array-like of functions, shape (n_communities):

    每个函数将生成其各自社区的度分布。

  • array-like of scalars, shape (n_vertices):

    每个块中的权重总和应为1;否则,它们将被归一化并抛出警告。与每个顶点相关的标量是该节点在其社区内的相对预期度。

dc_kws: dictionary or array-like, shape (n_communities), optional

如果dc为none或标量数组,则忽略。 如果dc是一个函数,dc_kws对应于其命名参数。 如果dc是一个类似函数的数组,dc_kws应该是一个形状为(n_communities)的类似数组,每个字典是该社区对应函数的命名参数。 如果未指定,无论哪种情况,所有函数都将假定其默认参数。

return_labels: boolean, optional (default=False)

如果为False,则仅输出邻接矩阵。否则,将有一个额外的输出,该输出是一个长度等于图中顶点数的数组,其中数组中的每个条目标记图中顶点所在的块。

Returns:
A: ndarray, shape (sum(n), sum(n))

采样邻接矩阵

labels: ndarray, shape (sum(n))

标签向量

Parameters:
Return type:

ndarray | tuple[ndarray, ndarray]

参考文献

[1]

泰秦和卡尔·罗赫。 "在度校正随机块模型下的正则化谱聚类," 神经信息处理系统进展 26, 2013

Examples

>>> np.random.seed(1)
>>> n = [3, 3]
>>> p = [[0.5, 0.1], [0.1, 0.5]]

要采样一个二元的2块SBM图:

>>> sbm(n, p)
array([[0., 0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0., 1.],
       [1., 1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 1., 0.],
       [0., 0., 0., 1., 0., 0.],
       [0., 1., 0., 0., 0., 0.]])

要使用泊松(2)分布对加权的2块SBM图进行采样:

>>> wt = np.random.poisson
>>> wtargs = dict(lam=2)
>>> sbm(n, p, wt=wt, wtargs=wtargs)
array([[0., 4., 0., 1., 0., 0.],
       [4., 0., 0., 0., 0., 2.],
       [0., 0., 0., 0., 0., 0.],
       [1., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 2., 0., 0., 0., 0.]])
graspologic.simulations.rdpg(X, Y=None, rescale=False, directed=False, loops=False, wt=1, wtargs=None)[源代码]

基于X中的潜在位置(以及可选的Y中的潜在位置)随机采样一个图

如果只给出 X \(\in\mathbb{R}^{n\times d}\),则 P 矩阵计算为 \(P = XX^T\)。如果给出 X, Y \(\in\mathbb{R}^{n\times d}\),则 \(P = XY^T\)。这些操作对应于一组潜在位置之间的点积,因此 X 或 Y 中的每一行表示随机图中单个顶点的潜在位置 \(\mathbb{R}^{d}\)。 请注意,此函数还可能重新缩放或裁剪生成的 P 矩阵以获得 0 到 1 之间的概率,或移除循环。 然后从由 X(可能还有 Y)描述的 P 矩阵中采样一个二元随机图。

了解更多信息,请访问随机点积图(RDPG)模型教程

Parameters:
X: np.ndarray, shape (n_vertices, n_dimensions)

生成P矩阵的潜在位置 如果给出了Y,则解释为左侧潜在位置

Y: np.ndarray, shape (n_vertices, n_dimensions) or None, optional

生成P矩阵的正确潜在位置

rescale: boolean, optional (default=False)

rescale 为 True 时,将减去 P 中的最小值(如果它小于 0)并除以最大值(如果它大于 1),以确保 P 的条目在 0 和 1 之间。如果为 False,P 中超出 [0, 1] 范围的元素将被裁剪。

directed: boolean, optional (default=False)

如果为False,输出的邻接矩阵将是对称的。否则,输出的邻接矩阵将是非对称的。

loops: boolean, optional (default=False)

如果为False,则不会在对角线上采样边。在重新缩放之前,P矩阵中的对角线元素被移除(见上文),这可能会影响行为。否则,将在对角线上采样边。

wt: object, optional (default=1)

每条边的权重函数,仅接受一个大小参数。 此权重函数将随机分配给选定的边。 如果为1,生成的图是二元的。

wtargs: dictionary, optional (default=None)

可以传递给权重函数 wt 的参数的可选参数。

Returns:
A: ndarray (n_vertices, n_vertices)

一个矩阵,表示基于其潜在位置的随机图中顶点之间连接的概率

Parameters:
Return type:

ndarray

参考文献

[1]

Sussman, D.L., Tang, M., Fishkind, D.E., Priebe, C.E. "随机块模型图的一致性邻接谱嵌入," 美国统计协会杂志, 卷107(499), 2012

Examples

>>> np.random.seed(1)

使用二维狄利克雷分布生成随机潜在位置。

>>> X = np.random.dirichlet([1, 1], size=5)

使用采样的潜在位置对二元RDPG进行采样。

>>> rdpg(X, loops=False)
array([[0., 1., 0., 0., 1.],
       [1., 0., 0., 1., 1.],
       [0., 0., 0., 1., 1.],
       [0., 1., 1., 0., 0.],
       [1., 1., 1., 0., 0.]])

使用泊松(2)权重分布对加权RDPG进行采样

>>> wt = np.random.poisson
>>> wtargs = dict(lam=2)
>>> rdpg(X, loops=False, wt=wt, wtargs=wtargs)
array([[0., 4., 0., 2., 0.],
       [1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 2.],
       [1., 0., 0., 0., 1.],
       [0., 2., 2., 0., 0.]])
graspologic.simulations.er_corr(n, p, r, directed=False, loops=False)[源代码]

生成一对具有指定边概率的相关图 G1和G2都是二进制矩阵。

Parameters:
n: int

顶点数量

p: float

两个顶点之间存在边的概率,介于0和1之间。

r: float

两个图中相同顶点之间的相关值。

directed: boolean, optional (default=False)

如果为False,输出的邻接矩阵将是对称的。否则,输出的邻接矩阵将是非对称的。

loops: boolean, optional (default=False)

如果为False,则不会在对角线上采样任何边。否则,将在对角线上采样边。

Returns:
G1: ndarray (n_vertices, n_vertices)

与P大小相同的邻接矩阵,表示一个随机图。

G2: ndarray (n_vertices, n_vertices)

与P大小相同的邻接矩阵,表示一个随机图。

Parameters:
Return type:

tuple[ndarray, ndarray]

Examples

>>> np.random.seed(2)
>>> p = 0.5
>>> r = 0.3
>>> n = 5

基于n、p和r对相关的ER图对进行采样:

>>> er_corr(n, p, r, directed=False, loops=False)
(array([[0., 0., 1., 0., 0.],
    [0., 0., 0., 1., 0.],
    [1., 0., 0., 1., 1.],
    [0., 1., 1., 0., 1.],
    [0., 0., 1., 1., 0.]]), array([[0., 1., 1., 1., 0.],
    [1., 0., 0., 1., 0.],
    [1., 0., 0., 1., 1.],
    [1., 1., 1., 0., 1.],
    [0., 0., 1., 1., 0.]]))
graspologic.simulations.sbm_corr(n, p, r, directed=False, loops=False)[源代码]

生成一对具有指定边概率的相关图 G1和G2都是二进制矩阵。

Parameters:
n: list of int, shape (n_communities)

每个社区中的顶点数。社区被分配为 n[0], n[1], ...

p: array-like, shape (n_communities, n_communities)

每个社区之间的边的概率,其中p[i, j]表示社区[i, j]之间的连接概率。 对于所有的i, j0 < p[i, j] < 1

r: float

两个图中相同顶点之间相关性的概率。

directed: boolean, optional (default=False)

如果为False,输出的邻接矩阵将是对称的。否则,输出的邻接矩阵将是非对称的。

loops: boolean, optional (default=False)

如果为False,则不会在对角线上采样任何边。否则,将在对角线上采样边。

Returns:
G1: ndarray (n_vertices, n_vertices)

与P大小相同的邻接矩阵,表示一个随机图。

G2: ndarray (n_vertices, n_vertices)

与P大小相同的邻接矩阵,表示一个随机图。

Parameters:
Return type:

tuple[ndarray, ndarray]

Examples

>>> np.random.seed(3)
>>> n = [3, 3]
>>> p = [[0.5, 0.1], [0.1, 0.5]]
>>> r = 0.3

基于n、p和r采样一个相关的SBM图对:

>>> sbm_corr(n, p, r, directed=False, loops=False)
(array([[0., 1., 0., 0., 0., 0.],
    [1., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 1.],
    [0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 1., 0., 0.]]), array([[0., 1., 0., 0., 0., 0.],
    [1., 0., 0., 1., 1., 0.],
    [0., 0., 0., 0., 0., 0.],
    [0., 1., 0., 0., 0., 1.],
    [0., 1., 0., 0., 0., 0.],
    [0., 0., 0., 1., 0., 0.]]))
graspologic.simulations.rdpg_corr(X, Y, r, rescale=False, directed=False, loops=False)[source]

基于X中的潜在位置(以及可选的Y中的潜在位置)随机采样一个图对 如果只给出X \(\in\mathbb{R}^{n\times d}\),则P矩阵计算为 \(P = XX^T\)。如果给出X, Y \(\in\mathbb{R}^{n\times d}\),则 \(P = XY^T\)。这些操作对应于一组潜在位置之间的点积,因此X或Y中的每一行表示随机图中单个顶点的潜在位置 \(\mathbb{R}^{d}\)。 请注意,此函数还可能重新缩放或裁剪生成的P矩阵以获得0到1之间的概率,或去除循环。 然后从由X(可能还有Y)描述的P矩阵中采样一个二元随机图。

了解更多信息,请访问相关随机点积图(RDPG)图对教程

Parameters:
X: np.ndarray, shape (n_vertices, n_dimensions)

生成P矩阵的潜在位置 如果给出了Y,则解释为左侧潜在位置

Y: np.ndarray, shape (n_vertices, n_dimensions) or None, optional

生成P矩阵的正确潜在位置

r: float

两个图中相同顶点之间的相关值。

rescale: boolean, optional (default=True)

rescale 为 True 时,将减去 P 中的最小值(如果它小于 0)并除以最大值(如果它大于 1),以确保 P 的条目在 0 和 1 之间。如果为 False,P 中超出 [0, 1] 范围的元素将被裁剪。

directed: boolean, optional (default=False)

如果为False,输出的邻接矩阵将是对称的。否则,输出的邻接矩阵将是非对称的。

loops: boolean, optional (default=True)

如果为False,则不会在对角线上采样边。在重新缩放之前,P矩阵中的对角线元素被移除(见上文),这可能会影响行为。否则,将在对角线上采样边。

Returns:
G1: ndarray (n_vertices, n_vertices)

一个矩阵,表示基于其潜在位置的随机图中顶点之间连接的概率

G2: ndarray (n_vertices, n_vertices)

一个矩阵,表示基于其潜在位置的随机图中顶点之间连接的概率

Parameters:
Return type:

Tuple[ndarray, ndarray]

参考文献

[1]

Vince Lyzinski, Donniell E Fishkind 头像 Donniell E. Fishkind, Carey E Priebe. "用于相关Erdös-Rényi图的种子图匹配". 《机器学习研究杂志》, 2014年1月

Examples

>>> np.random.seed(1234)
>>> X = np.random.dirichlet([1, 1], size=5)
>>> Y = None

使用二维狄利克雷分布生成随机潜在位置。 然后采样一个相关的RDPG图对:

>>> rdpg_corr(X, Y, 0.3, rescale=False, directed=False, loops=False)
(array([[0., 1., 0., 1., 0.],
       [1., 0., 0., 1., 1.],
       [0., 0., 0., 0., 0.],
       [1., 1., 0., 0., 0.],
       [0., 1., 0., 0., 0.]]), array([[0., 1., 0., 1., 0.],
       [1., 0., 0., 0., 1.],
       [0., 0., 0., 0., 0.],
       [1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.]]))
graspologic.simulations.mmsbm(n, p, alpha=None, rng=None, directed=False, loops=False, return_labels=False)[来源]

从混合成员随机块模型(MMSBM)中采样一个图。

MMSBM 根据指定的块连接矩阵 B 生成一个图,该矩阵表示基于节点社区成员资格的连接概率。 每个节点都被分配了一个从 Dirichlet 分布中抽取的成员向量,参数为 \(\vec{\alpha}\)。该向量的条目表示该节点在与另一个节点交互时属于每个社区的概率。每个节点的成员资格根据这些概率确定。最后,根据分配的成员资格对交互进行采样。

了解更多信息,请访问混合成员随机块模型(MMSBM)教程

Parameters:
n: int

图的顶点数。

p: array-like, shape (n_communities, n_communities)

每个社区之间边的概率,其中 p[i, j] 表示社区 \((i, j)\) 中边之间的连接概率。对于所有 \(i, j\),0 < p[i, j] < 1。

alpha: array-like, shape (n_communities,)

用于对每个节点的混合成员向量进行采样的Dirichlet分布的参数alpha。 alpha[i] 对于所有 \(i\) 都必须大于0。

rng: numpy.random.Generator, optional (default = None)

numpy.random.Generator 对象用于从分布中采样。 如果为 None,随机数生成器是由 np.random.default_rng() 构造的 Generator 对象。

directed: boolean, optional (default=False)

如果为False,输出的邻接矩阵将是对称的。否则,输出的邻接矩阵将是非对称的。

loops: boolean, optional (default=False)

如果为False,则不会在对角线上采样任何边。否则,将在对角线上采样边。

return_labels: boolean, optional (default=False)

如果为False,唯一的输出是邻接矩阵。 如果为True,输出是一个元组。元组的第一个元素是邻接矩阵。第二个元素是一个矩阵,其中\((i^{th}, j^{th})\)条目表示节点i与节点j交互时分配的成员资格。社区1标记为0,社区2标记为1,依此类推。-1表示该交互未分配社区。

Returns:
A: ndarray, shape (n, n)

采样邻接矩阵

labels: ndarray, shape (n, n), optional

包含与另一个节点交互时分配给每个节点的成员资格的数组。

Parameters:
  • n (int)

  • p (ndarray)

  • alpha (ndarray | None)

  • rng (Generator | None)

  • directed (bool)

  • 循环 (bool)

  • return_labels (bool)

Return type:

ndarray | tuple[ndarray, ndarray]

参考文献

[1]

Airoldi, Edoardo, 等人. “混合成员随机块模型.” 《机器学习研究杂志》, 第9卷, 2008年, 第1981–2014页.

Examples

>>> rng = np.random.default_rng(1)
>>> np.random.seed(1)
>>> n = 6
>>> p = [[0.5, 0], [0, 1]]

为了在一个二元MMSBM中采样,其中所有节点很可能都属于社区二:

>>> alpha = [0.05, 1000]
>>> mmsbm(n, p, alpha, rng = rng)
array([[0., 1., 1., 1., 1., 1.],
       [1., 0., 1., 1., 1., 1.],
       [1., 1., 0., 1., 1., 1.],
       [1., 1., 1., 0., 1., 1.],
       [1., 1., 1., 1., 0., 1.],
       [1., 1., 1., 1., 1., 0.]])

要采样一个类似于具有连接矩阵B的2块SBM的二元MMSBM:

>>> rng = np.random.default_rng(1)
>>> np.random.seed(1)
>>> alpha = [0.05, 0.05]
>>> mmsbm(n, p, alpha, rng = rng)
array([[0., 1., 0., 0., 0., 0.],
       [1., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 1., 1.],
       [0., 0., 0., 1., 0., 1.],
       [0., 0., 0., 1., 1., 0.]])