图机器学习(14)——社交网络分析

图机器学习(14)——社交网络分析

    • 0. 前言
    • 1. 数据集分析
      • 1.1 数据集介绍
      • 1.2 使用 networkx 加载数据集
    • 2. 网络拓扑和社区检测
      • 2.1 网络拓扑
      • 2.2 社区检测

0. 前言

社交网站的崛起是近年来数字媒体领域最活跃的发展趋势之一,数字社交互动已经融入人们的日常生活中。社交网络中,用户既能分享观点、发布动态与反馈、参与线上活动,又能在社交平台上展示广泛的生活兴趣。
此外,社交网络为研究用户行为、解读人际互动及预测兴趣偏好提供了海量数据资源。将其构建为图结构(顶点代表人,边代表连接关系),便形成了提取有效信息的强大工具。然而,由于涉及大量可变参数,理解驱动社交网络演变的动态机制是一个复杂问题。
本节将探讨如何运用图论分析社交网络,并通过机器学习解决链接预测和社区发现等实际问题。

1. 数据集分析

本节将使用 SNAP Facebook 公共数据集。该数据集通过收集调查参与者的 Facebook 用户信息创建,包含 10 位用户的自我网络 (ego network)。每位用户需标注其好友所属的社交圈子,平均每位用户标注了 19 个社交圈,每个圈子平均包含 22 位好友。针对每位用户,数据集收集了以下信息:

  • 边关系:若两位用户在 Facebook 互为好友则存在边连接
  • 节点特征:用户个人资料若具备某项特征则标记为 1,否则为 0

最终将这 10 个自我网络合并为统一图结构供研究使用。

1.1 数据集介绍

数据集主要包含三个可下载文件:facebook.tar.gzfacebook_combined.txt.gzreadme-Ego.txt。各文件说明如下:

  • facebook.tar.gz:包含每个 ego 用户的四个文件(共 40 个文件)。文命名格式为 nodeId.extension,其中 nodeId 表示 ego 用户节点 IDextension 包括 edgescirclesfeategofeatfeatnames
    • nodeId.edges:包含 nodeId 节点网络的边列表
    • nodeId.circles:包含多行记录(每行对应一个社交圈),每行由圈子名称和系列节点 ID 组成
    • nodeId.feat:记录自我中心网络中所有节点的特征( 0 表示 nodeId 具备该特征,1 则相反)
    • nodeId.egofeat:包含 ego 用户的特征
    • nodeId.featname:保存特征名称列表
  • facebook_combined.txt.gz:包含文件 facebook_combined.txt,列出了所有 ego 网络的边
  • readme-Ego.txt:提供上述文件的详细说明文档

在开始任何机器学习任务前,充分熟悉数据集结构至关重要。

1.2 使用 networkx 加载数据集

使用 networkx 加载聚合的 ego 网络,合并的 ego 网络以边列表形式呈现。我们可以通过 networkx 从边列表创建无向图:

G = nx.read_edgelist("facebook_combined.txt", create_using=nx.Graph(), nodetype=int)

打印关于图的基本信息:

print(f"Number of nodes: {G.number_of_nodes()}")
print(f"Number of edges: {G.number_of_edges()}")

输出如下所示,可以看到聚合网络包含 4039 个节点和 88234 条边,其边数达到节点数的 20 倍以上,表明这是一个连接高度密集的网络:

Number of nodes: 4039
Number of edges: 88234 

可视化网络将有助于更好地理解分析对象,使用 networkx 绘制图:

nx.draw_networkx(G, pos=spring_pos, with_labels=False, node_size=35)

输出结果如下所示:

可视化

可以观察到存在多个高度互联的枢纽节点。从社交网络分析视角来看,这些枢纽节点可能是潜在社交机制作用的结果,深入研究这些机制有助于理解个体社交关系网络的结构特征。
保存网络中自我用户的节点 ID。这些 ID 可从 facebook.tar.gz 压缩包内的文件中提取。首先,解压 facebook.tar.gz,解压后的文件夹名为 facebook,通过获取每个文件名的第一部分来检索 ID

ego_nodes = set([int(name.split('.')[0]) for name in os.listdir("facebook/")])

在下一小节中,我们将通过检查图的属性来深入理解其结构特征,这将帮助我们更清晰地把握其拓扑结构和关键特性。

2. 网络拓扑和社区检测

理解网络拓扑结构及节点角色是社交网络分析的关键步骤。在社交网络中,节点实质上是具有独特兴趣、习惯和行为模式的真实用户。

2.1 网络拓扑

(1) 首先,计算同配性 (assortativity),该指标能揭示用户是否倾向与连接度相似的节点建立连接:

assortativity = nx.degree_pearson_correlation_coefficient(G)

输出结果如下:

0.06357722918564912

可以看到,同配性为正值,这表明高度连接的用户倾向于相互关联,因为每个社交圈内部的用户通常存在密集连接。

(2) 传递性 (transitivity) 也有助于理解用户间的连接模式。该指标表示拥有共同好友的两人本身也是朋友的平均概率:

t = nx.transitivity(G)

输出结果如下所示:

0.5191742775433075

可以看到,概率大约为 50%,表示两个有共同好友的用户既可能建立也可能不存在朋友关系。可以通过计算平均聚类系数得到进一步验证——该系数可视为传递性的另一种定义形式:

aC = nx.average_clustering(G)

输出结果如下所示:

0.6055467186200876

需要注意的是,聚类系数通常高于传递性。这是因为根据定义,该指标更关注低连接度节点——由于这类节点的邻居对数量有限(即局部聚类系数公式中的分母较小),其权重会被放大。

(3) 在明确整体拓扑结构后,我们可以进一步探究网络中每个个体的重要性。正节点重要性最基础的定义可通过中介中心性 (betweenness centrality) 来衡量——该指标统计经过某节点的最短路径数量,反映该节点在信息传播中的枢纽程度:

bC = nx.betweenness_centrality(G)
np.mean(list(bC.values()))

输出结果如下所示:

0.0006669573568730229

(4) 平均中介中心性较低,这与网络中大量非桥接节点的存在相符。但通过可视化增强处理,我们能更直观地观察关键节点。定义一个增强绘制函数来突显高中介中心性节点:

def draw_metric(G, dct, spring_pos):top = 10max_nodes =  sorted(dct.items(), key = lambda v: -v[1])[:top]max_keys = [key for key,_ in max_nodes]max_vals = [val*300 for _, val in max_nodes]plt.axis("off")nx.draw_networkx(G, pos=spring_pos, cmap='Blues', edge_color=default_edge_color,node_color=default_node_color, node_size=3,alpha=0.4, with_labels=False)nx.draw_networkx_nodes(G, pos=spring_pos, nodelist=max_keys, node_color=enhanced_edge_color,node_size=max_vals)

调用该函数进行绘制:

draw_metric(G, bC, spring_pos)

输出结果如下所示:

可视化

(5) 接下来,计算每个节点的度中心性,该指标与节点的直接连接数相关,能清晰反映节点的本地连接密度:

deg_C = nx.degree_centrality(G)
np.mean(list(deg_C.values()))
draw_metric(G,deg_C,spring_pos)

输出结果如下所示:

0.010819963503439287

度中心性可视化结果如下所示:

可视化

(6) 最后,结算接近中心性 (closeness centrality) 指标。该指标通过计算节点到网络中所有其他节点的最短路径平均长度,帮助我们理解节点间的信息传播效率:

clos_C = nx.closeness_centrality(G)
np.mean(list(clos_C.values()))
draw_metric(G,clos_C,spring_pos)

输出平均接近中心性:

0.2761677635668376

接近中心性可视化结果如下所示:

可视化

通过中心性分析可以发现,每个核心节点似乎都隶属于某个社区(因为这些核心节点可能对应网络中的自我中心节点)。尤其值得注意的是存在多个高度互连的节点群(从接近中心性分析中尤为明显)。因此,我们将在接下来的分析中重点识别这些社区结构。

2.2 社区检测

在社交网络分析中,最值得探索的图结构特征之一就是社区划分。以 Facebook 为例,用户的好友关系往往反映生活的不同维度:教育背景好友(中学、大学等)、每周足球活动的伙伴、聚会结识的朋友等。社交网络分析能够自动识别这类群体,既可以通过拓扑特性自动推断,也能结合先验知识进行半自动划分。
理想的社区划分标准是:最小化社区间连接(不同社区成员间的边),同时最大化社区内连接(同一社区成员间的边):

import communityparts = community.best_partition(G)
values = [parts.get(node) for node in G.nodes()]
n_sizes = [5]*len(G.nodes())
plt.axis("off")
nx.draw_networkx(G, pos=spring_pos, cmap=plt.get_cmap("Blues"),
edge_color=default_edge_color, node_color=values, node_size=n_sizes, with_labels=False)

输出结果如下所示:

可视化

在这个分析阶段,也可以探究自我用户 (ego user) 在已检测社区中的角色分布,增强这些特殊节点的显示效果:

for node in ego_nodes:print(node, "is in community number", parts.get(node))n_sizes = [5]*len(G.nodes())
for node in ego_nodes:n_sizes[node] = 250plt.axis("off")
nx.draw_networkx(G, pos=spring_pos, cmap=plt.get_cmap("Blues"), edge_color=default_edge_color, node_color=values, node_size=n_sizes, with_labels=False)# enhance color and size of the ego-nodes
nodes = nx.draw_networkx_nodes(G,spring_pos,ego_nodes,node_color=[parts.get(node) for node in ego_nodes])
nodes.set_edgecolor(enhanced_node_color)

输出结果如下所示:

可视化

可以看到,部分 ego 用户同属一个社区,这些用户在 Facebook 上可能存在真实好友关系,因此他们的自我网络存在部分重叠。通过对图结构的分析,可以发现网络中可识别出若干重要节点,同时这些节点所属的社群具有明显边界特征。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92873.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92873.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析Hadoop MapReduce中Reduce阶段排序的必要性

MapReduce概述与Reduce阶段简介MapReduce作为Hadoop生态系统的核心计算框架,其设计思想源自Google论文,通过"分而治之"的理念实现海量数据的并行处理。该模型将计算过程抽象为两个关键阶段:Map阶段负责数据分解和初步处理&#xff…

7月23日华为机考真题第二题-200分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ bishipass.com 02. 图书馆资源分配系统 问题描述 A先生是一位图书馆管理员,负责管理图书采购和分配工作。图书馆收到了来自不同出版社的图书批次,同时有多位读者代表排队申请图书…

基于深度学习的图像分类:使用ResNet实现高效分类

最近研学过程中发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面开始对正文内容的…

JVM:工具

JVMjpsjstatjmapjhatjstackjconsolejvisualvmjps jps( Java Virtual Machine Process Status Tool ),是 JDK 中的一个命令行工具,用于列出当前正在运行的 JVM 实例的信息。其对于监控和管理运行在多个 JVM 上的 Java 应用程序特别…

Elasticsearch Circuit Breaker 全面解析与最佳实践

一、Circuit Breaker 简介 Elasticsearch 是基于 JVM 的搜索引擎,其内存管理十分重要。为了避免单个操作或查询耗费过多内存导致节点不可用,Elasticsearch 引入了 Circuit Breaker(熔断器)机制。当内存使用达到熔断器预设阈值时&a…

ARM-定时器-定时器函数封装配置

以TIMER7为例&#xff0c;对定时器函数进行封装注意事项&#xff1a;GD32中TIMER7是高级定时器&#xff0c;相关详细请参考上一篇文章。main.c//main.c#include "gd32f4xx.h" #include "systick.h" #include <stdio.h> #include "main.h" …

【日志】unity俄罗斯方块——边界限制检测

Bug修复记录 项目场景 尝试使用Unity独自制作俄罗斯方块&#xff08;也许很没有必要&#xff0c;网上随便一搜就有教程&#xff09; 问题描述 俄罗斯方块的边缘检测出错了&#xff0c;对方块进行旋转后&#xff0c;无法到达最左侧或者最下侧的位置&#xff0c;以及其他问题。演…

C++ string:准 STL Container

历史STL 最初是一套独立的泛型库&#xff08;Alexander Stepanov 等人贡献&#xff09;&#xff0c;后来被吸纳进 C 标准库&#xff1b;std::basic_string 则是早期 C 标准&#xff08;Cfront / ARM 时代&#xff09;就存在的“字符串类”&#xff0c;并非 STL 原生物。std::st…

Golang学习笔记--语言入门【Go-暑假学习笔记】

目录 基础语法部分相关概念 基础语法部分概念详解 可见性 导包 内部包 运算符 转义字符 函数 风格 函数花括号换行 代码缩进 代码间隔 花括号省略 三元表达式 数据类型部分相关概念 数据类型部分概念详解 布尔类型 整型 浮点型 复数类型 字符类型 派生类型…

linux中kill 命令使用详解

在Linux系统里&#xff0c;kill命令的主要功能是向进程发送信号&#xff0c;以此来控制进程的运行状态。下面为你详细介绍它的使用方法&#xff1a; 基础语法 kill [选项] [进程ID]进程ID也就是PID&#xff0c;可通过ps、pgrep或者top等命令来获取。 常用信号及其含义 信号可以…

Nginx 安装与 HTTPS 配置指南:使用 OpenSSL 搭建安全 Web 服务器

Nginx 安装与 HTTPS 配置指南:使用 OpenSSL 搭建安全 Web 服务器 一、Nginx安装 1. 安装依赖项 sudo yum groupinstall "Development Tools" -y # 非必须 sudo yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel -y2.下载Nginx wget http://n…

写个 flask todo app,简洁,实用

- 此项目虽然看起来简单&#xff0c;实际上&#xff0c;修改成自己喜欢的样子&#xff0c;也是费时间的。 - 别人都搞AI 相关的项目&#xff0c;而我还是搞这种基础的东西。不要灰心。 - 积累。不论项目大小&#xff0c;不论难易&#xff0c;只看是否有用。项目地址&#xff1a…

4麦 360度定位

要在 ESP32 上用 4 个麦克风实现 360 声源定位&#xff0c;通常思路是通过 时延估计&#xff08;TDOA&#xff09; 几何计算&#xff0c;核心流程&#xff1a;阵列布置将 4 个麦克风等间距布置成正方形&#xff08;或圆形&#xff09;。记阵列中心为原点&#xff0c;麦克风编号…

使用yolov10模型检测视频中出现的行人,并保存为图片

一、使用yolov10模型检测视频中出现的行人&#xff0c;并保存为图片&#xff0c;detect_person.py代码如下&#xff1a;from ultralytics import YOLOv10 import glob import os import cv2 import argparsedef detect_person(videoPath, savePath):if not os.path.exists(save…

现在希望用git将本地文件crawler目录下的文件更新到远程仓库指定crawler目录下,命名相同的文件本地文件将其覆盖

git checkout main git pull origin main $source “D:\黑马大数据学习\crawler” $dest Join-Path (Get-Location) “crawler” if (-not (Test-Path $dest)) { New-Item -ItemType Directory -Path $dest | Out-Null } Copy-Item -Path $source* -Destination $dest -Recur…

网络调制技术对比表

&#x1f4ca; 网络调制技术全维度对比表​调制技术​​简称​​频谱效率​​抗噪性​​功率效率​​复杂度​​关键特性​​典型应用场景​​幅度键控​ASK低差高低/低电路简单&#xff0c;易受干扰遥控器、光通信(OOK)​频移键控​FSK低-中中中中/中抗噪较好&#xff0c;频谱…

优化 Elasticsearch JVM 参数配置指南

一、概述 Elasticsearch 是基于 JVM 的搜索和分析引擎。JVM 参数的合理配置直接影响着 Elasticsearch 的性能和稳定性。尽管 Elasticsearch 已经提供了默认的 JVM 设置&#xff0c;但在某些特定场景下&#xff0c;我们可能需要进行适当的调整和优化。 本文将详细讲述如何安全、…

Python, Go 开发如何进入心流状态APP

要开发一款基于Python和Go语言、帮助用户进入“心流”状态&#xff08;高度专注、高效愉悦的心理状态&#xff09;的应用&#xff0c;需结合两种语言的技术优势&#xff08;Go的高并发与性能、Python的灵活性与AI生态&#xff09;及心流触发机制&#xff08;清晰目标、即时反馈…

一文详解手机WiFi模块与连接

目录 1 硬件模块 1.1 Wifi射频模 1.2 电源管理模块 2 软件与协议栈 2.1 系统服务层 2.2 认证与协议处理 3 连接流程 3.1 开启WiFi与扫描 3.2 选择网络与认证 3.3 连接与IP分配 4 特殊连接方式 4.1 WPS快速连接 4.2 热点模式&#xff08;AP模式&#xff09; 4.3 U…

Java 网络编程详解:从基础到实战,彻底掌握 TCP/UDP、Socket、HTTP 网络通信

作为一名 Java 开发工程师&#xff0c;你一定在实际开发中遇到过需要与远程服务器通信、实现客户端/服务端架构、处理 HTTP 请求、构建分布式系统等场景。这时&#xff0c;Java 网络编程&#xff08;Java Networking&#xff09; 就成为你必须掌握的核心技能之一。Java 提供了丰…