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

news2024/11/28 14:30:12

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()

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

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

相关文章

分享一个基于uniapp+springboot技术开发的校园失物招领小程序(源码、lw、调试)

💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…

海国图志#7:这一周难忘瞬间,吐血整理,不得不看

这里记录每周值得分享的新闻大图,周日发布。 文章以高清大图呈现,解说以汉语为主,英语为辅,英语句子均来自NYTimes、WSJ、The Guardian等权威媒体原刊。 归档时段:20230911-20230917 摩洛哥,阿米茨米兹 在阿…

calibre和cpolar搭建一个私有的网络书库

Kindle中国电子书店停运不要慌,十分钟搭建自己的在线书库随时随地看小说! 文章目录 Kindle中国电子书店停运不要慌,十分钟搭建自己的在线书库随时随地看小说!1.网络书库软件下载安装2.网络书库服务器设置3.内网穿透工具设置4.公网…

树莓派4b装系统到运行 Blazor Linux 本地程序全记录

在Linux下运行gui程序,咱也是第一次做,属于是瞎子过河乱摸一通,写得有什么不对和可以优化的地方,希望各位看官斧正斧正. ##1. 下载烧录器 https://www.raspberrypi.com/software/####我选择的是Raspbian 64位系统,并配置好ssh账号密码,wifi,以便启动后可以直接黑屏ssh连接 ##…

全流程HEC-RAS 1D/2D水动力与水环境模拟丨恒定流模型(1D/2D)、一维非恒定流、二维非恒定流模型、HEC-RAS水质模型

目录 ​专题一 ​水动力模型基础 专题二 恒定流模型(1D/2D) 专题三 一维非恒定流 专题四 二维非恒定流模型(一) 专题五 二维非恒定流模型(二) 专题六 HEC-RAS的水质模型 专题七 高级主题 更多应用 水动力与水环境模型的数…

【自学开发之旅】Flask-会话保持-API授权-注册登录

http - 无状态-无法记录是否已经登陆过 #会话保持 – session cookie session – 保存一些在服务端 cookie – 保存一些数据在客户端 session在单独服务器D上保存,前面数个服务器A,B,C上去取就好了,业务解耦。—》》现在都是基于token的验证。 以上是基…

stm32学习笔记:GPIO输入

1、寄存器输入输出函数 //读取输入数据寄存器某一个端口的输入值,参数用来指定某一个端口,返回值是 uint8_t类型,用来代表高低电平(读取按键的值)uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_…

JVM调优笔记

双亲委派机制 app---->ext----->bootstrap 保证系统的核心库不被修改 沙箱安全机制 限制系统资源访问,将java代码限制在虚拟机特定的运行范围中 基本组件 字节码校验器 确保java类文件遵循java规范,帮助java程序实现内存保护类加载器 native…

基于SSM的北京集联软件科技有限公司信息管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

博客摘录「 MobaXterm登录密码重置」2023年9月21日

登录MobaXterm提示输入密码, 而且还 忘记密码 安装重置密码的工具 可以使用浏览器打开 如下网址: https://mobaxterm.mobatek.net/resetmasterpassword.html 打开如图: 下载MobaXterm软件密码重置工具,下载好并解压后 直接…

第二证券:创业板指失守2000点 算力概念股走势活跃

周三,沪深两市继续缩量震动调整,三大指数均小幅下跌,创业板指失守2000点整数关口,再创调整新低。到收盘,上证综指报3108.57点,跌0.52%;深证成指报10072.46点,跌0.53%;创业…

Python机器学习实战-特征重要性分析方法(1):排列重要性(附源码和实现效果)

实现功能 排列重要性 PermutationImportance:该方法会随机排列每个特征的值,然后监控模型性能下降的程度。如果获得了更大的下降意味着特征更重要 实现代码 from sklearn.datasets import load_breast_cancer from sklearn.ensemble import RandomFore…

应用程序处理:TCP模块的处理

1、应用程序处理 首先应用程序会进行编码处理,这些编码相当于 OSI 的表示层功能; 编码转化后,邮件不一定马上被发送出去,这种何时建立通信连接何时发送数据的管理功能,相当于 OSI 的会话层功能。 2、TCP 模块的处理 …

共聚焦显微镜在化学机械抛光课题研究中的应用

两个物体表面相互接触即会产生相互作用力,研究具有相对运动的相互作用表面间的摩擦、润滑与磨损及其三者之间关系即为摩擦学,目前摩擦学已涵盖了化学机械抛光、生物摩擦、流体摩擦等多个细分研究方向,其研究的数值量级也涵盖了亚纳米到百微米…

MYSQL不常用但好用写法

ORDER BY FIELD() 自定义排序逻辑 MySql 中的排序 ORDER BY 除了可以用 ASC 和 DESC,还可以通过 「ORDER BY FIELD(str,str1,…)」 自定义字符串/数字来实现排序。这里用 order_diy 表举例,结构以及表数据展示: ORDER BY FIELD(str,str1,…) …

【Excel加密】excel只读模式在哪里设置

Excel文件想要设置成只读模式,其实很简单,今天给大家分享四个excel设置只读模式的方法。 方法一:文件属性 右键点击文件,查看文件属性,在属性界面,勾选上只读属性就可以了。 方法二:始终以只读…

pixel2的root过程

用adb连接手机 首先学会用adb连接手机 可以配置在主机Windows和虚拟机上 手机打开设置,连续点击版本号进入开发者模式 点击进入开发者选项,允许USB调试,连接在电脑上,在手机授权对话框中允许电脑调试 连接完成后,输…

eslint代码校验及修复(Vue项目快速上手)

项目中配置eslint校验 文章目录 项目中配置eslint校验前言1. webpack5搭建 Vue项目如下🔗(可以查看)2. eslint+prettier Vue项目如下🔗(暂时未更新)一、什么是 ESLint?二、为什么要使用 ESLint?三、如何在 Vue 项目中集成 ESLint?3.1.安装依赖代码如下:如下图所示3…

视频定格合璧,批量剪辑轻松插入图片

大家好!想要将视频与图片完美融合吗?现在,我们为您推出一款强大的批量剪辑工具,让您能够轻松在图片中插入视频,让您的创作更加精彩动人! 首先,第一步我们要进入媒体梦工厂主页面,并…

Wolfram语言之父:ChatGPT到底能做什么? | 阿Q送书第六期

文章目录 那么,ChatGPT到底在做什么?它为什么能做到这些?前方的路为ChatGPT赋予“思想”留言提前获赠书 人类语言及其背后的思维模式在结构上比我们想象的更简单、更“符合规律”。 ChatGPT大火,甚至已经开始改变人类的工作和思考…