【复杂网络学习笔记】4:验证无标度网络的幂律分布特性

版权声明:本文为博主原创学习笔记,如需转载请注明来源。 https://blog.csdn.net/SHU15121856/article/details/72456037

无标度网络具有形似马太效应的分布特性,并且它的度分布的统计特性呈现幂律分布,直接上老师PPT:

现在要去验证这个特性。从上图可以看出,这样的幂律分布经过两边取对数后,可以在对数坐标系下近似成一个直线的形式。实际上不需要这样一张对数坐标纸,只要将统计好的<度数:该度的节点数>均取同底的对数(我取的是自然对数),也就是logf(x)和logx,再作为纵坐标和横坐标放在坐标系中就可以寻求回归直线了。

在这个工作中,因为我关心的是节点的度,为了方便,不需要去使用之前建立的无标度网络,而只要去模拟这个无标度增长过程,每次只记录度的变化即可。要注意这个模拟中容易出错的几点:

①在增长时每选定一个点都要判定它是否是选过的(一个新的点不能连之前的某个点超过一次),防止重复连接

②注意维护总的度数,一开始为最近邻网络的度之和;每次增加一个点和之前的k个点相连后,度总数都要加上2k;被连接的节点自己的度要加1;新增的节点度为k

③为了避免取对数过程对原始数据造成的影响,对于那些取对数后某坐标为0(实际上是小得没法表示)的点,主动地割舍它

 

*无标度度分布的模拟与统计

 

import random
import math
List_wbd=[4 for i in range(10)]#记录无标度网络每个点的度数,初始化后为10个点4最近邻
Int_sum=40#存储当前总度数

for j in range(10,20000):#对于后面的点,前面已经有j个点
    List_n=[]#记录这次连的三个点是哪三个,防止重复连接
    
    while len(List_n)<3:#List_n长度未达到3说明三个点还没有找完
        Int_which=random.randint(1,Int_sum)#选择一个在度总数范围内的随机数
        n=0#用来数这个数字落在哪个点上
        for i in range(j):#对于前面的每个点
            n+=List_wbd[i]#把对应点的度数每次加到n上
            if n>Int_which:#直到超过那个数字
                break#找到就退出循环
        if i not in List_n:#如果List_n里没有它,就加进去
            List_n.append(i)

    for i in List_n:#把里面存的每个下标对应的节点度数+1
        List_wbd[i]+=1
    List_wbd.append(3)#新增的点连了三个之前的点,度数一定为3
    Int_sum+=6#维护总度数

Dick_k={}#用一个字典来存放 度数:对应的节点数目
for i in List_wbd:
    if i not in Dick_k:
        Dick_k[i]=1
    else:
        Dick_k[i]+=1


'''f=open('show.txt','w')
try:
    f.write("每个节点的度数如下表:")
    f.write(str(List_wbd))
    f.write("度数的统计如下:度数:对应的节点数目")
    f.write(str(Dick_k))
finally:#用try-finally保证执行完write后执行close()
    f.close()

#未取对数的数据
f=open('old.txt','w')
try:
    for x in Dick_k:
            f.write(str(x)+' '+str(Dick_k[x])+'\n')
finally:
    f.close()'''

#取了对数的数据
f=open('result.txt','w')
try:
    for x in Dick_k:
        y=math.log(Dick_k[x])
        logx=math.log(x)
        if y!=0 and logx!=0:
            f.write(str(logx)+' '+str(y)+'\n')
#        print(x,y)
finally:
    f.close()
    print ('程序执行完毕,可以查看文件了')#提示程序已经执行完毕          

 

 

运行后要等待一分钟左右,待输出提示表示程序执行完毕后,在文件result.txt中就存好了logf(x) x无序对(因为是用字典做的)。

将它导入到WPS中,做散点图,并在散点图上做回归分析,显示它的回归直线方程即可

可以看到-γ=-2.6096,符合理论上的预期。测试多次,增加测试数据的范围,发现这个值比较稳定。
 

展开阅读全文

没有更多推荐了,返回首页