<< 返回本书主页
<< Back to the afterword page

1 社会网络基础

吕汶桧 Wenhui Lyu

Jan. 2022

codes

1.1 背景问题

“网络”由节点组成,节点之间可能有边相连。网络常常是对社会的一种有效抽象,节点代表社会中的行动者,边代表行动者之间的联系。

我们可以用一个矩阵(称为邻接矩阵)来表示网络,在程序中一般就是对应一个二维数组。邻接矩阵在(i,j)的值,表示ij之间边的权重。一种基本的情形是权重为010表示有边,1表示没有边,此时的网络也称为“图”。例如,

(0111101011011010)

这个矩阵就表示如下一个网络(或图),节点符号A,B,C,D,分别对应矩阵的第1,2,3,4行和列。

network example

一个节点与自己总是没有边的,因此,矩阵从左上到右下的对角线上都是0。对于一个无向图,邻接矩阵A(i,j)=A(j,i),亦即这一矩阵是对称的,以从左上到右下的对角线为轴。

基于图的邻接矩阵,我们可以通过计算得到对应社会网络的一些结构信息。例如,把一行内的值相加,就可以得到,该行对应的人有多少朋友。另一个例子是矩阵的乘幂,例如A2(i,j)表示节点ij之间的长度为2的路径一共有多少条,也可以解释为ij的共同朋友的个数。

利用这些计算操作,我们可以对网络的性质做出分析,这可以用以检验和社会网络相关的理论假设。作业“聚集系数和嵌入性”就是网络分析的一个例子。另一个作业则检验了社会网络学说的一个理论假设,即“友谊悖论”。

1.2 计算实践

1.2.1 聚集系数与嵌入性

codes

1.2.1.1 作业描述与算法思路

本次作业的主要任务是计算某一社会网络中,每个节点的聚集系数,以及每条边的嵌入性。

在一个网络中,不同人的社交密度或强度(intensity)不一样,有的人把自己的朋友聚集起来的能力很强——ta的朋友往往互相之间也认识。我们用“聚集系数”来刻画这一现象。节点i的聚集系数指的是,i的朋友们中,两两之间也是朋友的概率。

计算聚集系数的基本思路如下:我先分析邻接矩阵,用一个字典变量friend_dict存储“谁是谁的朋友”,字典的键(key)i指的是节点i[0,n),节点i的朋友j,k,[0,n)被存储在该键对应的值(value)里(值是一个列表)。接着,我再两两分析节点i的朋友(我把他们俩称为以节点i为中介的“间接朋友”),用friend_dict存储的信息验证,他们俩是否为“直接朋友”。节点i的聚集系数就是“直接朋友”和“间接朋友”的比值。

两个人之间的关系也有性质上的差别,有的关系深深嵌入了周围的社交圈中——不仅他们俩是朋友关系,而且他们俩的共同好友很多。我们用“嵌入性”来刻画这一现象。边(i,j)的嵌入性,指的是节点ij的共同朋友数。

计算嵌入性时,我一一分析网络中的边。对于边(i,j),我检查,节点i的朋友有多少也是节点j的朋友,这一过程也是用friend_dict完成的。

1.2.1.2 编程实现与要点说明

首先,我们读取样本数据文件,把文件里的矩阵数据存储在一个numpy 2d-array A里。

分析这一网络,我们把“谁是谁的朋友”存储在一个字典变量friend_dict里,字典的键(key)N[0,n)是节点,节点i[0,n)的朋友被存储在该键对应的值(value)里。

接着,我再两两分析节点i的朋友(他们俩是“间接朋友”,以节点i为中介),用friend_dict存储的信息验证,他们俩是否为“直接朋友”。以节点i为中介的间接朋友数存储在变量PossTriCl里,这些人中的直接朋友数存储在变量TriCl里。聚集系数ClCo=TriClPossTriCl。每一节点的聚集系数被存储在一个字典变量ClCo_dict里。

最后,我们在控制台里打印出各节点聚集系数的情况。

控制台输出的一个例子如下(由于样本数据较大,仅输出聚集系数排名前十的节点)。

接着计算网络中各边的嵌入性。利用friend_dict遍历所有边、计算两个人的共同朋友数。

输出结果到控制台。

由于样本数据较大,仅输出嵌入性排名前十的边。

1.2.2 友谊悖论的验证

codes

1.2.2.1 作业描述与算法思路

本次作业的主要任务是验证友谊悖论。这一悖论说的是,现实中多数人一般都感到朋友的朋友多于自己的朋友;尽管,直观上我们会觉得,既然有人觉得朋友的朋友多于自己的朋友,另一些人就会觉得朋友的朋友少于自己的朋友。

验证这一悖论,要在某个社会网络中进行。为了得到亟待验证的社会网络,一个方法当然是以现实生活的数据为基础、进行抽象和转化,我们在这次作业中采取的是另一个方法:基于“小世界”现象,生成一系列的网络。社会科学以“小世界”为主题的研究颇多,这些成果保证,我们生成的社会网络是对真实世界的合理模拟。

“小世界”现象指的是,邻接矩阵中任意两个点之间,都有一条很短的路径可以通达。之所以“小世界”现象存在,是因为社会网络有如下两个性质:

改变初始规则度数r、随机调整边占比p、总节点数n,我们就可以得到一系列不同的社会网络。它们都有“小世界”现象,只是同质性、随机性和规模有所不同。对于每一网络,我们都检验友谊悖论是否成立。

为了检验某一网络是否存在友谊悖论,我一一检查网络中的每一节点。对于节点i,如果他的朋友数(度数degree)比他朋友的平均度数小不少,那么节点i就存在友谊悖论。如果节点i度数刚好小于邻居的平均度数,节点i很难明显感觉到朋友比自己更受欢迎。我具体设定的悖论觉知门槛是,节点i度数的1.1倍小于邻居的平均度数。对于整个网络,如果超过一半的节点都觉知到了友谊悖论,这一网络就存在友谊悖论。

1.2.2.2 编程实现与要点说明

首先,我们需要一个生成社会网络的函数neighbor_generator:输入总节点数n、初始规则度数r、随机调整边占比p,这个函数会输出一个表示社会网络的矩阵matr(numpy 2d-array)。

初始规则边的建立:每一节点与相邻r个节点建立规则边。当n是偶数时,使节点i与编码[i+1,i+|r2+1+rmod2|]的节点建立边即可;当n是奇数时,执行同样的操作后,还需要删除n12条边。这样操作后,总边数为n×r2

随机调整边:对于已建立的规则边(存储在exc_edge中),比例为p的边被删除,并随机在无关系的两个节点之间(存储在exc_empt中)生成新边。

输出矩阵

除此之外,我们还需要一个验证友谊悖论的函数paradox:输入一个给定的矩阵,输出一个bool值,即它是否满足友谊悖论。

我先把“谁是谁的朋友”存储在字典变量fr_dict中,再用这个字典变量计算:节点i的度数,存储在dg_dict[i]['self'];ta邻居的平均度数,存储在dg_dict[i]['nb']

如果节点i的度数的1.1倍小于邻居的平均度数,ta就存在友谊悖论。如果网络中所有节点超过55%存在友谊悖论(pdScale > 0.55),这一网络就存在友谊悖论。

由于生成矩阵使用了随机数,随机过程的干扰可能导致单次生成的矩阵是一个特殊情况,对验证结论产生很大影响。因此,我们还需要一个计算友谊悖论期望值的函数pdE_calculator:输入一组特定的自变量(总节点数n、初始规则度数n、随机调整边占比n),运行矩阵生成函数一定次数loopCount,计算出现友谊悖论的节点比例pdScale的平均值,我们就得到该网络的友谊悖论期望值pdE

除此之外,我还定义了一个输出结果的函数pdOutput,便于反复调用。输入一组自变量值parameterList和对应的友谊悖论验证结果pdEList,它能在控制台打印结果、在csv文件中写入结果、使用matplotlib绘图。

以下是主程序

先准备好记录输出的csv文件。

我们先来验证,不同的网络规模n对友谊悖论发生期望的影响。给定,r=5,p=0.25n{50,100,150,200,300,500,600,800,1000}。对于每一个n值,我们调用pdMean函数,设定loopCount为100,计算发生友谊悖论的比例,结果存储在n_pdList里。

同理,我们再来验证,初始规则度数不同时,友谊悖论发生期望有何不同。给定n=100,p=0.25r{3,4,5,6,7,8,9,10},设定loopCount为100。

同理,我们最后来验证,随机调整边占比p不同时,友谊悖论发生期望有何不同。给定n=100,r=5p{0.15,0.25,0.35,0.45,0.55,0.65,0.75,0.85,0.95}

注意到,p越大,随机数对矩阵生成的扰动就越大,我们需要增加循环数,亦即增加矩阵生成次数loopCount,保证友谊悖论节点比例的平均值能达致稳定。因此,我将循环数设为751p

1.2.2.3 结果与分析

n501001502003005006008001000
Paradox Expectation0.4820.4810.4780.4820.4810.4830.4810.4810.482
r345678910 
Paradox Expectation0.5470.5110.4860.4650.4510.4290.4060.4 
p0.150.250.350.450.550.650.750.850.95
Paradox Expectation0.4180.480.5170.5330.550.5590.570.5730.575

friendship paradox

进一步的验证,还需要优化模型、增加取值、增加pdE_calculator()循环数loopCount后,进行严谨的统计学分析。我们的初步结论是,当r较小、p较大时,友谊悖论在全网络中的比例高于0.5,可以说这时友谊悖论是一个普遍现象。

<< 返回本书主页
<< Back to the afterword page