圖機器學習(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
英文地址,請注明出處:http://en.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 提供了豐…