簡體   English   中英

為什么在圖相交后缺少節點-NetworkX,igraph,python和r

[英]Why there are missing nodes after graph intersection - NetworkX, igraph, python and r

嘗試獲取兩個網絡/圖形之間的交集時遇到了奇怪的事情。 當我檢查結果相交時,我發現缺少節點,我想了解為什么會這樣。

本來我正在使用python 3.5.2 / pandas 0.17.1。 在Linux Mint 18上,可重現該問題的數據集和代碼在鏈接上: 數據集和代碼

這兩個表(鏈接中附帶的Test_01.ncol和Test_02.ncol)都是邊緣列表。

首先,我嘗試通過合並功能獲得兩個帶有熊貓的圖形表的交集:

import pandas as pd

# Load graphs
test_01 = pd.read_csv("Test_01.ncol",sep=" ") # Load Net 1
test_02 = pd.read_csv("Test_02.ncol",sep=" ") # Load Net 2
pandas_intersect = pd.merge(test_01, test_02, how='inner', on=['i1', 'i2']) # Intersection by column

pandas_nodes = len(set(pandas_intersect['i1'].tolist() + pandas_intersect['i2'].tolist())) # Store the number of nodes

然后,為了檢查合並是否完成而沒有問題,我將結果的節點數與NetworkX交集的結果節點進行了比較,如下所示:

# Now test with NetworkX
import networkx as nx
n1 = nx.from_pandas_dataframe(test_01, source="i1", target="i2") # Transform net 1 in NetworkX Graph
n2 = nx.from_pandas_dataframe(test_02, source="i1", target="i2") # Transform net 2 in NetworkX Graph
fn = nx.intersection(n1,n2)  # NetworkX Intersection

networkx_nodes = len(fn.nodes()) # Store the number of nodes

# The number of nodes are different!!!
pandas_nodes == networkx_nodes

我認為這可能與節點的順序有關,在所附的表中不是規范的,但是即使我將兩個數據集按規范的順序放置,也會缺少節點。

我的下一個假設是,它可能是Pandas或NetworkX中的錯誤,因此我在R(版本3.3.2)和igraph(版本1.0.1)中進行了嘗試:

library("igraph")

# Read Tables
g1 <- read.table("Test_01.ncol",header=TRUE)
g2 <- read.table("Test_02.ncol",header=TRUE)

# Transform Tables in Graphs
g1 <- graph_from_data_frame(g1, directed=FALSE)
g2 <- graph_from_data_frame(g2, directed=FALSE)

# Create igraph interssection
gi <- graph.intersection(g1,g2)

# Save graph intersection
write.graph(gi,"Test_igraph_intersection.ncol", format="ncol")

# Reload graph intersection
gi_r <- read.graph("Test_igraph_intersection.ncol",format="ncol")

# Prepare result summary
Methods <- c("igraph_intersection","pandas_table_intersection")
Vertex_counts <- c(vcount(gi),vcount(gi_r))
Edge_counts <- c(ecount(gi),ecount(gi_r))

# Create Summary Table
info_data = data.frame(Methods, Vertex_counts, Edge_counts)
colnames(info_data) <- c("Method","Vertices","Edges")

# Check info_data
info_data

但是,當我查看info_data時,結果是相同的。

我知道節點數量可能會由於交集過程而減少,但是為什么在我再次將其轉換為表格格式並在python上保存文件后再使用igraph再次加載后發生這種情況呢? 還是我做錯了什么?

如果有人可以解釋python或RI發生了什么,請感激。 我真的需要了解為什么會這樣,如果我可以相信這些交叉點以繼續工作。

原因是圖形是無向的。 intersectionigraphnetworkx對待的I - J領帶和為J - I領帶等同。 panda.intersection只會把精確匹配(即,在數據幀中的第1列匹配數據幀B 幀數據的列2列1匹配數據幀B第3欄)。

library(igraph); library(dplyr)
set.seed(1034)
g1 <- sample_gnp(20, 0.25, directed = F)
set.seed(1646)
g2 <- sample_gnp(20, 0.25, directed = F)
V(g1)$name <- sample(LETTERS, 20)
V(g2)$name <- sample(LETTERS, 20)

g1_el <- as.data.frame(as_edgelist(g1), stringsAsFactors = F)
g2_el <- as.data.frame(as_edgelist(g2), stringsAsFactors = F)
g1g2_inter <- as.data.frame(as_edgelist(intersection(g1,g2)))
ij <- inner_join(g1_el, g2_el)

此時,兩個數據幀顯示了不同數量的節點:

> g1g2_inter
   V1 V2
1   X  E
2   J  Y
3   N  J
4   O  F
5   H  Y
6   T  J
7   K  N
8   K  T
9   P  F
10  Q  N

> ij
  V1 V2
1  T  J
2  N  J
3  J  Y
4  X  E

再次使用inner_join ,通過反轉一個數據幀中的列順序,我們可以使數據幀相等。 這樣就得到了以前錯過的J-I關系。 然后full_join到兩個部分相交的兩個:

g1g2_fj <- g1_el %>% 
      rename(V1 = V2, V2 = V1) #reverse the column order %>% 
      inner_join(., g2_el) %>% rename(V1 = V2, V2 = V1) %>% 
      full_join(., ij) %>%  #join with other 'partial' intersection 
      arrange(V1, V2)

現在, igraph相交與完全連接的部分相交匹配:

> g1g2_inter[order(g1g2_inter[,1]),] == g1g2_fj
     V1   V2
5  TRUE TRUE
2  TRUE TRUE
7  TRUE TRUE
8  TRUE TRUE
3  TRUE TRUE
4  TRUE TRUE
9  TRUE TRUE
10 TRUE TRUE
6  TRUE TRUE
1  TRUE TRUE

本質上,是的,您可以信任networkxigraph的相交方法。 他們在處理無方向聯系方面做得有些不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM