首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图学习在R,igraph,Tidy图中的应用

图学习在R,igraph,Tidy图中的应用
EN

Stack Overflow用户
提问于 2022-03-25 14:26:41
回答 2查看 196关注 0票数 1

我有一个图,每个节点都有一个值(值为红色)。

我想做以下两件事(我想1是2的特例):

  1. 每个节点都应该被分配到直接节点的值的平均值。例如,节点#5 (0+2+0)/3=2/3.

或节点#3 (1+2)/2=1.5

  1. 不包括直接邻居,而是包含所有连通节点,但扩散次数为1/n,n为到节点的距离。信息离我们越远,我们的信号越弱。--

我查看了into的函数,但是找不到任何正在做这件事的东西(虽然我可能已经看到了)。我怎么能做这个计算?

下面是具有随机值的示例网络的代码。

代码语言:javascript
复制
library(tidyverse)
library(tidygraph)
library(ggraph)

set.seed(6)
q <- tidygraph::play_erdos_renyi(6, p = 0.2) %>% 
  mutate(id = row_number(),
         value = sample(0:3, size = 6, replace = T))
q %>% 
  ggraph(layout = "with_fr") +
  geom_edge_link(arrow = arrow(length = unit(0.2, "inches"), 
                               type = "closed")) +
  geom_node_label(aes(label = id)) +
  geom_node_text(aes(label = value), color = "red", size = 7, 
                 nudge_x = 0.2, nudge_y = 0.2)

编辑,找到了1的解决方案

代码语言:javascript
复制
q %>% 
  mutate(value_smooth = map_local_dbl(order = 1, mindist = 1, mode = "in", 
                                      .f = function(neighborhood, ...) {
    mean(as_tibble(neighborhood, active = 'nodes')$value)
  }))

编辑2,解决方案2,不是我想的最优雅的

代码语言:javascript
复制
q %>% 
  mutate(value_smooth = map_local_dbl(order = 1, mindist = 0, mode = "in", 
                                      .f = function(neighborhood, node, ...) {
    ne <- neighborhood
    
    ne <- ne %>%
      mutate(d = node_distance_to(which(as_tibble(ne, 
                                                  active = "nodes")$id == node)))
    
    as_tibble(ne, active = 'nodes') %>% 
      filter(d != 0) %>% 
      mutate(helper = value/d) %>% 
      summarise(m = mean(value)) %>% 
      pull(m)
    }))

map_local_dbl的一个更快的替代方案--编辑3

map_local循环遍历图的所有节点。对于大图,这需要很长时间。仅仅为了计算手段,这是不需要的。一个更快的选择是使用邻接矩阵和一些矩阵乘法。

代码语言:javascript
复制
q_adj <- q %>% 
  igraph::as_adjacency_matrix()

# out
(q_adj %*% as_tibble(q)$value) / Matrix::rowSums(q_adj)

# in
(t(q_adj) %*% as_tibble(q)$value) / Matrix::colSums(q_adj)

邻接矩阵的平方是二阶邻接矩阵,等等。因此,问题2的解决方案也可以创建出来。

编辑4,直接加权平均

假设原始图有与每条边相关联的权重。

代码语言:javascript
复制
q <- q %>% 
  activate(edges) %>% 
  mutate(w = c(1,0.5,1,0.5,1,0.5,1)) %>% 
  activate(nodes)

我们想要计算直接对等点值的加权平均值。

代码语言:javascript
复制
q_adj_wgt <- q %>% 
  igraph::as_adjacency_matrix(attr = "w")

# out
(q_adj_wgt %*% as_tibble(q)$value) / Matrix::rowSums(q_adj_wgt)

# in
(t(q_adj_wgt) %*% as_tibble(q)$value) / Matrix::colSums(q_adj_wgt)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-25 20:54:29

也许你可以试试下面的代码

代码语言:javascript
复制
q %>%
    set_vertex_attr(
        name = "value",
        value = sapply(
            ego(., mode = "in", mindist = 1),
            function(x) mean(x$value)
        )
    )

这给

代码语言:javascript
复制
# A tbl_graph: 6 nodes and 7 edges
#
# A directed simple graph with 1 component
#
# Node Data: 6 x 2 (active)
     id   value
  <int>   <dbl>
1     1   0.5
2     2 NaN
3     3   0.667
4     4 NaN
5     5   1.5
6     6 NaN
#
# Edge Data: 7 x 2
   from    to
  <int> <int>
1     3     1
2     6     1
3     1     3
# ... with 4 more rows
票数 1
EN

Stack Overflow用户

发布于 2022-03-25 15:39:28

每个节点都应该被分配到直接节点的值的平均值。

我猜你是说

在更改任何节点值之前,应该为每个节点分配指向它的直接对等点值的平均值。

这看起来很琐碎-也许我错过了什么?

代码语言:javascript
复制
Loop over nodes
    Sum values of adjacent nodes
    Calculate mean and store in vector by node index
Loop over nodes
    Set node value to mean stored in previous loop
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71618573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档