课程大作业 · 社交网络分析

作业要求

源题要求用 Python 完成三个任务,并提交 Jupyter Notebook 代码及分析报告。

任务一:节点重要性与传播能力

在给定无向社交网络中,计算每个节点的度中心性、接近中心性和介数中心性,据此找出最具传播能力的节点;比较三种中心性给出的排序差异,并解释哪类节点有更大传播潜力。

任务二:舆情传播与干预

根据每个节点的初始状态和激活概率,选择传播阈值模型或独立级联模型模拟信息传播。再通过影响关键节点或切断关键边设计干预策略,比较不同策略的效果并说明选择理由。

任务三:用户行为预测

输入 15 个用户的邻接矩阵和历史点赞数据,设计基于邻接矩阵的模型,预测用户未来是否会点赞尚未点赞的内容。

源样例的边表把 (6,8)(6,8) 重复列出一次;我提交的代码使用简单图,重复边被合并。任务三给出的邻接矩阵只有 14 行,我提交时另补了一行以形成 15×1515\times15 矩阵,因此该任务结果依赖这一补全假设。

展开查看提交结果与复盘

任务一结果

代码使用 NetworkX 计算三种中心性。结果最高项如下:

  • 度中心性:节点 1、2、3、5、7、9 并列 0.44440.4444;
  • 接近中心性:节点 2、3、9 并列 0.64290.6429;
  • 介数中心性:节点 2 最高,为 0.19910.1991。

我当时在报告中选择节点 2,理由是它在三种排序中都靠前。更准确地说,节点 2 在度中心性中是并列第一,在接近中心性中也是并列第一,并单独拥有最高介数中心性;它既有较多直接连接,又位于较多最短路上。

我在报告中提出可对三种中心性做加权平均,并认为样例中接近中心性和介数中心性分层更明显。但权重并非由题目唯一决定,应由“传播”究竟强调直接触达、全网速度还是跨群体桥接来确定。

任务二模型与结果

我提交的实现采用独立级联模型,并把边两端节点激活概率的均值作为这条边的传播概率。一次样例运行的激活过程是:

  1. 初始激活:{0,4,7,8}\{0,4,7,8\};
  2. 第二轮新增:{1,3,5}\{1,3,5\};
  3. 第三轮新增:{2,6,9}\{2,6,9\}。

代码分别尝试删除一条边或一个节点,并重复模拟 100000 次,以平均传播轮数排序。原网络平均轮数约为 2.982.98;按该指标,删除节点 7 得到约 3.593.59 轮,删除边 (3,7)(3,7) 得到约 3.393.39 轮。

我当时在报告中的判断是,应优先删除初始已激活且激活概率高的节点,或删除传播概率高、连接已激活端点的边。

这里有一个指标边界:传播轮数更长只说明扩散更慢,不保证最终感染人数更少。若目标是“抑制规模”,还应同时统计最终激活节点数;若目标是“拖慢速度”,平均轮数才是直接指标。

任务三实现与结果

我提交的实现把每个用户的邻接行和历史点赞向量拼成特征,对每项内容分别训练随机森林,再改写未点赞位置。我在报告中输出的预测矩阵几乎全部为 1。

代码中目标被写成:

targets.append((users == 0).astype(int))

这意味着标签 1 实际代表“原来没有点赞”,后面却又把模型输出 1 解释成未来点赞,标签语义发生了反转;同时训练特征包含同一份历史行为,数据量只有 15 个用户,几乎全 1 的结果不能作为可靠预测。

更合理的实验应使用时间切分:用较早时刻的网络和行为预测更晚时刻的新点赞,把真实新增点赞作为标签,并在未参与训练的用户或时间段上报告准确率、召回率等指标。

评论