基于从此链接提取的数据集:大脑和宇宙网络样本,我正在尝试进行一些复杂网络分析。
论文神经网络与宇宙网之间的定量比较,声称使用了该数据集及其相邻矩阵
“
Mij
,即行/列等于检测到的节点数的矩阵,如果节点之间的距离为 Mij
,则值为 ≤ llink
= 1,否则为 Mij = 0
”。
然后我探究了矩阵,如下所示:
from astropy.io import fits
with fits.open('mind_dataset/matrix_CEREBELLUM_large.fits') as data:
matrix_cerebellum = pd.DataFrame(data[0].data)
它不打印稀疏矩阵,而是打印与节点的距离以像素表示的矩阵。
我了解到1像素和尺度的对应关系是:
neuronal_web_pixel = 0.32 # micrometers
并提出了一种将像素转换为微米的方法:
def pixels_to_scale(df, mind=False, cosmos=False):
one_pixel_equals_parsec = cosmic_web_pixel
one_pixel_equals_micron = neuronal_web_pixel
if mind:
df = df/one_pixel_equals_micron
if cosmos:
df = df/one_pixel_equals_parsec
return df
然后,另一种对转换后的矩阵进行二值化的方法:
def binarize_matrix(df, mind=False, cosmos=False):
if mind:
brain_Llink = 16.0 # microns
# distances less than 16 microns
brain_mask = (df<=brain_Llink)
# convert to 1
df = df.where(brain_mask, 1.0)
if cosmos:
cosmos_Llink = 1.2 # 1.2 mpc
brain_mask = (df<=cosmos_Llink)
df = df.where(brain_mask, 1.0)
return df
最后,还有:
matrix_cerebellum = pixels_to_scale(matrix_cerebellum, mind=True)
matrix_cerebellum = binarize_matrix(matrix_cerebellum, mind=True)
matrix_cerebellum.head(5)
打印我的(大部分)0.0s 和 1.0s 的稀疏矩阵:
0 1 2 3 4 5 6 7 8 9 ... 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857
0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 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.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0 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 0.0 0.0
3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
4 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 0.0 0.0 0.0 0.0 0.0 0.0
5 rows × 1858 columns
现在我想计算一下:
度中心性,由以下公式给出:
Cd(j) = Kj / n-1
其中
kj
是每个 j-node
之间的(无向)连接数,n
是整个网络中的节点总数。
聚类系数,量化节点局部附近基础设施的存在情况,由以下公式给出:
C(j) = 2yi / Kj(Kj -1)
其中
yj
是j-node
的相邻节点之间的链接数。
为了寻找度中心性,我尝试过:
# find connections by adding matrix row values
matrix_cerebellum['K'] = matrix_cerebellum.sum(axis=1)
# applying formula
matrix_cerebellum['centrality'] = matrix_cerebellum['K']/matrix_cerebellum.shape[0]-1
生成:
... K centrality
9.0 -0.995156
6.0 -0.996771
7.0 -0.996771
11.0 -0.996233
11.0 -0.994080
根据论文,我应该发现:
“对于小脑切片,我们测量了
每个节点的平均连接数。
我还发现负中心性。
有人知道如何根据上面的数据框应用这些公式吗?
包含数据源的网页指出,大脑样本的相邻矩阵文件给出了连接节点之间的距离,以用于重建网络的图像的像素表示。然后论文解释说,为了获得真正的邻接矩阵 Mij(仅包含 0 和 1 值),作者将其视为距离最多 16 微米的连接节点。我没有看到图像中有多少像素对应于一微米的信息。这需要计算作者在计算中使用的相同矩阵 Mij。
此外,值〈k〉不是度中心性或聚类系数(取决于节点),而是网络中每个节点的平均连接数,使用矩阵 Mij 计算。然后,本文将大脑和宇宙网络中观察到的度中心性和聚类系数的分布与在具有相同节点数和相同
编辑:
1. 每像素 0.32 微米的转换似乎是正确的。在包含大脑样本(皮层和小脑)数据的文件中,最大值为 50 像素,经过此转换相当于 16 微米。这表明该论文的作者已经对矩阵进行了阈值处理,仅列出了不超过 16 微米的距离。鉴于此,要获得仅包含 0 和 1 值的矩阵 Mij,只需将所有非零值替换为 1。问题是,使用以这种方式获得的矩阵,可以得到小脑的
2. 负中心性值是由于代码中的错误(缺少括号)造成的。应该是:
matrix_cerebellum['centrality'] = matrix_cerebellum['K']/(matrix_cerebellum.shape[0] - 1)
3. 可以使用
networkx
库提供的工具计算每个节点的聚类系数和度中心性:
from astropy.io import fits
import networkx as nx
# get the adjacency matrix for cortex
with fits.open('matrix_CORTEX_large.fits') as data:
M = data[0].data
M[M > 0] = 1
# create a graph object
G_cortex = nx.from_numpy_matrix(M)
# compute degree centrality of all nodes
centrality = nx.degree_centrality(G_cortex)
# compute clustering coefficient of all nodes
clustering = nx.clustering(G_cortex)