Networkx - 从两个相邻矩阵创建多层网络
Networkx - create a multilayer network from two adjacent matrices
我有两个相邻的矩阵,代表两个大脑结构(小脑和皮质):
数据集:
import networkx as nx
from astropy.io import fits
# Cerebellum
with fits.open('matrix_CEREBELLUM_large.fits') as data:
matrix_cerebellum = pd.DataFrame(data[0].data.byteswap().newbyteorder())
# 1858 rows × 1858 columns
# Cortex
with fits.open('matrix_CORTEX_large.fits') as data:
matrix_cortex = pd.DataFrame(data[0].data.byteswap().newbyteorder())
#1464 rows × 1464 columns
注意:数据集可以在这里下载:brain datasets
邻接矩阵
这里的相邻矩阵没有加权,并且具有通常的二进制表示,连接节点的值为 1,否则为 0,如下所示:
0 1 0 1 0 0 0 0 0 0 0 ...
0 0 0 1 0 0 0 0 0 0 0 ...
0 0 0 0 0 0 0 0 0 0 1 ...
我正在使用库 Networkx
在网络中查找 社区检测 。我可以尝试为每个网络单独执行此操作。
模拟
假设我需要模拟真实世界的网络,其中一小部分皮质节点(比如 0.01%)将边缘投射到小脑。
我想知道如何根据我的社区检测目标实施此模拟。
方法
我最初考虑创建一个二分网络,但决定改为使用多层网络(实际上是 2 层)方法。
在这种方法中,皮层是第 1 层网络,小脑是第 2 层网络,每个都有 内部-连接已经在每个相邻矩阵中表示。
现在我将皮质投影添加为两层之间的 inter 连接。
问题
如何创建这些投影并表示新矩阵,知道我需要:
- 从我的相邻矩阵开始
- 保留他们的内部连接映射
- 为中间层添加一个新映射
这里有一种方法可以做你想做的事:
- 首先将邻接矩阵加载到 pandas 之后,您可以使用
nx.convert_matrix.from_pandas_adjacency
将它们转换为两个不同的图形
- 然后您可以使用
nx.disjoint_union
将两个图合并为一个图。两个图的节点基本上连接到一个图上(查看更多here)。
- 获得全图后,您可以以 0.01 的概率从全图的皮层部分随机抽取节点。
- 同样,您可以在图中的小脑部分绘制相同数量的节点作为连接的接收者。
- 最后,您可以在两侧的所选节点之间创建边。
- 您可以使用
adj_matrix_full=nx.linalg.graphmatrix.adjacency_matrix(full_g,weight=None)
从最终图中获取邻接矩阵
有关详细信息,请参阅下面的完整代码:
import networkx as nx
from astropy.io import fits
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
fig=plt.figure(figsize=(20,20))
# Cerebellum
with fits.open('matrix_CEREBELLUM_large.fits') as data:
matrix_cerebellum = pd.DataFrame(data[0].data.byteswap().newbyteorder())
# 1858 rows × 1858 columns
# Cortex
with fits.open('matrix_CORTEX_large.fits') as data:
matrix_cortex = pd.DataFrame(data[0].data.byteswap().newbyteorder())
#1464 rows × 1464 columns
cerebellum_g=nx.convert_matrix.from_pandas_adjacency(matrix_cerebellum) #convert cerebellum adj matrix to nx graph
N_nodes_cer=cerebellum_g.number_of_nodes()
cortex_g=nx.convert_matrix.from_pandas_adjacency(matrix_cortex) #convert matrix adj matrix to nx graph
N_nodes_cort=cortex_g.number_of_nodes()
full_g=nx.algorithms.operators.binary.disjoint_union(cortex_g,cerebellum_g) #concatenate the two graphs
#choose randomly 0.01 cortex nodes to project to cerebellum
p=0.01
N_projs=int(cortex_g.number_of_nodes()*p)
cortex_proj_nodes=np.random.choice(cortex_g.number_of_nodes(), size=N_projs,replace=False)
cerebellum_recipient=np.random.choice(cerebellum_g.number_of_nodes(), size=N_projs,replace=False)
#Add edges
for i in range(N_projs):
full_g.add_edge(list(full_g.nodes)[cortex_proj_nodes[i]],list(full_g.nodes)[N_nodes_cort+cerebellum_recipient[i]])
#Color the nodes based on brain region
color_map = []
for node in full_g:
if node < N_nodes_cort:
color_map.append('tab:blue')
else:
color_map.append('tab:orange')
adj_matrix_full=nx.linalg.graphmatrix.adjacency_matrix(full_g,weight=None) #Compute adj matrix for full graph
pos = nx.circular_layout(full_g)
#Setting up a legend
plt.plot([],[],color='tab:blue',label='Cortex')
plt.plot([],[],color='tab:orange',label='Cerebellum')
#plotting graph
nx.draw(full_g,pos=pos,node_color=color_map)
plt.legend()
并且输出给出:
我有两个相邻的矩阵,代表两个大脑结构(小脑和皮质):
数据集:
import networkx as nx
from astropy.io import fits
# Cerebellum
with fits.open('matrix_CEREBELLUM_large.fits') as data:
matrix_cerebellum = pd.DataFrame(data[0].data.byteswap().newbyteorder())
# 1858 rows × 1858 columns
# Cortex
with fits.open('matrix_CORTEX_large.fits') as data:
matrix_cortex = pd.DataFrame(data[0].data.byteswap().newbyteorder())
#1464 rows × 1464 columns
注意:数据集可以在这里下载:brain datasets
邻接矩阵
这里的相邻矩阵没有加权,并且具有通常的二进制表示,连接节点的值为 1,否则为 0,如下所示:
0 1 0 1 0 0 0 0 0 0 0 ...
0 0 0 1 0 0 0 0 0 0 0 ...
0 0 0 0 0 0 0 0 0 0 1 ...
我正在使用库 Networkx
在网络中查找 社区检测 。我可以尝试为每个网络单独执行此操作。
模拟
假设我需要模拟真实世界的网络,其中一小部分皮质节点(比如 0.01%)将边缘投射到小脑。
我想知道如何根据我的社区检测目标实施此模拟。
方法
我最初考虑创建一个二分网络,但决定改为使用多层网络(实际上是 2 层)方法。
在这种方法中,皮层是第 1 层网络,小脑是第 2 层网络,每个都有 内部-连接已经在每个相邻矩阵中表示。
现在我将皮质投影添加为两层之间的 inter 连接。
问题
如何创建这些投影并表示新矩阵,知道我需要:
- 从我的相邻矩阵开始
- 保留他们的内部连接映射
- 为中间层添加一个新映射
这里有一种方法可以做你想做的事:
- 首先将邻接矩阵加载到 pandas 之后,您可以使用
nx.convert_matrix.from_pandas_adjacency
将它们转换为两个不同的图形
- 然后您可以使用
nx.disjoint_union
将两个图合并为一个图。两个图的节点基本上连接到一个图上(查看更多here)。 - 获得全图后,您可以以 0.01 的概率从全图的皮层部分随机抽取节点。
- 同样,您可以在图中的小脑部分绘制相同数量的节点作为连接的接收者。
- 最后,您可以在两侧的所选节点之间创建边。
- 您可以使用
adj_matrix_full=nx.linalg.graphmatrix.adjacency_matrix(full_g,weight=None)
从最终图中获取邻接矩阵
有关详细信息,请参阅下面的完整代码:
import networkx as nx
from astropy.io import fits
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
fig=plt.figure(figsize=(20,20))
# Cerebellum
with fits.open('matrix_CEREBELLUM_large.fits') as data:
matrix_cerebellum = pd.DataFrame(data[0].data.byteswap().newbyteorder())
# 1858 rows × 1858 columns
# Cortex
with fits.open('matrix_CORTEX_large.fits') as data:
matrix_cortex = pd.DataFrame(data[0].data.byteswap().newbyteorder())
#1464 rows × 1464 columns
cerebellum_g=nx.convert_matrix.from_pandas_adjacency(matrix_cerebellum) #convert cerebellum adj matrix to nx graph
N_nodes_cer=cerebellum_g.number_of_nodes()
cortex_g=nx.convert_matrix.from_pandas_adjacency(matrix_cortex) #convert matrix adj matrix to nx graph
N_nodes_cort=cortex_g.number_of_nodes()
full_g=nx.algorithms.operators.binary.disjoint_union(cortex_g,cerebellum_g) #concatenate the two graphs
#choose randomly 0.01 cortex nodes to project to cerebellum
p=0.01
N_projs=int(cortex_g.number_of_nodes()*p)
cortex_proj_nodes=np.random.choice(cortex_g.number_of_nodes(), size=N_projs,replace=False)
cerebellum_recipient=np.random.choice(cerebellum_g.number_of_nodes(), size=N_projs,replace=False)
#Add edges
for i in range(N_projs):
full_g.add_edge(list(full_g.nodes)[cortex_proj_nodes[i]],list(full_g.nodes)[N_nodes_cort+cerebellum_recipient[i]])
#Color the nodes based on brain region
color_map = []
for node in full_g:
if node < N_nodes_cort:
color_map.append('tab:blue')
else:
color_map.append('tab:orange')
adj_matrix_full=nx.linalg.graphmatrix.adjacency_matrix(full_g,weight=None) #Compute adj matrix for full graph
pos = nx.circular_layout(full_g)
#Setting up a legend
plt.plot([],[],color='tab:blue',label='Cortex')
plt.plot([],[],color='tab:orange',label='Cerebellum')
#plotting graph
nx.draw(full_g,pos=pos,node_color=color_map)
plt.legend()
并且输出给出: