fastnc

  根据文献报道,从网络图中提取邻阶矩阵(0、1矩阵,0代表指标间没有边,1代表指标间有边),然后依次删除节点并求剩余矩阵的“特征值”。通过将计算结果与删除节点比例做线性回归并提取slope值,比较不同网络图之间的slope数值大小(简单说,就是看回归线下降的趋势)以反映网络的抗毁性。在实践中,一个网络图有N个节点,那么当删除M个节点时,M个节点有多个情况的节点组合,目前一些文献是通过degree、BC拓扑特征对节点排序,然后依次删除。在这里,我们用另外的做法,即随机抽取M个节点并删除、同时删掉剩余矩阵中孤立的节点,正如前面所言,M个节点有多种情况组合,因此我们提供了一个参数n,用来多次迭代删除,如我们在删除123个节点,那么我们从总节点中随机删除123个节点、删除剩余矩阵孤立节点并求“特征值”,这一步骤重复n次(如1000),最后我们将n次的结算结果取均值,这样得到的结果更具代表性。
  在实际数据分析过程中,用随机删除M个节点并迭代n次的做法具有很大的计算量。一开始我们分别用R并行计算、Python的numpy模块计算(同时也用了并行),在给出指定的线程里计算,结果服务器显示任务超线程了(如给出28线程,结果服务器显示已经调用了500多线程或800多)。然而在不并行的情况下,用R计算300个节点的网络图的抗毁性需要几小时左右(当然取决于计算机的性能,这里不是说R和Python不好)。最后,我们转向了C++软件,调用了Eigen库、
通过OpenMP并行和通过intel公司的mkl库来加速,300个节点网络的计算在28线程、ram为64G的服务器单节点上,只需要3分钟左右即可算完(迭代1000次)。
  特别说明,在将C++代码封装为命令行结构时,我们参考了fastspar软件(用C++实现sparcc算法的快速软件)。我们将软件命名为fastnc,通过conda安装软件:

conda create -n fastnc -c wqssf102 -c conda-forge -c intel fastnc -y

软件的参数如下:

fastnc --h
Program: FastNC (use c++ to calculate the natural connectivity)
Contact: Qiusheng WU (565715597@qq.com)Usage:fastnc [options] --adj_table <file> --outfile <file>-c <file>, --adj_table <file>The result from get.adjacency function of igraph package-o <file>, -outfile <file>Result output table
Options:-t <float>, -threshold <float>The threshold for deletion of node (default: 0.8)-s <int>, -step <int>The step for deletion of node (default: 1)-g <float>, -edge <float>The threshold for deletion of edge (default: 0)-n <int>, -number <int>Number of iterations (default: 1000)-j <int>, -job <int>Number of jobs (default: 4)
Other:-h        --helpDisplay this help and exit

  参数进一步说明:

-c 为邻接矩阵,必须给出-o 为输出文件,必须给出-t 为删除物种(节点的阈值),默认为0.8,即从1%删到80%-s 为步数,默认为1,假如step为3,那么就是依次删除1个节点,4个节点,7个节点,......,即第N次是删除(N+step)个节点(N>1)
因此,当step大于1时,计算时间将大大缩短,适用于网络图节点多的情况-g 删除边的比例,即使,先删掉节点,在剩余矩阵中随机删除边-n 为迭代次数,默认1000,因为我们不知道环境变化会使哪些物种消失,因此这里采用了随机抽样,建议至少迭代1000次。-j 线程数,默认为4。

  邻接矩阵如何获得,方法之一是通过R软件的igraph包导出,如:

library(igraph)
##gg为igraph对象的网络图数据
adjtab <- as.matrix(get.adjacency(gg))
####导出01矩阵,然后使用服务器计算
write.table(adjtab,"mydir/adj_tab.txt",quote=F,row.names=F,col.names=F,sep="\t")

跑分析:

conda activate fastnc
fastnc -c adj_tab.txt -j 28 -n 1000 -o ncres.txt
conda deactivate

  最终结果如下:

nc_index del_number
0.579490466952  0.002941176471
0.575350980163  0.005882352941
0.571343702435  0.008823529412
0.568237121284  0.011764705882
0.565799163938  0.014705882353
0.563750376701  0.017647058824
0.562035103083  0.020588235294
0.560567979574  0.023529411765
0.559203409255  0.026470588235
0.557888396978  0.029411764706
0.556521071494  0.032352941176
0.555493312657  0.035294117647
0.554323430896  0.038235294118

nc_index为删除M个节点后剩余矩阵的“特征值”,del_number为删除节点所占总节点的百分比。

  最后用R绘图:

library(ggpmisc)
grp1 <- read.csv("ck.txt",header = T,sep="\t")
grp1$grp <- "CK"
grp2 <- read.csv("NP.txt",header = T,sep="\t")
grp2$grp <- "NP"####将每组合并
grpnc <- rbind(grp1,grp2)
##指定图例的顺序
grpnc$grp <- factor(grpnc$grp,levels = c("CK","NP"))
ggplot(grpnc, aes(del_number, nc_index,color=grp)) +##grp为将多个网络图合并时的分组# geom_point() +geom_smooth(formula = y~x,se = FALSE,method = "lm",show.legend = F)+stat_poly_eq(formula = y~x,size=5,family="serif",method = "lm",output.type = "numeric",parse = T,label.x = 0.3,hjust=0,mapping =aes(label = paste(paste(sprintf("italic(R)^2~`=`~%.2g",after_stat(`r.squared`)),"~",ifelse(after_stat(`p.value`)<=0.001,"'***'",ifelse(after_stat(`p.value`)<=0.01,"'**'",ifelse(after_stat(`p.value`)<=0.05,"'*'",NA)))),sprintf( "italic(Slope)~`=`~%.3g",after_stat(b_1)),sep = "*\", \"*")))+labs(x="Proportion of removed nodes",y="Natural connectivity",color="Group")+scale_color_manual(values = c("CK"="#7570B3","NP"="#1B9E77"))+theme_bw()+theme(panel.grid = element_blank())+theme(axis.title = element_text(size = 20,colour = "black"))+theme(axis.text = element_text(colour = "black",size = 20,angle = 0,vjust = 0.5))+theme(legend.title =  element_text(size = 20,colour = "black"), legend.text = element_text(size = 20,colour = "black"),strip.text =  element_text(size = 20,colour = "black"),text = element_text(family = "serif"))

关于计算速度和时间

   1、我们建议将网络图的节点控制在500个以下,网络节点太多导致计算量太大,服务器算不过来。
   2、若用户的网络包含的节点比较多(如几千个节点),假如用户想要迭代1000次,当服务器的运行内存不大时,我们建议分为4个任务提交到服务器中,每个任务执行250次的迭代,最后取4个任务计算结果的均值即可,这样会大大缩减用户等待的时间。特别地,可以通过设置step参数(如step设置为3)来扩大删除节点的步长,这样耗时将显著减少。总之,step是一个很有用的参数。 我们的软件还在开发中,若你对软件的功能有需求或发现软件问题,请联系作者:565715597@qq.com
  fastnc软件目前只在Linux系统下测试,其他系统没测试过(Win系统肯定是不行)。github上仓库中的src目录为软件的源码,源码需要编译才能使用,用户若想自己编译,那么需要配置依赖的库和软件,编译方式
为:

MKLROOT=/opt/intel/oneapi/mkl/2022.1.0
##
g++ -std=c++11 -O3 -fopenmp -march=native -mavx -mfma -o fastnc fastnc.cpp fastnc_opts.cpp common.cpp -DMKL_ILP64 -m64\${MKLROOT}/lib/intel64/libmkl_scalapack_ilp64.a \-Wl,--start-group ${MKLROOT}/lib/intel64/libmkl_cdft_core.a \${MKLROOT}/lib/intel64/libmkl_intel_ilp64.a \${MKLROOT}/lib/intel64/libmkl_gnu_thread.a \${MKLROOT}/lib/intel64/libmkl_core.a\${MKLROOT}/lib/intel64/libmkl_blacs_openmpi_ilp64.a \-Wl,--end-group -lgomp -lpthread -lm -ldl

参考文献:

[1] Wu MH, Chen SY, Chen JW, Xue K, Chen SL, Wang XM, Chen T, Kang SC, Rui JP, Thies JE, Bardgett RD, Wang YF. Reduced microbial stability in the active layer is associated with carbon loss under alpine permafrost degradation. Proc Natl Acad Sci U S A. 2021 Jun 22;118(25):e2025321118. doi: 10.1073/pnas.2025321118.

[2] G.-s. Peng, J. Wu, Optimal network topology for structural robustness based on natural connectivity. Physica A 443, 212–220 (2016). doi: 10.1016/j.physa.2015.09.023

使用C++快速计算网络抗毁性相关推荐

  1. 软件 | 快速计算网络自然连通度评估群落稳定性

    Fastn-快速计算网络自然连接度 - 软件介绍 - 从网络图的邻阶矩阵(0.1矩阵,0代表指标间没有边,1代表指标间有边)中删除节点并求剩余矩阵"特征值"被用来表征网络抗毁性,该 ...

  2. c语言算网络节点介数,基于多目标优化的城市轨道交通网络抗毁性研究——以上海轨道交通为例...

    摘要: 随着我国城镇化的进一步发展,城市人口的集聚造成了越来越多一,二线城市面临着交通拥堵等"城市病"的威胁,以轨道交通为代表的公共交通因此成为解决该问题的重要出路.在目前因城市轨 ...

  3. 复杂网络的学习——抗毁性

    阅读了三篇文献,都是对复杂网络的性能进行分析,一般都会采用随机网络与无标度网络进行对比,无标度网络对随机攻击抵抗力较强,而对有目的的攻击抵抗力较弱,随即网络恰好相反. 1.文献<复杂网络抗毁性研 ...

  4. 基于异质网络的武器装备体系结构抗毁性研究 赵丹玲 主功能程序

    clear; %异质网络的生成 % n_S = 5; % n_D = 1; % n_I = 3; % n_T = 1;n_S = 20; n_D = 10; n_I = 15; n_T = 15; N ...

  5. 网络基础知识 快速计算子网掩码的2种方法

    网络基础知识 快速计算子网掩码的2种方法<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office ...

  6. 网络故障排除工具 | 快速定位网络故障

    网络故障排除对于网络技术专家和网络工程师是颇具挑战的工作.每当添加新的设备或网络发生变更时,新的问题就会出现,而且很难确定问题出在哪里.每一位网络工程师或专家都有自己的经验和必备工具,能让他们快速定位 ...

  7. SQL优化(二) 快速计算Distinct Count

    2019独角兽企业重金招聘Python工程师标准>>> 原创文章,首发自个人站点 ,转载请务必注明出处 http://www.jasongj.com/2015/03/15/count ...

  8. 网络编程懒人入门(二):快速理解网络通信协议(下篇)

    1.前言 本文上篇<网络编程懒人入门(一):快速理解网络通信协议(上篇)>分析了互联网的总体构思,从下至上,每一层协议的设计思想.基于知识连贯性的考虑,建议您先看完上篇后再来阅读本文. 本 ...

  9. 快速计算文件的MD5/SHA1/SHA256等校验值(Windows/Linux)

    从网络上下载文件,尤其是非常大的文件怎么确保文件准确无误呢? 通常网站提供文件时会同时提供该文件的校验值,如MD5,SHA1,SHA256等, 当文件下载完成后,计算它的校验值,如果和网站提供的一致, ...

最新文章

  1. mini-batch 和batch到底是什么
  2. 卫星还在“织网” 北斗时代尚需时日
  3. 远洋整站下载器不能用https_这可能是最全最好的爆破百度文库下载指南了!
  4. 开发的AI程序员“抄”代码,被骂惨的GitHub到底冤不冤?
  5. 更新pcb封装导入_一导入PCB就出问题?赶紧看看这篇文章
  6. ARouter源码探究
  7. mysql myisam存储引擎不能添加外键,添加后显示成功,实则失败
  8. mesh threejs 属性_threeJS创建mesh,创建平面,设置mesh的平移,旋转、缩放、自传、透明度、拉伸...
  9. apache camel_使用WildFly 8在Java EE7中自举Apache Camel
  10. ubuntu man手册完善
  11. 快速入门MyBatis-Plus,看这一篇就够了。
  12. Oracle技巧集锦
  13. 我为什么鼓励大家写作?
  14. mysql是用啥语言写的_mysql源码是什么语言
  15. 外螺纹对照表_螺纹螺距对照表
  16. 2017年c语言试题,2017年计算机二级C语言试题
  17. 什么是实体关系图(ERD)?
  18. Linux - 麒麟17.04 删除桌面图标(计算机,主文件夹,回收站)与 Cairo-Dock 安装配置
  19. 大型企业中复杂数据库存储过程的修改方法:7步法教你高效完成任务
  20. 详细指南!手把手教你上手Tableau软件!

热门文章

  1. CSS哪些属性会被继承
  2. 小黄车遇到了寒冬,但共享经济没有遇到寒冬
  3. 怎么旋转PDF文件的方向并保存成功
  4. js学习五之常用函数
  5. 基于vue + axios + lrz.js 微信端图片压缩上传
  6. 图解SQL连接:内连接、左外连接、右外连接、全外连接
  7. ADC值转换成实际电压值
  8. App一键登录(java后端)
  9. 肾囊肿会带来哪些明显的危害?
  10. WPS中用Aurora写伪代码