【问题标题】:Creating graph with iGraph and computing similarity metric使用 iGraph 创建图并计算相似度指标
【发布时间】:2018-12-19 05:58:55
【问题描述】:

我正在尝试使用如下所示的 csv 文件在 igraph 中创建图形:

ID    Element1 Element2 Element3 Element4
12346  A        12       56       2
13007  Y        16       66       2
...    ...      ...      ...      ...

ID 列由唯一的 4 位标识符填充,而元素列由重复的数字(或 Element1 中的字母)填充。我的目标是计算所有 ID 的成对 Jaccard 相似度,这利用了 ID 节点之间共享的元素。输出应该是一个 NxN 矩阵。

我一直在尝试使用graph_from_data_frame 功能在 igraph 上创建图形,但这会从前两列创建节点,并将其余列作为边缘属性放置在它创建的节点之间的关系中。关于创建允许我计算 ID 节点之间的 Jaccard 的图表的最佳方法的任何想法?

作为参考,目标是使用igraph的这个特性:

 similarity(graph, vids = V(graph), mode = c("all", "out", "in", "total"),
 loops = FALSE, method = c("jaccard", "dice", "invlogweighted"))

graph 是我创建的图表,vids是 ID 节点。

【问题讨论】:

  • 我不明白所需的图表应该是什么样子。你可以说得更详细点吗?如果您在示例输入和所需输出中包含正确的reproducible example,则更容易为您提供帮助(准确地说,避免... - 只是一个简单的示例)
  • 在其他平台上,我创建了带有所有已分配元数据元素的 ID 节点,以及每个元数据元素类型的节点。例如,12346 的 ID 节点包含其 Element1-Element4 作为属性,并与其分配的 Element 节点有关系。不确定这是否是我应该使用 igraph 创建的,或者如果它们共享一种元素,我是否应该只有彼此连接的 ID 节点。
  • 您是否需要该图来做其他事情,还是只需要计算您的 ID 之间的 Jaccard 相似度?
  • 我不需要。有没有办法在不使用 igraph 的相似度函数的情况下做到这一点?

标签: r igraph similarity


【解决方案1】:

如果您的主要目标是计算 ID 之间的 Jaccard 相似度,则无需先创建图表即可完成。 Jaccard 相似度定义为交集除以并集 J(A,B) = |A⋂B| / |A⋃B|,相当于|A⋂B| / ( |A| + |B| - |A⋂B| )。所以可以这样计算:

## Example dataset
df = read.table(text = "ID    Element1 Element2 Element3 Element4
  12346  A        12       56       2
  13007  Y        16       66       2
  14008  B        14       56       3
  15078  A        15       56       4
  16000  Y        20       66       3"
,h=T,stringsAsFactors=F)

n = nrow(df)
m = matrix(0,n,n,dimnames=list(df[,1],df[,1]))
for(i in 1:n){
    for(j in i:n){
        m[i,j] = length(intersect(df[i,-1],df[j,-1]))/(2*(n-1)-length(intersect(df[i,-1],df[j,-1])))}}
## Making the matrix symmetrical
m[lower.tri(m)] = t(m)[lower.tri(m)]
> m
          12346     13007     14008     15078     16000
12346 1.0000000 0.1428571 0.1428571 0.3333333 0.0000000
13007 0.1428571 1.0000000 0.0000000 0.0000000 0.3333333
14008 0.1428571 0.0000000 1.0000000 0.1428571 0.1428571
15078 0.3333333 0.0000000 0.1428571 1.0000000 0.0000000
16000 0.0000000 0.3333333 0.1428571 0.0000000 1.0000000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    相关资源
    最近更新 更多