【问题标题】:How to set the parameters of Barabási model巴拉巴西模型的参数如何设置
【发布时间】:2016-04-01 17:55:13
【问题描述】:

我想使用 Barabási–Albert (BA) Preferential Attachment 模型来生成具有指定属性的图形。 顶点数和边数:V(g)=20,E(g)=72,分别。入度和出度的向量也是已知的。我想生成没有循环、多条边和孤立顶点的有向图。

有人可以提供一些想法如何设置函数 barabasi.game() 的参数吗?我当前的设置是:

out_seq<-degree(g, mode="out")
sum(out_seq)
#[1] 72
g1<-barabasi.game(20,out.seq = out_seq)
summary(g1)
#IGRAPH D--- 20 62 -- Barabasi graph
#+ attr: name (g/c), power (g/n), m (g/x), zero.appeal (g/n),
#| algorithm (g/c)
has.multiple(g1)
#[1] FALSE

之前我使用了函数degree.sequence.game()。它正在工作,但我必须删除参数:method="vl"

degs_out <- degree(g, mode="out")
degs_in <- degree(g, mode="in")
g1<-degree.sequence.game(degs_out, degs_in)#, method="vl")
# IGRAPH D D--- 20 72 -- Degree sequence random graph
#+ attr: name (g/c), method (g/c)

谢谢。

编辑。 vlv1 不同。第一种情况vl是两个字母vl,第二种情况v1包括字母v和数字1

【问题讨论】:

  • 您可以手动构建一个 out.seq 向量,使边的总数(在所有时间步长上)总计为 72。
  • @LiorKogan,谢谢。我已经构建了 out_seq 向量并检查了边的总数:总和为 72,但生成的图只有 62 条边。如何改变这种情况?
  • 您是否有机会获得多重优势?您可以通过is_simple 查询。算法参数在这里对此进行了一些讨论:igraph.org/r/doc/sample_pa.html
  • 也刚刚在 out.seq 的文档中注意到这一点:“数值向量给出了每个时间步中要添加的边数。它的第一个元素被忽略因为没有边在第一个时间步中添加。”也许第一个元素被忽略了,其中有 10 条边?

标签: r graph-algorithm igraph


【解决方案1】:

我知道这个问题在这里已经有一段时间了,但希望我下面的回答可以作为将来类似情况的参考。

按照@LiorKogan 的建议,首先您需要创建一个相加为 72 的 out.seq 向量。您可以通过检查this post 来做到这一点。这是实现此任务的函数:

rand_vect <- function(N, M, sd = 1, pos.only = TRUE) {
  vec <- rnorm(N, M/N, sd)
  if (abs(sum(vec)) < 0.01) vec <- vec + 1
  vec <- round(vec / sum(vec) * M)
  deviation <- M - sum(vec)
  for (. in seq_len(abs(deviation))) {
    vec[i] <- vec[i <- sample(N, 1)] + sign(deviation)
  }
  if (pos.only) while (any(vec < 0)) {
    negs <- vec < 0
    pos  <- vec > 0
    vec[negs][i] <- vec[negs][i <- sample(sum(negs), 1)] + 1
    vec[pos][i]  <- vec[pos ][i <- sample(sum(pos ), 1)] - 1
  }
  vec
}

由于进入网络的初始节点无法与许多其他节点连接(因为它们还没有!),您必须在向量init_nodes中手动设置它们的连接,即:节点1与nobody连接,节点 2 仅与节点 1 连接,节点 3 与两者都连接......依此类推。

nodes=20
edges=72
init_nodes <- c(0,1,2,3,4)

对于向量的“其余部分”,我们使用上面的函数使得整个向量加起来为 72:

out_seq = c(init_nodes,rand_vect(nodes-length(init_nodes), edges-sum(init_nodes),pos.only = TRUE))

上面的例程可能需要改进,但在我所有的尝试中都运行良好。完成后,您可以检查规则是否有效。它必须加起来为 72:

sum(out_seq)

现在您可以使用向量 out_seq 继续进行 Barabasi 游戏

graph01 <- barabasi.game(nodes, 
              directed = TRUE,
              out.seq = out_seq
              ) 

创建图后,您可以仔细检查是否满足 72 条边的要求:

length(E(graph01))

最后将向量out.seq与实际度数形成对比:

degree(graph01, loops = FALSE, normalized=FALSE, mode="out")
out_seq

最后,询问R 你的图表是否简单:

is_simple(graph01)

希望对您有所帮助!祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 2023-03-03
    • 2014-07-28
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多