Как удалить узлы в igraph в R? - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь написать сценарий, который удаляет узлы в сети Барабаси-Альберта в R с использованием igraph на основе количества соединений узла (я пытаюсь воссоздать некоторые базовые c результаты из «Ошибка и атака» толерантность к сложным сетям "бумага Альберта, Чжон и Барабаси). Я начинаю с того, что пытаюсь удалить пять случайных узлов, у которых меньше среднего числа соединений узла в сети. Однако, когда я визуализирую сеть после того, как пытаюсь удалить узлы, она выглядит иначе, но не похоже, что узлы удалены. Так что я не уверен, что скрипт работает.

nnodes=50 #number of nodes
test.graph<-barabasi.game(nnodes,.5) #create B-A network
test.graph2=test.graph #create a second B-A network for removing nodes
bar_mat=matrix(0,nrow=nnodes,ncol=1) #create empty matrix
for (i in 1:nnodes){
bar_mat[i,]=sum(test.graph[,i]) #sums up the number of connections of each node
}
###Visualizing the network before removing nodes
barabasi.community<-walktrap.community(test.graph) #this is supposed to visualize the most
#connected nodes in the network
members<-membership(barabasi.community)
plot.igraph(test.graph,
        layout=layout.fruchterman.reingold,
        vertex.size=10,
        vertex.label.cex=.5,
        edge.arrow.size=.5,
        mark.groups=list(members),
        mark.col="green"
)
f=c()

for (k in 1:5){ #checking five random nodes
 a=sample(1:nrow(bar_mat),1) #select random node
 if(bar_mat[a,]<=mean(bar_mat)){
  test.graph2 <- delete.vertices(test.graph2,a) # this is supposed to delete 
  #the node based on if it has lower than the average amount of connections
  i=i+1 #counting how many nodes of the five are actually removed
 }
f[k]=a #putting the nodes tested into a vector
a=0 #resetting a
}
###Visualizing network after node removal 
barabasi.community2<-walktrap.community(test.graph2)
members2<-membership(barabasi.community2)
plot.igraph(test.graph2,
        layout=layout.fruchterman.reingold,
        vertex.size=10,
        vertex.label.cex=.5,
        edge.arrow.size=.5,
        mark.groups=list(members2),
        mark.col="pink"
) 

Сценарий выполняется, когда количество узлов меньше (например, около 50), но когда число узлов больше (около 100), я получаю следующую ошибку:

Error in delete.vertices(test.graph2, a) : 
At iterators.c:759 : Cannot create iterator, invalid vertex id, Invalid vertex id

Я думаю, что это связано с соглашениями об именах узлов, но я не уверен. Я новичок в сетевой науке и не лучший программист, поэтому буду очень признателен за любую помощь. Спасибо!

1 Ответ

0 голосов
/ 07 апреля 2020

Ошибка возникает потому, что, поскольку вы каждый раз выбираете случайным образом из nrow(bar_mat), вы можете выбрать узел, который уже был удален. Так, например, l oop запускается в первый раз и выбирает строку 24. Он будет работать и удалять узел 24. Он запускается снова и выбирает строку 12. Он будет работать и удалять узел 12. Он запускается снова и выбирает строку 24. Теперь он не может работать, потому что у графа больше нет узла 24! В противном случае ваш код в порядке и действительно удаляет узлы.

Вы можете решить эту проблему несколькими способами, например, выбрав 5 случайных узлов одновременно (здесь я делаю 20, чтобы ясно показать, что узлы были удалено):

library(igraph)

nnodes=100 #number of nodes
test.graph<-barabasi.game(nnodes,.5) #create B-A network
test.graph2=test.graph #create a second B-A network for removing nodes
bar_mat=matrix(0,nrow=nnodes,ncol=1) #create empty matrix
for (i in 1:nnodes){
  bar_mat[i,]=sum(test.graph[,i]) #sums up the number of connections of each node
}

vcount(test.graph)
#> [1] 100

# Sample 5 random nodes
set.seed(1491)
a=sample(1:nrow(bar_mat), 20)

for (i in a) {
  if(bar_mat[i,]<=mean(bar_mat)){a
    test.graph2 <- delete.vertices(test.graph2,i)
    }
  }
#> Error in delete.vertices(test.graph2, i): At iterators.c:759 : Cannot create iterator, invalid vertex id, Invalid vertex id

vcount(test.graph)
#> [1] 100
vcount(test.graph2)
#> [1] 88

Создано в 2020-04-07 пакетом Представлять (v0.3.0)

...