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

9 社会网络中的影响力与共识

吕汶桧 Wenhui Lyu

Jan. 2022

codes

9.1 背景问题

我们可以用有向图表示一个节点对其他节点的认同,有向边ijA[i,j]=1)指的是,节点i认同节点j

有向图的性质

方向性的存在意味着一系列新的性质:

 无向图有向图
n个节点的图的最大边数n(n1)2n(n1)
如果AB的最短有向路径长度(距离)记为ABAC的最短有向路径长度记为AC,那么BC的有向路径长度BCAB+AC

强连通图指的是满足如下条件的节点子集及其节点之间的边构成的子图S

  1. S中任何两个节点之间都有双向路径(长度可以大于1);
  2. S之外不再有任何节点,既可以经G中的有向路径到达S,也可以从S到达它。

若一个节点与任何其他节点都没有双向路径,则它自己构成一个强连通分量。

例如,下面这个有向图存在7个强连通分量:

强连通分量

根据定义,可以通过广度优先搜索(BFS,见第三讲)找出有向图中的强连通分量:先用BFS找出节点x沿出向边所能到达的节点集合为F,再找出沿入向边能到达x的节点集合为B,则FB就是包含x的强连通分量。

“重要性”评估:PageRank

有向边意味着“认同”关系,入度越高的节点,观点越受社会网络中的其他人重视,重要性越高。为了进一步利用有向图来评估每一节点的重要性,我们设置如下的操作化条件:

由于不同节点的价值之间相互关联和影响(“被认可”体现的价值与“推荐人”的价值成正比),我们可以解方程来求解,也可以设每一节点的初始价值为1n(共n个节点),然后迭代进行节点价值的更新:利用前一轮里每一节点的价值、根据他们的相互推荐,计算下一轮里每一节点的价值,再重复这一操作。迭代算法被搜索引擎用来确定网页的排序,故称为PageRank,具体地,这是PageRank的基本更新算法。

基本更新算法无法合理处理某些特殊情况。例如吸血鬼节点:一个节点总是只指向自己、只把认同价值分给自己,与此同时吸收其他节点的认同价值(下方左图的节点x);或者,少数几个节点互相认同、在内部瓜分认同价值;与此同时吸收其他节点的认同价值(下方右图的节点x,y)。

基本更新算法的问题

克服这种挑战的措施就是在迭代过程的每一轮,都做“同比缩减,等量补偿”——类比按收入的统一百分比交税,然后发等量救济款。每个节点得以平等地保有一些价值,避免了网络中的认同价值被少数几个吸血鬼节点吸纳。用一个占比因子s调控同比缩减的力度,0<s<1,通常选在0.85左右。

社会共识的形成:DeGroot Consensus

有向边意味着“认同”关系,如果节点i认同jj的态度和观点可能对i有很大影响;因此,有向图中的“认同”网络还能用来模拟社会中观点之间的互相影响,这种互相影响可能导向社会共识。进一步的操作化算法如下:

  1. 公开每个人的当前表态(认识);
  2. 每个人用自己认为靠谱的人的均值更新自己的表态;
  3. 若稳定了就停止,否则回到 1。

9.2 计算实践:网络中影响力与共识的关系

codes

9.2.1 作业描述与算法思路

社会共识形成的算法迭代进行观点的更新。对于已稳定下来的情况,直观上我们会认为,社会共识与每个节点的影响力或PageRank有关系,共识应当接近影响力大的人的观点。

具体地,用向量p=(p1,p2,,pn)表示每个节点的PageRank,用s=(s1,s2,,sn)表示每个节点的观点初值,用数值c表示DeGroot共识的结果。三者之间其实有如下关系

c=ps

这一理论能在数学上得到证明。本次作业是在一个例子模型中编程验证这一理论:

PageRank算法中价值的更新和DeGroot算法中观点的更新,都涉及矩阵向量乘法。以如下的认同有向图A为例,

(1)A=(0100100100000101100000010)

PageRank算法中更新节点价值时,由于一条认同边的价值与“推荐人”的推荐数成反比,我们要先对矩阵行做归一化,每一行总和值为1。归一化后的值意味着,每个“推荐人”的推荐数越多,单个推荐的价值就越低。

(2)A=(00.5000.500100000100.50.500000010)

i轮迭代中,每个节点有一当前价值,用向量vi=(v1,v2,,vn)表示,初始值v0=(1n,1n,,1nn)

v(推荐人的价值)与A的列i(推荐人的分量)做点乘,就可以得到节点i的新价值。这意味着我们需要转置(转换行列)viA,再把二者做点乘就能得到新的PageRank vi+1

(3)(0000.500.5000.5001000001010.50000)(v1v2v3v4v5)=(12v412(v1+v4)v2v3+v512v1)

在DeGroot算法中,每个节点更新自己的观点时,要把自己认同的人的观点做加权平均,这也意味着我们需要把矩阵A标准化为A,这一步同(1)(2)。标准化后的值意味着,认可k个人的节点i,其中一个被认同者ji的影响是1k

s(被认同者的观点值)与A里的第i行(被认同者对节点i的影响分量)做点乘,就可以得到节点i的新观点值。具体操作矩阵向量乘法时,我们只需转置s

(4)(00.5000.500100000100.50.500000010)(s1s2s3s4s5)=(12(s2+s5)s3s412(s1+s2)s4)

迭代进行以上两个矩阵向量乘法,直到稳定。

9.2.2 编程实现与要点说明

首先仍然是读取有向图文件,存储在矩阵A里,读取初始观点向量,存储在向量S里。具体代码省略,参见1.2.1.2。我使用的数据文件如下:

接着,我们来标准化矩阵,存储为A_sd

迭代计算DeGroot共识。如前所述,我们应该转置S,再把A_sd和它做点乘。但是,为了书写的简便(主要是便于后面计算PageRank时书写方便),我没有转置S,而是转置了A_sd、得到A_trans,并且把向量S放在了左边、矩阵A_trans放在了右边。这样计算得到的结果是一样的。不过,严格按照数学中矩阵向量乘法的规定,还是应该如上操作。

在每一轮,我们点乘S_originalA_trans,得到新的观点结果S

比较更新前后的观点向量,如果每一维度的值前三位小数不发生变化,我们就认为观点的迭代更新达成了稳定。

迭代计算PageRank。如前所述,我们应该转置A_sdV,再把二者做点乘。但是,为了书写的简便,我没有做转置,而是把向量V放在了左边、矩阵A_sd放在了右边做点乘。

比较更新前后的价值向量,如果每一维度的值前五位小数不发生变化,我们就认为价值的迭代更新达成了稳定。之所以两次判定稳定所取的小数位数不同,是因为,小数位数相同时,价值向量的有效位数比观点向量更少。

最后,我们使用PageRank对初始观点加权求和np.dot(V,S_initial)

基于PageRank算法得到的社会共识与DeGroot共识一致,本作业的理论假设得到了检验。

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