DeepWalk实战---Wiki词条图嵌入可视化

2023-09-21 15:00:21

DeepWalk是2014年提出的一种Graph中的Node进行Embedding的 算法,是首次将自然语言处理领域NLP中的 word2vec拓展到了graph。万事万物皆可embedding,所以DeepWalk我感觉在图机器学习中具有非常强的应用价值。

1. 首先打开Anaconda Prompt (Anaconda),创建一个能用于DeepWalk实战的环境。

2. 在pycharm接着新建项目,导入该环境的解释器

3. 创建好后,安装必要的工具包,gensim是NLP领域的经常要用的工具包,因为DeepWalk其实就是把NLP中的Word2Vec直接用到图上,所以可以直接用NLP领域的工具包gensim。tqdm是进度条工具包,scikit-learn的话是因为要用到降维算法才导入的。matplotlib是可视化用的。

!pip install networkx gensim pandas numpy tqdm scikit-learn matplotlib

4.  在爬虫网站https://densitydesign.github.io/strumentalia-seealsology/

输入从一个链接跳转四个网页,也就是指定Distance设置为4

就会自动画图,

然后爬取1000个网页之后,点击`STOP & CLEAR QUEUE`

接着Download-下载TSV文件,保存至代码相同目录,命名为`seealsology-data.tsv`,csv分割是用逗号,而tsv则是用制表符'\t'。该文件内容如下:

5. 使用read_csv来读取该数据集。

6. 使用network来对上述数据集构造无向图

G = nx.from_pandas_edgelist(df, "source", "target", edge_attr=True, create_using=nx.Graph())

使用len(G)可以发现有8560个node,也就是有8560个词条。

7. 定义并实现一个输入起始点和随机游走步数的函数

def get_randomwalk(node, path_length):
    '''
    输入起始节点和路径长度,生成随机游走节点序列
    '''
    
    random_walk = [node]
    
    for i in range(path_length-1):
        # 汇总邻接节点
        temp = list(G.neighbors(node))
        temp = list(set(temp) - set(random_walk))    
        if len(temp) == 0:
            break
        # 从邻接节点中随机选择下一个节点
        random_node = random.choice(temp)
        random_walk.append(random_node)
        node = random_node
        
    return random_walk

试着从随机森林出发,采样五个节点:

get_randomwalk('random forest', 5)

8. 把所有节点放进一个列表list中。

all_nodes = list(G.nodes())

9. 接下来对每个节点生成随机游走序列,首先设置论文里的那些参数

gamma = 10 # 每个节点作为起始点生成随机游走序列个数
walk_length = 5 
# walk_length 为随机游走序列最大长度
# 可是是无向图喔,length为什么可以小于5呢,不回原路返回吗?答案是不会,看上面get_randomwalk函数的定义,是会排除掉出发点的

10. 对每个结点跑DeepWalk

跑出来的随机游走序列个数如下:

看下索引为1的随机游走序列,其实就是第一个节点的第二趟随机游走序列:

11. 直接用Word2Vec来处理DeepWalk

from gensim.models import Word2Vec # 自然语言处理
model = Word2Vec(vector_size=256, # Embedding维数
                 window=4, # 窗口宽度,NLP中就是左边看四个词,右边看四个词,graph就是左看四节点,右看四节点
                 sg=1, # Skip-Gram,中心节点预测周围4*2节点;为0就是周围节点预测中心节点
                 hs=0, # 不加分层softmax
                 negative=10, # 负采样
                 alpha=0.03,  # 初始学习率
                 min_alpha=0.0007, # 最小学习率
                 seed=14 # 随机数种子
                )
# 用随机游走序列构建词汇表
model.build_vocab(random_walks, progress_per=2)
# 训练,启动
model.train(random_walks, total_examples=model.corpus_count, epochs=50, report_delay=1)

12.  分析Wod2Vec(DeepWalk)结果

查看随机森林的embedding的形状,和11处的vector_size=256一致:

随机森林这一个节点的具体embedding向量如下,完全符合论文中说的那样,embedding是低维(相比起邻接矩阵n*n,已经变小成n*k了,n为节点数量,k为embedding向量长度)、连续(都是大大小小的连续实数)、稠密(向量中无没用的0元素,如one-hot就一大堆0)的向量。

稍稍看看有什么和决策树相似度高的词条(节点):

13. PCA降维可视化

256维的向量太不直观了,所以我们可以将其降维成2或3维,这样可以直观看到每个node编码后再降维所处的位置。

X = model.wv.vectors

# 将Embedding用PCA降维到2维
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
embed_2d = pca.fit_transform(X)

 

上面的节点都没有打标,我们可视化“计算机视觉”词条的二维embedding↓

term = 'computer vision'
term_256d = model.wv[term].reshape(1,-1)

term_2d = pca.transform(term_256d)

plt.figure(figsize=(14,14))
plt.scatter(embed_2d[:,0], embed_2d[:,1])
plt.scatter(term_2d[:,0],term_2d[:,1],c='r',s=200)
plt.show()

结果如下:

 

13. 结合PageRank,计算出PageRank节点重要度前三十的节点,再加上一些手动补充我们关心的节点,把这一些节点进行可视化在二维图里。

# 计算PageRank重要度
pagerank = nx.pagerank(G)
# 从高到低排序
node_importance = sorted(pagerank.items(), key=lambda x:x[1], reverse=True)

# 取最高的前n个节点
n = 30
terms_chosen = []
for each in node_importance[:n]:
    terms_chosen.append(each[0])

# 手动补充我们关心的节点
terms_chosen.extend(['computer vision','deep learning','convolutional neural network','convolution','natural-language processing','attention (machine learning)','support-vector machine','decision tree','random forest','computational imaging','machine vision','cognitive science','neuroscience','psychophysics','brain','visual cortex','visual neuroscience','cognitive model','finite difference','finite difference time domain','finite difference coefficients','finite difference methods for option pricing','iso 128','iso 10303'])
# 得到一个转换器term2index :输入词条,输出词典中的索引号
term2index = model.wv.key_to_index
# 可视化全部词条和关键词条的二维Embedding
plt.figure(figsize=(14,14))
plt.scatter(embed_2d[:,0], embed_2d[:,1])

for item in terms_chosen:
    idx = term2index[item]
    plt.scatter(embed_2d[idx,0], embed_2d[idx,1],c='r',s=50)
    plt.annotate(item, xy=(embed_2d[idx,0], embed_2d[idx,1]),c='k',fontsize=12)
plt.show()

 结果如下,不难发现相似的词条节点降维后聚在一起了:

14. PCA是线性降维算法,这里在用下流行的TSNE降维算法

# 将Embedding用TSNE降维到2维
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, n_iter=1000)
embed_2d = tsne.fit_transform(X)

plt.figure(figsize=(14,14))
plt.scatter(embed_2d[:, 0], embed_2d[:, 1])
plt.show()

将刚刚的PageRank节点重要度前三十的节点,再加上一些手动补充我们关心的节点再次展示在二维空间直角坐标系中。 

plt.figure(figsize=(14,14))
plt.scatter(embed_2d[:,0], embed_2d[:,1])

for item in terms_chosen:
    idx = term2index[item]
    plt.scatter(embed_2d[idx,0], embed_2d[idx,1],c='r',s=50)
    plt.annotate(item, xy=(embed_2d[idx,0], embed_2d[idx,1]),c='k',fontsize=12)
plt.show()

更多推荐

【记录】深度学习环境配置(pytorch版)

1080面对Transformer连勉强也算不上了,还是要去用小组的卡完整记一个环境配置,方便后面自用✍️目前要简单许多,因为显卡驱动已经装好,后安装的库版本与其对应即可。nvidia-smi查看GPU信息**CUDA版本12.2conda-V查询conda版本22.9.0新建conda环境准备装python3.8co

【PyTorch 攻略(5/7)】训练和模型

一、说明训练模型是一个迭代过程。每次迭代称为纪元。该模型对输出进行猜测,计算其猜测中的误差(损失),收集误差相对于其参数的导数,并使用梯度下降优化这些参数。我们从这里加载前面的代码。%matplotlibinlineimporttorchfromtorchimportnnfromtorch.utils.dataimpo

1399: 最小生成树

题目描述最小生成树问题是实际生产生活中十分重要的一类问题。假设需要在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路。这时,自然需要考虑这样一个问题,即如何在最节省经费的前提下建立这个通信网。可以用连通网来表示n个城市以及n个城市之间可能设置的通信线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋于边

Python中的函数未定义的错误

前言:嗨喽~大家好呀,这里是魔王呐❤~!python更多源码/资料/解答/教程等点击此处跳转文末名片免费获取通过这个解释,我们将了解当Python程序显示类似NameError:name‘’isnotdefined的错误时,即使该函数存在于脚本中,也会出现这种情况。我们还学习了当我们使用拼写错误的变量或没有导入的内置函

Zookeeper集群 + Kafka集群

目录1、Zookeeper1.1Zookeeper概述1.1.1Zookeeper定义1.1.2Zookeeper工作机制1.1.3Zookeeper特点1.1.4Zookeeper数据结构1.1.5Zookeeper应用场景1.2Zookeeper选举机制1.3部署Zookeeper集群1.3.1安装前准备1.3.2

肖sir___环境的讲解详情__002

一、环境讲解1、jdk什么是JDK?JDK的作用?JDK是java语言的软件开发工具包,能解释java程序,编译java语言,没有jdk的话无法编译Java程序。包含了各种类库和工具,机器不是直接识别语言的,会借助工具的编译器,可以理解为翻译官,将一门语言翻译为机器可以识别的语言,Jdk能对Java进行编译,我们的工具

人机合作的有效性、安全性和可信度

确定人机协同中权力归属的原则和方法可以根据具体情境和任务的要求进行灵活选择。以下是一些常见的方法:专业领域授权:在专业领域中,权力可能更多地授予具有相关知识和经验的人类专家。他们能够理解和分析复杂的情况,并基于其专业判断做出决策。机器可以作为工具或辅助手段,提供数据分析、模型预测等支持。分工合作:根据任务的不同阶段或特

java版Spring Cloud+Mybatis+Oauth2+分布式+微服务+实现工程管理系统

鸿鹄工程项目管理系统SpringCloud+SpringBoot+Mybatis+Vue+ElementUI+前后端分离构建工程项目管理系统1.项目背景一、随着公司的快速发展,企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,公司对内部工程管理的提升提出了更高的要求。二、企业通过

【JavaScript】video标签配置及相关事件:

文章目录一、标签配置:二、事件:三、案例:一、标签配置:标签名描述src要播放的路径地址autoplay是否自动播放,默认值是false,(Boolean)loop是否循环播放,默认值是false,(Boolean)muted是否静音播放,默认值是false,(Boolean)initial-time制定和视频初始播放

线性代数的本质(八)——内积空间

文章目录内积空间内积空间正交矩阵与正交变换正交投影施密特正交化实对称矩阵的对角化内积空间内积空间三维几何空间是线性空间的一个重要例子,如果分析一下三维几何空间,我们就会发现它还具有一般线性空间不具备的重要性质:三维几何空间中向量有长度和夹角,这称为三维几何空间的度量性质。现在,我们在一般线性空间中引入度量有关的概念。我

【面试刷题】——Qt使用的编译器

Qt可以使用多种不同的编译器,具体取决于你的开发环境和目标平台。以下是一些常见的Qt支持的编译器:MinGW:MinGW(MinimalistGNUforWindows)是Windows下的一个轻量级开发工具集,通常与Qt一起使用来开发Windows应用程序。Qt的官方发行版通常包括了MinGW编译器,以便在Windo

热文推荐