R Eigenvector Centrality with Weight

时间:2016-08-29 14:16:21

标签: r graph igraph eigenvector weighting

我正在使用R和来自igraph库的特征向量中心算法。我们有以下sql表:

person1 / person2 / score

A / B / 0.568

A / C / 1.233

B / A / 0.798

B / C / 0.493

C / A / 1.367

C / B / 1.276

这些值是两个人之间关系的分数。

两个问题: - 如何从上表中以分数作为权重在R中创建矩阵? Result

Person   A       B     C 
A        -     0.568  1.233
B      0.798     -    0.493
C     1.367    1.276   -
  • 我们怎样才能考虑在R中应用特征向量中心算法的关系权重?

2 个答案:

答案 0 :(得分:2)

要在计算特征向量中心性时应用边权重,只需使用<p>{{theme_settings.my_license_key}}</p> weights选项引用权重:

eigen_centrality

获得权重的邻接矩阵:

rm(list=ls())

library(igraph)

# Some sample data, source: http://www.shizukalab.com/toolkits/sna/weighted-edgelists
el <- structure(list(V1 = c(23732L, 23732L, 23778L, 23778L, 23871L, 
23871L, 23871L, 58009L, 58098L, 58256L), V2 = c(23871L, 58098L, 
23732L, 23824L, 23778L, 58009L, 58098L, 58098L, 23778L, 58098L
), weight = c(1L, 10L, 8L, 1L, 15L, 1L, 5L, 7L, 1L, 1L)), .Names = c("V1", 
"V2", "weight"), class = "data.frame", row.names = c(NA, -10L
))

g <- graph.data.frame(el)

# Only showing the centrality scores, hence the $vector
eigen_centrality(g, directed=TRUE, weights=E(g)$weight)$vector

#     23732      23778      23871      58009      58098      58256      23824 
# 0.53685043 0.39782138 0.09055835 0.01527579 1.00000000 0.00000000 0.06710630 

答案 1 :(得分:1)

通过创建新矩阵,按人1和2命名行和列,然后将值分配到正确的位置,只是一种快速而又脏的方法。我们使用了两个没有被新用户讨论过的R技巧。

1)您可以按名称提取对象的元素。

2)您可以使用双列矩阵进行子集化。

p1 <- sort(unique(df$person1))
p2 <- sort(unique(df$person2))
mat <- matrix(0, length(p1), length(p2))
rownames(mat) <- p1
colnames(mat) <- p2
mat[as.matrix(df[1:2])] <- df$score
mat
#        A     B     C 
# A  0.000 0.568 1.233
# B  0.798 0.000 0.493
# C  1.367 1.276 0.000