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

2 同质性与社会网络的演化

吕汶桧 Wenhui Lyu

Jan. 2022

codes

2.1 背景问题

上一节的内容主要是对社会网络的一种静态考察,但现实社会网络总是处在演变之中。一个最为重要的演化现象是,一些原本互不认识的节点可能会在某一时间点结识,对应在网络中建立了一条新的边。

两个人的结识有一定规律可循,它受着“机会”、“信任”和“动机”的影响。当两个陌生人之间有中介(例如共同朋友)时,这一中介就会大大增加他们俩相遇的机会,也让他们更容易彼此信任,有时也会有让他们相互结识的动机。

两个节点经由共同朋友的中介结识,称为“三元闭包”(triadic closure)。课上,李老师给我们介绍了一个基于大数据的研究,它借助一所大学里的邮件往来信息,验证了三元闭包原理:两个互不认识的人,共同朋友越多,一段时间后他们结识的概率越高。

课上还提到,三元闭包原理的一个细化版本是“强三元闭包原理”。对于一个社会网络,我们把其中的边标识为两类,一类指示强关系,另一类指示弱关系。强三元闭包原理说的是,如果节点i与节点j有强关系,节点i与节点k也有强关系,那么,节点j与节点k之间至少应该有弱关系。

这里的分析还可以引入“捷径”(local bridge)概念,亦即其两端节点没有“共同朋友” 的边。基于“强三元闭包原理”,我们可以推导出“捷径→弱关系”定理:在标识了强弱关系的网络中,如果一个节点符合强三元闭包原理且有两个强关系朋友(设为CD),则它与任何捷径相连的朋友(设为AB)之间一定是弱关系。否则,CD一定是AB的共同朋友,AB之间的边就不再是捷径。

社会网络演化的一个结果就是“同质性”:朋友(相近的人们)之间具有某种特征相似性,例如来自同一个地方。我们用“加入了某个‘社团’或‘俱乐部’”或“从事某件‘事’”,来刻画一个人的特征。当我们把“社团”概念考虑进社会网络以后,社会网络的演化不仅有“三元闭包”原理这一个规律,而且还有另外两个规律:

2.2 计算实践:同质性作用下的网络演化过程

codes

2.2.1 作业描述与算法思路

本次作业的任务是,基于三个闭包原理,用编程来模拟社会网络的演化。

为了操作的方便,我们把三个闭包原理简化为三个门槛假设:

正如我们可以用邻接矩阵来表示一个社会网络中的朋友关系,我们还可以用一个归属矩阵来表示人对社交聚点(social focal)的归属关系。

network of two matrices

上面这个社会网络可以用下面两个矩阵表示:

(0101000000100000000000000000001000011000000000000000010001010001000101000001101000000001010000011010)
(10110101011000000000)

基于社会网络的矩阵化,三个闭包原理可以表示成如下的数学关系:

给定一个社会网络,我们考察它是否满足了上面三个临界条件,加上该加的边,生成下一轮的社会网络,我们再做同样的操作。如此循环,直到稳定,没有新边可加。

2.2.2 编程实现与要点说明

首先,我们还是需要调用读取数据文件的函数,把邻接矩阵和归属矩阵存储在两个numpy 2d-arrays里,前者是A,后者是Bsfm的值由用户指定。代码略,与1.2.1.2类似。输入值的一个例子如下:

接着,我写了检验闭包条件的函数edgeAdder,便于重复调用:输入两个矩阵的数据ABsfm的值,输出满足闭包条件、加上新边后的两个矩阵。

三元闭包:一一检查网络中的边,当A[i]×A[j]s时,亦即np.dot(A[i], A[j]) >= s时,节点i与节点j建立一条边。这时我不应直接在邻接矩阵中作修改,否则会影响接下来对会员闭包的检验;我先把需要加的边存储在A_alters里。

社团闭包:当np.dot(B[i], B[j]) >= f时,节点i与节点j建立一条边,存储在A_alters里。

会员闭包:当np.dot(A[i], B[:,c]) >= m时,节点i与社团c建立一条边,存储在B_alters里。

根据A_altersB_alters的内容,统一对矩阵做出修改,加上该加的边。

主程序的内容,就是一轮接一轮地调用edgeAdder函数,加上该加的边,直到无边可加、演化结束。

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