Найти разделение на шесть градусов в сети актер-актер - PullRequest
0 голосов
/ 18 января 2019

Я попытался найти центральный узел в сети Actor-Actor. Когда я говорил о центральном узле, я имел в виду тот узел, который имеет кратчайшие пути ко всем остальным узлам в сети.

Например:

df <- structure(list(Movie.Name = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L), .Label = c("A", "B", "C", 
"D"), class = "factor"), Actor.Name = structure(c(1L, 5L, 6L, 
7L, 8L, 5L, 9L, 1L, 10L, 11L, 8L, 12L, 2L, 3L, 4L), .Label = c("Actor1", 
"Actor10", "Actor11", "Actor12", "Actor2", "Actor3", "Actor4", 
"Actor5", "Actor6", "Actor7", "Actor8", "Actor9"), class = "factor")), .Names = c("Movie.Name", 
"Actor.Name"), class = "data.frame", row.names = c(NA, -15L))

Из этой двухсторонней сети я спроектировал сеть актер-актер и нашел кратчайший путь для всех узлов с этим кодом:

library(igraph)
g_graph <- graph.data.frame(df,directed=FALSE)
V(g_graph)$type <- bipartite_mapping(g_graph)$type
# project only actor&actor network
projected_g <- bipartite_projection(g_graph, multiplicity = TRUE, which = TRUE)
# Get connected nodes in largest component
# get largest component
getmax = function(g) {
  V(g)$comp = clusters(g)$membership
  delete.vertices(g, V(g)[V(g)$comp!=which(clusters(g)$csize==max(clusters(g)$csize))])  
}
lc_projected_g <- getmax(projected_g)
# Turn weights into sample value!! 
E(lc_projected_g)$weight <- 1
# Find shortes path from one to all nodes
p_short <- shortest.paths(lc_projected_g)
p_df <-as.data.frame(rownames(p_short))
p_df$Total_path_length <- rowSums(p_short)
# Find eigenvector centrality!!!
projected_eig <- eigen_centrality(lc_projected_g)$vector

Мои вопросы:

  • В igraph вес рассматривается как стоимость или близкие отношения, поэтому правильно ли переводить вес в одно и то же значение? Даже если между Actor01 и Actor02 много ребер, длина пути будет равна единице!

  • После расчета кратчайшего пути для всех узлов, есть три узла, которые имеют одинаковое значение. В этом случае центральность собственного вектора - верный способ найти центральный узел?

  • Когда я проектировал двухстороннюю сеть, я терял имена ребер в сети Actor-Actor. Как я могу назначить их обратно?

Я надеюсь, что мои вопросы ясны и разумны. Заранее спасибо.

1 Ответ

0 голосов
/ 18 января 2019

Узлом с кратчайшим путем ко всем остальным узлам будет узел с наименьшей дальностью или наивысшей центральностью близости, рассчитанный в igraph с closeness() См. ?closeness() и Бавеласом (1950) и хорошей вики страница для централизованных мер .

Ответы на три нижеследующих вопроса:

1) В igraph вес составляет трение , без смазки. См. мой недавний ответ на тот же вопрос здесь для более подробной информации

2) Я думаю, центральность близости звучит больше как то, что вы ищете: " наименьшее суммарное расстояние до всех других узлов ". В вашем случае и центральность собственного вектора (которая, как мне кажется, имеет более сложную и менее интуитивную формулу) и центральность близости оставляют вас с привязанными победителями. Сравните:

eigen_centrality(lc_projected_g)$vector
closeness(lc_projected_g)

Решение о том, какой узел является правильным, если многие победители имеют одинаковое значение, на самом деле является вопросом вашего собственного суждения. Поскольку у нескольких ученых было число Эрдаса 1, Пол Эрдс использовал альтернативную формулу для наименьшего числа Эрда с 1 на k совместно опубликованных работ, чтобы присвоить наименьшее число Эрда человеку с большинством совместно опубликованных работ (k) с ему. Я подозреваю, что при воспроизведении ваших типов аффилированных сетей будут создаваться структуры с «привязанными победителями» для кратчайшего пути ко всем остальным узлам, а также в диаграммах немного большего размера, чем у вас. Возможно, вы могли бы еще раз подумать, почему вы хотите, чтобы самый центральный узел вашей перепроекции имел в виду, вернувшись к исходной двухсторонней структуре вашего графа?

3) Вы потеряли имена ребер, потому что перепроецированные ребра по сути не совпадают с ребрами. Радуйся, что они ушли. Однако я не могу воспроизвести потерянных краевых имен с вашим кодом. g_graph не имеет имен или меток, установленных для E(g). E(lc_projected_g) перечисляет хорошо именованные ребра, поскольку вершины имеют правильные имена. Вы всегда можете перестроить свои собственные имена, такие как:

E(lc_projected_g)$label <- apply(ends(lc_projected_g, E(lc_projected_g)), 1, paste,collapse="--")

при условии, что ваши вершины уже правильно названы. Ваша проекция с bipartite_projection() всегда должна содержать имена вершин, но не имена ребер. В вашем коде выше, они делают - по крайней мере для меня. Моя строка кода выше устанавливает метку (которая отображается при построении графика), используя paste(), чтобы склеить имена вершинных пар каждого ребра вместе с помощью "-". Проверьте ends(lc_projected_g, E(lc_projected_g)). Он должен перечислить именованные пары вершин в виде матрицы.

Много вопросов в одном, но хорошо работающем примере кода. Удачи.

...