邻接矩阵中的度中心性和聚类系数

dat*_*den 2 python cluster-analysis adjacency-matrix pandas node-centrality

基于从此链接提取的数据集:大脑和宇宙网络样本,我正在尝试进行一些复杂网络分析。

\n
\n

论文《神经元网络与宇宙网的定量比较》声称使用了该数据集及其相邻矩阵

\n

" Mij,即行/列等于检测到的节点数的矩阵,Mij如果节点之间的距离为\xe2\x89\xa4 llink,则值为 1,Mij = 0否则"。

\n

然后我探究了矩阵,如下所示:

\n
from astropy.io import fits\n\nwith fits.open(\'mind_dataset/matrix_CEREBELLUM_large.fits\') as data:\n    matrix_cerebellum = pd.DataFrame(data[0].data)\n
Run Code Online (Sandbox Code Playgroud)\n

它不打印稀疏矩阵,而是打印与节点的距离以像素表示的矩阵。

\n
\n

我了解到1像素和比例之间的对应关系是:

\n
neuronal_web_pixel = 0.32 # micrometers\n
Run Code Online (Sandbox Code Playgroud)\n

并提出了一种将像素转换为微米的方法:

\n
def pixels_to_scale(df, mind=False, cosmos=False):\n    \n    one_pixel_equals_parsec = cosmic_web_pixel\n    one_pixel_equals_micron = neuronal_web_pixel\n    \n    if mind:\n        df = df/one_pixel_equals_micron\n        \n    if cosmos:\n        df = df/one_pixel_equals_parsec\n        \n    return df\n
Run Code Online (Sandbox Code Playgroud)\n

然后,另一种方法对转换后的矩阵进行二值化:

\n
def binarize_matrix(df, mind=False, cosmos=False):\n    \n    if mind:\n        brain_Llink = 16.0 # microns\n        # distances less than 16 microns\n        brain_mask = (df<=brain_Llink)\n        # convert to 1\n        df = df.where(brain_mask, 1.0)\n        \n    if cosmos:\n        cosmos_Llink = 1.2 # 1.2 mpc\n        brain_mask = (df<=cosmos_Llink)\n        df = df.where(brain_mask, 1.0)\n        \n    return df\n
Run Code Online (Sandbox Code Playgroud)\n

最后,与:

\n
matrix_cerebellum = pixels_to_scale(matrix_cerebellum, mind=True)\nmatrix_cerebellum = binarize_matrix(matrix_cerebellum, mind=True)\n
Run Code Online (Sandbox Code Playgroud)\n

matrix_cerebellum.head(5)打印我的(大部分)0.0s 和 1.0s 的稀疏矩阵:

\n
0   1   2   3   4   5   6   7   8   9   ... 1848    1849    1850    1851    1852    1853    1854    1855    1856    1857\n0   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\n1   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\n2   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\n3   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\n4   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\n5 rows \xc3\x97 1858 columns\n
Run Code Online (Sandbox Code Playgroud)\n
\n

现在我想计算一下:

\n
    \n
  1. 网络的度中心性,由以下公式给出:

    \n

    Cd(j) = Kj / n-1

    \n
  2. \n
\n

其中kj是往返每个节点的(无向)连接数j-noden是整个网络中的节点总数。

\n
    \n
  1. 聚类系数,量化节点局部附近基础设施的存在情况,由以下公式给出:

    \n

    C(j) = 2yi / Kj(Kj -1)

    \n
  2. \n
\n

其中yj是 的相邻节点之间的链接数j-node

\n
\n

为了找到度中心性,我尝试过:

\n
# find connections by adding matrix row values\nmatrix_cerebellum[\'K\'] = matrix_cerebellum.sum(axis=1)\n# applying formula\nmatrix_cerebellum[\'centrality\'] = matrix_cerebellum[\'K\']/matrix_cerebellum.shape[0]-1\n
Run Code Online (Sandbox Code Playgroud)\n

生成:

\n
... K    centrality\n    9.0   -0.995156\n    6.0   -0.996771\n    7.0   -0.996771\n    11.0  -0.996233\n    11.0  -0.994080\n
Run Code Online (Sandbox Code Playgroud)\n

根据该论文,我应该发现:

\n

“对于小脑切片,我们测量了 \xe3\x80\x88k\xe3\x80\x89 \xe2\x88\xbc 1.9 \xe2\x88\x92 3.7”

\n

每个节点的平均连接数。

\n

我还发现负中心性。

\n
\n

有谁知道如何根据上面的数据框应用这些公式?

\n

bb1*_*bb1 6

包含数据源的网页指出,大脑样本的相邻矩阵文件给出了连接节点之间的距离,以用于重建网络的图像的像素表示。然后论文解释说,为了获得真正的邻接矩阵 Mij(仅包含 0 和 1 值),作者将其视为距离最多 16 微米的连接节点。我没有看到图像中有多少像素对应于一微米的信息。这将需要计算作者在计算中使用的相同矩阵 Mij。

\n

此外,值\xe3\x80\x88k\xe3\x80\x89不是度中心性或聚类系数(取决于节点),而是网络中每个节点的平均连接数,使用矩阵Mij计算。然后,本文将大脑和宇宙网络中观察到的度中心性和聚类系数的分布与在具有相同节点数和相同 \xe3\x80\x88k\xe3\x80 值的随机网络中看到的分布进行比较\x89。结论是大脑和宇宙网络是高度非随机的。

\n

编辑:

\n

1.每像素0.32微米的换算似乎是正确的。在包含大脑样本(皮层和小脑)数据的文件中,最大值为 50 像素,经过此转换相当于 16 微米。这表明该论文的作者已经对矩阵进行了阈值处理,仅列出了不超过 16 微米的距离。鉴于此,要获得只有 0 和 1 值的矩阵 Mij,只需将所有非零值替换为 1 即可。问题是,使用这样获得的矩阵可以得到 \xe3\x80\x88k\对于小脑,xe3\x80\x89 = 9.22;对于皮质,\xe3\x80\x88k\xe3\x80\x89 = 7.13,这有点超出了论文中给出的范围。我不知道如何解释这种差异。

\n

2.负中心性值是由于代码中的错误(缺少括号)造成的。它应该是:

\n
matrix_cerebellum['centrality'] = matrix_cerebellum['K']/(matrix_cerebellum.shape[0] - 1)\n
Run Code Online (Sandbox Code Playgroud)\n

3.使用库提供的工具可以计算每个节点的聚类系数和度中心性networkx

\n
from astropy.io import fits\nimport networkx as nx\n\n# get the adjacency matrix for cortex\nwith fits.open('matrix_CORTEX_large.fits') as data:\n    M = data[0].data\nM[M > 0] = 1\n\n# create a graph object\nG_cortex = nx.from_numpy_matrix(M)\n\n# compute degree centrality of all nodes\ncentrality = nx.degree_centrality(G_cortex)\n# compute clustering coefficient of all nodes\nclustering = nx.clustering(G_cortex)\n
Run Code Online (Sandbox Code Playgroud)\n