Facebook社交网络分析Facebook_analys

%matplotlib inline
import pandas as pd
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
from random import randint

数据集介绍:

Facebook数据已匿名化,将每个用户的Facebook内部ID替换为新值。此外,虽然提供了来自此数据集的特征向量,但对这些特征的解释已被模糊。例如,如果原始数据集可能包含“政治=民主党”特征,则新数据将仅包含“政治=匿名特征1”。因此,使用匿名数据可以确定两个用户是否具有相同的政治派别,但不能确定他们各自的政治派别代表什么。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DYtqleOP-1681478112236)(attachment:image.png)]

一:查看数据

facebook = pd.read_csv(
    r"D:\学习\图神经网络\数据集\Facebook数据集\facebook_combined.txt.gz",
    sep=" ",
    names=["start_node", "end_node"],
    header=None,
)
print(type(facebook))
# 打印前10条数据
print(facebook.head(10))
<class 'pandas.core.frame.DataFrame'>
   start_node  end_node
0           0         1
1           0         2
2           0         3
3           0         4
4           0         5
5           0         6
6           0         7
7           0         8
8           0         9
9           0        10
# 打印后10条数据
print(facebook.tail(10))
       start_node  end_node
88224        4021      4030
88225        4023      4030
88226        4023      4031
88227        4023      4034
88228        4023      4038
88229        4026      4030
88230        4027      4031
88231        4027      4032
88232        4027      4038
88233        4031      4038

二:根据连接列表生成图

G = nx.from_pandas_edgelist(facebook, "start_node", "end_node")

三:可视化图

如果我们清楚图是什么样的,我们可以定义节点的坐标,定义连边的粗细与权重成正比,定义节点的大小与节点的度成正比
但是对于facebook社交网络图,我们没有任何结构信息,因此使用random_layout函数,最简单的图的布局函数

fig, ax = plt.subplots(figsize=(15, 9))
ax.axis("off")#关闭所有坐标轴线、刻度标记和标签
plot_options = {
   "node_size": 5, "with_labels": False, "width": 0.15}
nx.draw(G, pos=nx.random_layout(G), ax=ax, **plot_options)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9dmVqyNQ-1681478112237)(output_10_0.png)]

如图:看不出任何结构,不是没有结构,而是结构没有排列好,因为节点排列有问题,太多边重叠混杂在一起
解决方法:使用spring_layout()函数重新排列节点,此函数可以根据节点的连接结构计算节点的位置,但是对Facebook数据集,节点太多,计算很复杂,且耗时,设置迭代次数。

pos = nx.spring_layout(G, iterations=15, seed=2500)
fig, ax = plt.subplots(figsize=(15, 9))
ax.axis("off")
nx.draw_networkx(G, pos=pos, ax=ax, **plot_options)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lN18xBkw-1681478112237)(output_12_0.png)]

四:图的基本拓扑属性¶

#网络中的节点总数:
G.number_of_nodes()
4039
#边总数
G.number_of_edges()
88234

节点的平均程度。

一个节点平均连接44 个节点,一个人平均认识44个人。

通过创建节点所有度数的列表并用于查找所创建列表的平均值。numpy.array

G.degree()#输出为图的datafram数据,需将其转换为列表
d=list( G.degree())
np.mean(d,axis=0)#axis=0,对列求均值
array([2019.        ,   43.69101263])
# np.mean([d for _, d in G.degree()])

计算节点间的最短路径长度

有许多有趣的属性与通过图形的路径分布有关。

例如,图形的直径表示 将任何节点连接到图形中的另一个节点的最短路径。

类似地,平均路径长度给出了平均 要遍历的边以从网络中的一个节点到达另一个节点。 这些属性可以分别使用 nx.all_pairs_shortest_path_length和 nx.average_shortest_path_lengt函数进行计算。

但这些分析需要计算网络中的每一对节点的最短路径 ,计算量太大,对于网络中的所有节点,我们可以计算一次并重用 信息以节省计算时间。

nx.all_pairs_shortest_path_length返回一个字典的字典,该字典将节点映射到网络中的所有其他节点,其中最里面的映射返回 两个节点之间的最短路径的长度。 换句话说,将返回最短路径 任意两对节点之间的长度和:ushortest_path_lengths[u][v]uv

shortest_path_lengths = dict(nx.all_pairs_shortest_path_length(G))
shortest_path_lengths[0][42]  # Length of shortest path between nodes 0 and 42
1

图的直径:所有节点的最大离心率
节点i的离心率:节点i到其它任意节点的最大 d(i,j)(i,j节点的最短路径)

任意两个人之间的最短路径最大为8,最多经过7个人,两个人可互相认识。

六度空间理论:最多通过6个人可以认识认识任何一个陌生人。
(这里算的是7,但有个概率问题,后面可以看到需要7个人才认识的概率不足0.001.

#nx.eccentricity(G, sp=shortest_path_lengths)
diameter = max(nx.eccentricity(G).values())
diameter
8
# nx.eccentricity(G)

计算全图平均最短路径并绘制平均最短路的分布图

# # Compute the average shortest path length for each node
# average_path_lengths = [
#     np.mean(list(spl.values())) for spl in shortest_path_lengths.values()
# ]
# # The average over all nodes
# np.mean(average_path_leng
  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值