【问题标题】:R Eigenvector Centrality with Weight [closed]具有权重的 R 特征向量中心性 [关闭]
【发布时间】:2016-08-29 14:16:21
【问题描述】:

我正在使用 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 中应用特征向量中心性算法?

【问题讨论】:

    标签: r graph igraph eigenvector weighting


    【解决方案1】:

    要在计算特征向量中心性时应用边权重,只需使用 eigen_centralityweights 选项引用权重即可:

    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 
    

    获取权重的邻接矩阵:

    get.adjacency(g, attr='weight')
    

    【讨论】:

    • 你能发布你的输出吗?调用E(g) 使用示例返回NULL
    【解决方案2】:

    创建一个新矩阵,按人 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
    

    【讨论】:

    • 这对我不起作用。我们有 20 个独特的数据 person1,这将使矩阵中的所有分数为零,因为我们有多个分数,所以这是不正确的。表中有一个数据示例: person1 person2 score 16182470 79389918 3.1 72765516 61389465 3.2 我将在代码后面有一个矩阵 61389465 79389918 16182470 0 0 72765516 0 0 我该如何纠正?
    • 向 cmets 添加代码没有帮助。请修改您的问题。
    • 嗨,皮埃尔,继续,代码能够提取 persone1 和 person2 的唯一值,但矩阵中的所有分值都为 0。你知道为什么吗?
    • 我已经向您展示了它适用于您的示例。
    • 请发布显示问题行为的数据。将其发布到您的问题中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    相关资源
    最近更新 更多