【打卡】图分析与节点嵌入

news2024/9/28 15:30:22

背景介绍

图(Graphs)是一种对物体(objects)和他们之间的关系(relationships)建模的数据结构,物体以结点(nodes)表示,关系以边(edges)表示。图是复杂系统中常用的信息载体,可以表示现实中许多复杂关系,如社交网络、犯罪网络、交通网络等。

环境配置

实践环境建议以Python3.7+,且需要安装如下库:

numpy
pandas
networkx
igraph
gensim

Task1: 图属性与图构造

Task1.1 导入network

import pandas as pd
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

Task1.2 加载数据集

# 两列,分别为节点id,节点类别
group = pd.read_csv('DATA/group.txt.zip', sep='\t', header=None)
#查看节点个数
print('节点个数:{}, 节点类别:{}'.format(group[0].nunique(), group[1].nunique()))
# 两列,分别为出发节点id,目的节点id
graph = pd.read_csv('DATA/graph.txt.zip', sep='\t', header=None)
#查看边的个数
print("边的个数:{},起始节点个数:{}, 终止节点个数:{}".format(graph.shape[0], graph[0].nunique(), graph[1].nunique()))

在这里插入图片描述

Task1.3 使用network构造有向图

# 创建 图
G1 = nx.Graph()  # 创建:无向图
G2 = nx.DiGraph()  #创建:有向图
G3 = nx.MultiGraph()  #创建:多图
G4 = nx.MultiDiGraph()  #创建:有向多图

在这里插入图片描述

#创建有向图,nx在2.5.0以上才会有指向自身的箭头
g = nx.DiGraph()
# 只添加前100条边
g.add_edges_from(graph.values[:100])
nx.draw_spring(g)

# 添加所有数据
g = nx.DiGraph()
g.add_edges_from(graph.values[:])

在这里插入图片描述

Task2: 图查询与遍历

步骤1:使用networkx对Wiki数据集进行如下统计
节点个数、边个数
dir(g) 查看graph的属性
在这里插入图片描述

print('节点个数{}, 边的个数{}'.format(g.number_of_nodes(), g.number_of_edges()))

在这里插入图片描述

节点度平均
1.查看节点的度,是个dict类型,key是node,value是入度+出度
在这里插入图片描述
2.求度的均值

#节点度平均
np.mean([x[1] for x in list(g.degree)])

在这里插入图片描述

存在指向自身节点的个数
指向自身节点,就是边的起始点一样,edge[0]==edge[1]
在这里插入图片描述

步骤2:对节点1397进行深度和广度遍历,设置搜索最大深度为5
dir(nx)查看nx属性

# 对节点1397的深度5内进行深度和广度遍历
nx.dfs_tree(g, 1397, 5).nodes()
nx.bfs_tree(g, 1397, 5).nodes()

步骤3:判断节点1573与节点1397之间是否存在联通性

list(nx.connectivity.node_disjoint_paths(g, 1573, 1397))

在这里插入图片描述

Task3: 节点中心性与应用

步骤1:筛选度最大的Top10个节点,并对节点深度1以内的节点进行可视化;
步骤2:使用PageRank筛选Top10个节点,并对节点深度1以内的节点进行可视化;
步骤3:文本关键词提取算法RAKE
使用jieba对文本进行分词
单词作为节点,距离2以内的单词之间存在边
计算单词打分 wordDegree (w)/ wordFrequency (w)
按照打分统计每个文章Top10关键词
步骤4:文本关键词提取算法TextRank
使用jieba对文本进行分词
单词作为节点,距离2以内的单词之间存在边
使用PageRank对单词进行打分
按照打分统计每个文章Top10关键词

#步骤1:筛选度最大的Top10个节点,并对节点深度1以内的节点进行可视化;
g_degree = pd.DataFrame(g.degree()).sort_values(by=1)
g_degree = g_degree.iloc[-10:]
#对深度1以内的节点进行可视化
selected_nodes = []
for node in g_degree[0].values:
    selected_nodes += list(nx.dfs_tree(g, node, 1).nodes())
print('深度1以内的节点个数{}'.format(len(selected_nodes)))
#设置图片大小
plt.rcParams['figure.figsize']= (10, 10) 
nx.draw_spring(g.subgraph(selected_nodes), node_size=15)

在这里插入图片描述

# 步骤2:使用PageRank筛选Top10个节点,并对节点深度1以内的节点进行可视化;
g_pagerank = pd.DataFrame.from_dict(nx.pagerank(g), orient='index')
g_pagerank = g_pagerank.sort_values(by=0)

g_pagerank = g_pagerank.iloc[-10:]
print(g_pagerank)
selected_nodes = []
for node in g_pagerank[0].index:
    selected_nodes += list(nx.dfs_tree(g, node, 1).nodes())
print('深度1以内的节点个数{}'.format(len(selected_nodes)))
nx.draw_spring(g.subgraph(selected_nodes), node_size=15)

在这里插入图片描述

contents=[
# 文章1
'''
一纸四季报,令芯片巨头英特尔一夜间股价重挫近6.5%,市值蒸发80亿美元,再度被AMD反超。

这份严重缩水的财报显示,英特尔在去年四季度营收大降32%至140亿美元,是2016年以来最低单季收入;净利润由三季度的10.2亿美元转为近7亿美元净亏损;毛利率更从2021年四季度的53.6%大幅下降至39.2%。

此番业绩“跳水”并非英特尔一家的一时失利,在全球PC出货量整体下滑的背景下,包括英特尔、AMD、英伟达、高通在内的芯片企业,均在过去一年里出现不同程度的收入与利润下滑,但英特尔的确是其中的重灾区。
'''
,
# 文章2
'''
2021年,成都地区生产总值已经超过1.99万亿元,距离2万亿门槛仅咫尺之间。在去年遭受多轮疫情冲击及高温限电冲击的不利影响下,2022年,成都市实现地区生产总值20817.5亿元,按可比价格计算,比上年增长2.8%。

成都因此成为第7个跨过GDP2万亿门槛的城市。目前,GDP万亿城市俱乐部中形成了4万亿、3万亿、2万亿和万亿这四个梯队。上海和北京在2021年跨过了4万亿,深圳2021年跨过了3万亿,重庆、广州、苏州和成都则是2万亿梯队。

在排名前十的城市中,预计武汉将超过杭州。武汉市政府工作报告称,预计2022年武汉地区生产总值达到1.9万亿元左右。而杭州市统计局公布的数据显示,杭州2022年地区生产总值为18753亿元。受疫情影响,武汉在2020年GDP排名退居杭州之后。
'''

,
# 文章3
'''
据报道,美国证券交易委员会(SEC)与特斯拉首席执行官埃隆·马斯克之间又起波澜。SEC正对马斯克展开调查,主要审查内容是,马斯克是否参与了关于特斯拉自动驾驶软件的不恰当宣传。

据知情人士透露,该机构正在调查马斯克是否就驾驶辅助技术发表了不恰当的前瞻声明。

特斯拉在2014年首次发布了其自动驾驶辅助功能,公司声称该功能可以让汽车在车道内自动转向、加速和刹车。目前所有特斯拉车辆都内置了该软件。
'''
]

步骤3:文本关键词提取算法RAKE


import jieba
from collections import Counter
for content in contents:
    g2 = nx.Graph()
    words = jieba.lcut(content)
    words = [x for x in words if len(x) > 1]
    for i in range(len(words)-2):
        for j in range(i-2, i+2):
            if i == j:
                continue
            g2.add_edge(words[i], words[j])

    g2_node_gree = dict(g2.degree())
    word_counter = dict(Counter(words))

    g2_node_gree = pd.DataFrame.from_dict(g2_node_gree, orient='index')
    g2_node_gree.columns = ['degree']

    g2_node_gree['freq'] = g2_node_gree.index.map(word_counter)
    g2_node_gree['score'] = g2_node_gree['degree'] / g2_node_gree['freq']

    print(list(g2_node_gree.sort_values(by='score').index[-10:]))
    g2.clear()

在这里插入图片描述
文本关键词提取算法TextRank

for content in contents:
    g2 = nx.Graph()

    words = jieba.lcut(content)
    words = [x for x in words if len(x) > 1]
    for i in range(len(words)-2):
        for j in range(i-2, i+2):
            if i == j:
                continue
            g2.add_edge(words[i], words[j])

    g2_node_gree = pd.DataFrame.from_dict(nx.pagerank(g2), orient='index')
    g2_node_gree.columns = ['degree']
    g2_node_gree = g2_node_gree.sort_values(by='degree')
    print(list(g2_node_gree.sort_values(by='degree').index[-10:]))
    g2.clear()

在这里插入图片描述

Task4: 图节点嵌入算法:DeepWalk/node2vec

步骤1:使用DeepWalk对Wiki数据集节点嵌入,维度为50维
步骤2:每个group中20%的节点作为验证集,剩余的作为训练集
步骤3:使用节点嵌入向量 + 逻辑回归进行训练,并记录验证集准确率
步骤4:使用node2vec重复上述操作
步骤5:使用t-SNE将节点的DeepWalk/node2vec特征降维,绘制散点图,节点颜色使用group进行区分
2014 DeepWalk: Online Learning of Social Representations, PDF

DeepWalk的思想类似word2vec,使用图中节点与节点的共现关系来学习节点的向量表示。那么关键的问题就是如何来描述节点与节点的共现关系,DeepWalk给出的方法是使用随机游走(RandomWalk)的方式在图中进行节点采样。

RandomWalk是一种可重复访问已访问节点的深度优先遍历算法。给定当前访问起始节点,从其邻居中随机采样节点作为下一个访问节点,重复此过程,直到访问序列长度满足预设条件。

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

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

相关文章

Uncaught ReferenceError: jQuery is not defined

今天在拉取项目部署到本地的时候遇到了一个问题特此记录一下 (以后闭坑) 我和同事同时拉取了一样的代码,结果同事的页面加载正常而我的页面像被狗啃了一样,知道是js的问题但是不知道问题出在哪里?后来还是同事帮我解决…

Python - DIY - 使用dump取json某些键值对合成新的json文件

Python - Json处理前言:应用场景:基本工具:文件操作:打开文件:写文件:读文件:关闭文件并刷新缓冲区:Json字符串和字典转换:json.loads():json.dumps():Json文…

高端电器新十年,求解「竞速突围」

竞争激烈的高端电器品牌们,平时王不见王,但也有例外。海尔、博西、海信、创维、方太、老板等等近乎中国电器行业所有一线品牌副总裁级别以上高层,2月22日都现身于上海,来参加一场由红星美凯龙攒起来的高端电器局,2023中…

gogs代码仓库迁移至gitlab仓库上

将gogs仓库的所有分支都迁移到GitLab上 GitHub新建一个空项目 这个我就不教了: 不会的请点击这里 自查本地是否已有SSH公钥 我自身win11举例:C:\Users\PC.ssh\XXXXXX.pub 找“.pub”结尾的文件,用文本打开就是你本地的公钥了 直接复制公钥&#xff0…

比Redis更强,性能直接飙升一倍!

# 什么是KeyDB?KeyDB是Redis的高性能分支,专注于多线程,内存效率和高吞吐量。除了多线程之外,KeyDB还具有仅在Redis Enterprise中可用的功能,例如Active Replication,FLASH存储支持以及一些根本不可用的功能…

Java异常Throwable的分类

1. Exception:程序本身可以捕获并且可以处理的异常 编译时异常:编译期就会检查的异常,若调用的方法中throw了此类异常,则必须进行显式处理处理(用try…catch捕获或者throws向上抛出),否则无法通…

react源码解析10.commit阶段

在render阶段的末尾会调用commitRoot(root);进入commit阶段,这里的root指的就是fiberRoot,然后会遍历render阶段生成的effectList,effectList上的Fiber节点保存着对应的props变化。之后会遍历effectList进行对应的dom操作和生命周期、hooks回…

Materials - DistanceField Nodes

以前的相关笔记,归档发布;距离场相关节点:DistanceToNearestSurface节点:求出传入的Position位置到最近的面的距离并输出,在没有Position输入的时候,默认值会直接使用World Position:Position的…

部门来了个测试工程师,听说是00后,实在是太卷了.....

都说00后躺平了,但是有一说一,该卷的还是卷。 这不,前段时间我们部门来了个00后,工作没两年,跳槽到我们公司起薪18K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。…

喜讯!华秋电子荣获第六届“蓝点奖”十佳分销商奖

2 月 25 日,由深圳市电子商会主办的2023 中国电子信息产业创新发展交流大会暨第六届蓝点奖颁奖盛典在深圳隆重举行。 图:华秋商城渠道总监杨阳(右三) 深圳市电子商会连续六年举办“蓝点奖”评选活动,旨在表彰对电子信…

公众号运营思路是怎样的?建议收藏

问大家一个直击灵魂的问题: 你真的知道你的公众号该怎么运营吗? 先不要草率回答我,你先说说你的公众号运营思路是怎样的? 如果你连基本的运营思路都讲不出来,可想而知,你的公众号运营也好不到哪里去。 …

3.一一对应—简单工厂模式

什么是简单工厂模式? 简单工厂模式(Simple Factory),解决的是在多个基类的继承类中如何选择对应的类实例化。 到底要实例化哪一个继承类?——这就是简单工厂模式整天思考的问题。而之所以会出现这个问题是由于软件架…

java虚拟机中对象创建过程

java虚拟机中对象创建过程 我们平常创建一个对象,仅仅只是使用new关键字new一个对象,这样一个对象就被创建了,但是在我们使用new关键字创建对象的时候,在java虚拟机中一个对象是如何从无到有被创建的呢,我们接下来就来…

强化学习RL 02: Value-based Reinforcement Learning

DQN和TD更新算法。 目录 Review 1. Deep Q-Network(DQN) 1.1 Approximate the Q*(s,a) Function 1.2 Apply DQN to Play Game 1.3 Temporal Difference(TD) Learning 1.4 TD Learning for DQN 1.4.1 TD使用条件 condition 1.4.2 Train DQN using TD learning 1.5 summ…

【项目精选】基于java出租车计价器设计与实现(源码+论文+视频)

关于java出租车计价器设计与实现 点击下载源码 总共4个模块 (1)出租车计价系统可以实现出租车信息的管理。 1.1出租车信息的查询:通过数据库查询出租车的车型,车号,以及是否可用 1.2出租车信息的增加:向数据…

如何将BI 工具与业务系统进行单点登录对接,实现用户权限通用

首先来看下两套系统的用户体系功能,左边是BI 工具,右边是业务系统,需要实现用户权限对接和打通: 单点登录体系及用户场景 • 场景1. 用户登录Wyn BI页面使用第三方业务系统账号 • 场景2. 用户使用第三方账号登录wyn BI以后需要获…

栈与队列小结

一、理论基础1.队列是先进先出,栈是先进后出2.栈和队列是STL(C标准库)里面的两个数据结构。栈提供push和pop等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器。3.栈是以底层容器…

求职陷阱:Lazarus组织以日本瑞穗銀行等招聘信息为诱饵的攻击活动分析

概述 Lazarus组织是疑似具有东北亚背景的APT组织,奇安信威胁情报中心内部追踪编号为APT-Q-1,因2014年攻击索尼影业开始受到广泛关注,其攻击活动最早可追溯到2007年。该组织早期主要针对其他国家政府机构,以窃取敏感情报为目的&am…

Java查漏补缺(15)java.io.File类的使用、IO流原理及流的分类、节点流、处理流、其他流的使用、apache-common包的使用

Java查漏补缺(15)java.io.File类的使用、IO流原理及流的分类、节点流、处理流、其他流的使用、apache-common包的使用本章专题与脉络1. java.io.File类的使用1.1 概述1.2 构造器1.3 常用方法1、获取文件和目录基本信息2、列出目录的下一级3、File类的重命…

CLion Remote Debug CrossCompile

CLion远程Docker调试ROS(交叉编译)的设置步骤 准备一个好用的docker,运行起来(Docker Image一定可以跑cuda和图形界面的,否则启动不了CLion,可以不用浪费时间看本教程了) 在docker镜像中配置好ssh和rsync,…