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

Degree Centrality and Clustering Coefficient in Adjacent matrix

基于从 link 中提取的数据集:Brain and Cosmic Web samples,我正在尝试进行一些复杂网络分析。


论文The Quantitative Comparison Between the Neuronal Network and the Cosmic Web,声称使用了这个数据集,以及它的相邻矩阵

"Mij,即 rows/columns 等于检测到的节点数的矩阵,如果节点被分隔,则值为 Mij = 1距离 ≤ llink ,或 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

现在我要计算:

  1. 网络的中心度,由公式给出:

    Cd(j) = Kj / n-1

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

  1. Clustering Coefficient,它量化了节点本地附近基础设施的存在,由公式给出:

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

其中yjj-node.

的相邻节点之间的link个数

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

# 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

根据论文,我应该发现:

"对于我们测量的小脑切片 ∼ 1.9 − 3.7",

每个节点的平均连接数。

我还发现负中心性。


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

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

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

编辑:

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

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)