在R中随机生成网络模型

照片来自Anastasia Dulgier的Unsplash

我在这篇博客中已经多次讨论过网络。特别是,我有这种方法来解释一个城市的空间隔离或解决猜猜谁?问题。但是,其中一个问题是如何生成一个好的网络。实际上,我的目标是研究分裂网络的策略,但我首先需要使用真实的神经网络。我本可以下载网络数据,但我宁愿研究提出的不同模型来生成神经网络。

我将解释并生成三种最著名的神经网络模型:
– Erdős-Rényi模型;
– Watts和Strotgatz模型(小世界模型);
– Barabási-Albert优惠附件模型。

我们用熟人矩阵表示每个模型。当且仅当节点i和节点j彼此知道时,列i和行j的交点是1。由于我们模拟倒数神经网络(即如果我知道j然后j知道i),我们可以处理三角矩阵而不用担心矩阵的下三角形。在这里,我使用R函数image()来表示这些矩阵。红色为0,白色为1。

Erdős-Rényi模型。

这个模型当然是三个模型中最简单的。计算此模型只需要两个参数。 N是我们考虑的节点数,p是每个节点通过边连接的概率。

该模型假设两个节点之间存在链接独立于图的另一个链接。根据Daniel A Spielman的说法,这个模型还没有被创建来代表任何真实的图形。但是,这个模型有一些非常有趣的属性。平均路径的长度log(N)相对较短。

此外,如果p <1,对于N足够大,聚类系数会收敛到0(几乎可以肯定)。一个点的聚类系数用简单的词表示该点的邻居之间所有现有边缘与这些邻居的所有可能边缘之间的比率。

在该图中,A的聚类系数是1/3,在A(X-Y,Y-Z,Z-X)的邻域之间存在3个可能的边缘,并且仅连接一个(Z-Y)。

Watts和Strotgatz模型(小世界模型)。

这个模型非常有趣,它假设你知道一定数量的人(k)并且你更有可能知道你最近的邻居。该算法虽然比Erdős-Rényi模型更复杂但很简单。我们有3个参数。人口数(N),近邻数(k)和概率p。对于任何变量,对于每个近邻,与其相关联的概率是(1-p)。对于没有链接的每个近邻,我们在其他邻居中随机选择其他链接。

因为这个模型产生了一些人们彼此了解的集合体,所以很容易与地图中的任何人间接地(并且只需很少的步骤)联系起来。这就是为什么我们称这种模型为小世界模型。这就是我们在这里描述的三个最接近现实的友谊社交网络。

Barabási-Albert优先依恋。

该模型使用递归算法进行计算。需要两个参数,初始节点数(n0)和节点总数(N)。开始时,每个初始节点(n0个第一个节点)都知道其他节点,然后,我们逐个创建另一个节点。在创建新节点时,此节点随机链接到现有节点。新节点链接到某个节点的概率与该节点已有的边数成正比。换句话说,您拥有的链接越多,新节点链接到您的可能性就越大。

这个模型非常有趣,它是任何神经网络的模型,尊重“富裕变得更富有”的想法。一个节点拥有的朋友越多,新节点与他成为朋友的可能性就越大。这种模式与互联网有关。事实上,网站越有名,其他网站就越有可能知道这个网站。例如,谷歌很可能与许多网站建立联系,而我的小博客和未知博客不太可能连接到许多网站。

代码(R):

#ER模型

generateER = function(n = 100,p = 0.5){
map = diag(rep(1,n))
link = rbinom(n *(n-1)/ 2,1,p)
t = 1
for(j in 2:n){
for(i in 1:(j-1)){
map(i,j)= link(t)
t = t + 1
}
}
回报(图)
}

#WS模型

f = function(j,mat){
return(c(mat(1:j,j),mat(j,(j + 1):length(mat(1,)))))
} g = function(j,mat){
k =长度(mat(1,))
a =矩阵(0,nrow = 2,ncol = k)
如果(j> 1){
for(i in 1:(j-1)){
a(1,i)= i
a(2,i)= j
}
}
如果(j for(i in(j + 1):k){
a(1,i)= j
a(2,i)= i
}
}
a = a(, – j)
返回(一)
}
g(1,地图)
callDiag = function(j,mat){
返回(c(diag(mat(g(j,mat)(1,1 :(长度(mat(1,)) – 1)),g(j,mat)(2,1:(长度(垫子)(1) ,)) – 1))))))
其中(callDiag(4,matrix(runif(20 * 20),20,20))<0.1)generateWS = function(n = 100,k = 4,p = 0.5){
map = matrix(0,n,n)
down = floor(k / 2)
up = ceiling(k / 2)
for(j in 1:n){
map((((j-down):( j + up))%% n)( – (down + 1)),j)= 1
}
map = map | t(map)* 1

for(j in 2:n){
list1 = which(map((((j-down):( j))%% n),j)== 1)
listBusy = which(map((((j-down):( j))%% n),j)== 1)
for(i in 1:(j-1)){
如果((j-i的<=floor(k/2))|(j-i>= n-1-up)){
如果(rbinom(1,1,P)){
map(i,j)= 0
samp = sample(其中(callDiag(j,map)== 0),1)
map(g(j,map)(1,samp),g(j,map)(2,samp))= 1
}
}
}
}

返回(地图* 1)
}

#BA模型

generateBA = function(n = 100,n0 = 2){
mat = matrix(0,nrow = n,ncol = n)
for(i in 1:n0){
for(j in 1:n0){
if(i= j){
mat(i,j)= 1
mat(j,i)= 1
}
}
}
for(i in n0:n){
list = c()
for(k in 1:(i-1)){
list = c(list,sum(mat(,k)))
}
link = sample(c(1:(i-1)),size = 1,prob = list)
mat(link,i)= 1
mat(i,link)= 1
}
返程(垫)
}
#图

图像(generateER(500))
图像(generateWS(500))
图像(generateBA(500))

资讯来源:由0x资讯编译自HACKERNOON。版权归作者所有,原文链接:https://hackernoon.com/random-generation-of-network-models-in-r-18285ad51d81?source=collection_category—4——0———————。未经许可,不得转载
提示:投资有风险,入市需谨慎,本资讯不作为投资理财建议。请理性投资,切实提高风险防范意识;如有发现的违法犯罪线索,可积极向有关部门举报反映。
你可能还喜欢