代码运行

对给定的图数据集生成节点的embedding:

  • 先对图中的节点进行随机游走
  • 再将随机游走的路径作为Word2Vec的输入,生成节点的embedding

执行代码如下:

python __main__.py --input ../example_graphs/karate.adjlist --output ../example_graphs/karate.embeddings
python __main__.py --format mat --input ../example_graphs/blogcatalog.mat --number-walks 80 --representation-size 128 --walk-length 40 --window-size 10 --workers 1 --output ../example_graphs/blogcatalog.embeddings
python scoring.py --emb blogcatalog.embeddings --network blogcatalog.mat --num-shuffle 10 --all

下面是对各个文件进行的简单分析。

main.py

# __main__.py
import graph
import walks

graph里面有random walk
walks里也有random walk
两者的主要区别是前者针对小数据,后这针对大数据,前者采样的路径不会被序列化,后者会被序列化的本地磁盘.但是后者使用的randwalk仍然是graph里定义的方法,实际上是在调用graph.

parser.add_argument('--format', default='adjlist',help='File format of input file')

这里程序允许三种类型的输入( ‘adjlist’,‘edgelist’,‘mat’),默认是’adjlist’。

if data_size < args.max_memory_data_size:print("Walking...")walks = graph.build_deepwalk_corpus(G, num_paths=args.number_walks,path_length=args.walk_length, alpha=0, rand=random.Random(args.seed))print("Training...")model = Word2Vec(walks, size=args.representation_size, window=args.window_size, min_count=0, sg=1, hs=1, workers=args.workers)

这里调用build_deep_corpus,是从每个节点开始进行多次随机游走。

num_path:设置了从一个节点开始的次数

path_length:设置了一个随机游走的长度

alpha:以概率1-alpha从当前节点继续走下去,或者以alpha的概率停止

训练的过程是要将随机游走得到的walks放进Word2Vec模型,从而得到节点对应的embedding.

else:print("Data size {} is larger than limit (max-memory-data-size: {}).  Dumping walks to disk.".format(data_size, args.max_memory_data_size))print("Walking...")walks_filebase = args.output + ".walks"walk_files = serialized_walks.write_walks_to_disk(G, walks_filebase, num_paths=args.number_walks, path_length=args.walk_length, alpha=0, rand=random.Random(args.seed), num_workers=args.workers)print("Counting vertex frequency...")if not args.vertex_freq_degree:vertex_counts = serialized_walks.count_textfiles(walk_files, args.workers)else:# use degree distribution for frequency in treevertex_counts = G.degree(nodes=G.iterkeys())print("Training...")walks_corpus = serialized_walks.WalksCorpus(walk_files)model = Skipgram(sentences=walks_corpus, vocabulary_counts=vertex_counts,size=args.representation_size,window=args.window_size, min_count=0, trim_rule=None, workers=args.workers)

当指定内存不足以存放游走结果,游走的路径会被存入一系列文件output.walks.x中。程序结束后会出现两个文件,一个是file_path,一个是file_path.walks.0,file_path.walks.1,…file_path.walks.x。
file_path存的是各个节点的embedding,
output.walks.x存的是采样的游走路径,x表示这个文件是第x个处理器存入的。

其实,只需要知道serialized_walks.write_walks_to_disk本质上也是在调用graph里的randwalk,只不过包装了一下,加入了并行化代码和写到磁盘的程序。

graph.py

def __init__(self):super(Graph, self).__init__(list)# super().__init__(list) #python 3.x中的语法

这里,构建的图是一个字典,key是节点,key对应的value是list。

如果构建了一个graph实例然后输出出来,会得到:

defaultdict(<class 'list'>,{1: [2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 18, 20, 22, 32],2: [1, 3, 4, 8, 14, 18, 20, 22, 31],……34: [9, 10, 14, 15, 16, 19, 20, 21, 23, 24, 27, 28, 29, 30, 31, 32, 33]}
)def make_undirected(self):t0 = time()for v in self.keys():for other in self[v]:if v != other:self[other].append(v)t1 = time()logger.info('make_directed: added missing edges {}s'.format(t1-t0))self.make_consistent()return selfdef make_consistent(self):t0 = time()for k in iterkeys(self):self[k] = list(sorted(set(self[k])))t1 = time()logger.info('make_consistent: made consistent in {}s'.format(t1-t0))self.remove_self_loops()return selfdef remove_self_loops(self):removed = 0t0 = time()for x in self:if x in self[x]: self[x].remove(x)removed += 1t1 = time()logger.info('remove_self_loops: removed {} loops in {}s'.format(removed, (t1-t0)))return selfdef check_self_loops(self):for x in self:for y in self[x]:if x == y:return Truereturn Falsedef random_walk(self, path_length, alpha=0, rand=random.Random(), start=None):""" Returns a truncated random walk.path_length: Length of the random walk.alpha: probability of restarts.start: the start node of the random walk."""G = selfif start:path = [start]else:# Sampling is uniform w.r.t V, and not w.r.t Epath = [rand.choice(list(G.keys()))]while len(path) < path_length:cur = path[-1]if len(G[cur]) > 0:if rand.random() >= alpha:   #这条语句成立的概率是1-alpha,即以1-alpha的概率从当前节点继续向前走,以alpha的概率restartpath.append(rand.choice(G[cur]))else:path.append(path[0])else:breakreturn [str(node) for node in path]

Graph类中的这些函数主要是为了检查生成的随机游走路径,需要去掉重复节点,去掉自循环。

random_walk函数是要生成以startnode开始的随机游走路径。

def build_deepwalk_corpus(G, num_paths, path_length, alpha=0,rand=random.Random(0)):walks = []nodes = list(G.nodes())print(nodes)for cnt in range(num_paths):rand.shuffle(nodes)for node in nodes:walks.append(G.random_walk(path_length, rand=rand, alpha=alpha, start=node))return walks

这个函数能够对一个图生成一个语料库,即从每个节点开始的多次随机游走路径。

def build_deepwalk_corpus_iter(G, num_paths, path_length, alpha=0,rand=random.Random(0)):walks = []nodes = list(G.nodes())for cnt in range(num_paths):rand.shuffle(nodes)for node in nodes:yield G.random_walk(path_length, rand=rand, alpha=alpha, start=node)

这个函数也是生成语料库,只不过是迭代生成的。适用于设定内存不足以保存路径的情况。

walks.py

def count_words(file):""" Counts the word frequences in a list of sentences.Note:This is a helper function for parallel execution of `Vocabulary.from_text`method."""c = Counter()with open(file, 'r') as f:for l in f:words = l.strip().split()c.update(words)return cdef count_textfiles(files, workers=1):c = Counter()with ProcessPoolExecutor(max_workers=workers) as executor:for c_ in executor.map(count_words, files):c.update(c_)return c

这里有两个计算词频的函数。

count_words的参数file中每行是一个walk,函数最终返回这个file中每个单词出现的次数。

count_textfiles是使用了多线程的技巧:ProcessPoolExecutor方法

可以了解一下python并行编程:python并行编程 中文版

def write_walks_to_disk(G, filebase, num_paths, path_length, alpha=0, rand=random.Random(0), num_workers=cpu_count(),always_rebuild=True):global __current_graph__current_graph = Gfiles_list = ["{}.{}".format(filebase, str(x)) for x in list(range(num_paths))]expected_size = len(G)args_list = []files = []if num_paths <= num_workers:paths_per_worker = [1 for x in range(num_paths)]else:paths_per_worker = [len(list(filter(lambda z: z!= None, [y for y in x])))for x in graph.grouper(int(num_paths / num_workers)+1, range(1, num_paths+1))]with ProcessPoolExecutor(max_workers=num_workers) as executor:for size, file_, ppw in zip(executor.map(count_lines, files_list), files_list, paths_per_worker):if always_rebuild or size != (ppw*expected_size):args_list.append((ppw, path_length, alpha, random.Random(rand.randint(0, 2**31)), file_))else:files.append(file_)

这里是将walks写入文件。

DeepWalk代码解释相关推荐

  1. ViSP中识别AprilTag的C++实例代码解释

    VISP中识别AprilTag的C++实例代码解释 接着上一篇: VISP中识别AprilTag的C++实例代码与运行结果 先展示代码,一句一句解释吧 #include <visp3/detec ...

  2. 最小操作系统的代码解释、NASM的初步使用

    一.最小操作系统的代码解释 很多资料上都有最小操作系统代码,即从裸机开始运行.引导机器.显示 hello world 并进入循环等待的代码:下面对代码进行一下大体的解释: org 07c00h; 告诉 ...

  3. ML之sklearn:sklearn的make_pipeline函数、RobustScaler函数、KFold函数、cross_val_score函数的代码解释、使用方法之详细攻略

    ML之sklearn:sklearn的make_pipeline函数.RobustScaler函数.KFold函数.cross_val_score函数的代码解释.使用方法之详细攻略 目录 sklear ...

  4. OpenCV用代码解释单应性的基本概念

    OpenCV用代码解释单应性的基本概念 用代码解释单应性的基本概念 基础理论 单应矩阵是什么? 单应变换如何有用? 示范代码 从共面点估计姿势 用代码解释单应性的基本概念 基础理论 单应矩阵是什么? ...

  5. 基于vue2.0实现音乐/视频播放进度条组件的思路及具体实现方法+代码解释

    基于vue2.0实现音乐/视频播放进度条组件的方法及代码解释 需求分析: ①:进度条随着歌曲的播放延长,歌曲播放完时长度等于黑色总进度条长度:时间实时更新. ②:当滑动按钮时,实时更新播放时间,橙色进 ...

  6. 【Python笔记】列表基础操作 :创建,增加、删除、查询。附加:练习题。用简单代码解释。

    Python:列表基础操作 创建,增加.删除.查询.附加练习题.用简单代码解释. 目录 Python:列表基础操作 演示环境 第一部分:列表(list) 1. 创建空列表 2. 创建只有默认值的列表 ...

  7. Jena学习三——代码解释

    代码解释 可以直接官网学习http://jena.apache.org/tutorials/rdf_api.html#ch-Jena%20RDF%20Packages Tutorial01 packa ...

  8. 播放失败246106异常代码_美的燃气热水器修理分享(附代码解释)

    上门检修一台美的强排热水器. 试机检查:打开水流,强排风机虽转,未听到燃气电磁阀吸合和燃气火力声音,出水口也只有冷水流出,几秒后显示E2.查相应的代码解释E2:风压异常或风机故障.但观风机运行速度声音 ...

  9. 最简版Seq2Seq的英法机器翻译实践和详细代码解释

    Seq2Seq的英法机器翻译实践 本文的内容主要是基于英法平行语料库来实现一个简单的英法翻译模型.没有使用注意力机制和双向LSTM等技术,主要是为了掌握基本的Seq2Seq结构和TensorFlow函 ...

最新文章

  1. R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(分组调色板填充、自定义调色板、灰度比例)实战(dot plot)
  2. ORACLE空值漫谈2
  3. openssl在64位的机器上编译32位的库
  4. C/C++输入输出函数(I/O)总结
  5. 点云三角化之后还能贴图嘛_雪糕化了之后重新冷冻还能吃吗?宁波这个实验真相了!...
  6. java源码影视源码搭建教程_新版千月影视app源码+搭建教程
  7. java嵌套循环语句_Java学习笔记(七) 循环语句
  8. 嘉年华回顾丨 王津银带你深入解析自动化运维能力框架
  9. java JDBC 连接数据库查询数据与直接使用sql的疑问
  10. 架构师的职责都有哪些?
  11. 作业帮电脑版在线使用_应届生应聘作业帮的在线辅导老师
  12. 知物由学 | 如何应对日益强大的零日攻击
  13. OA系统四级模块编写测试用例(用户模块)
  14. Redis过期策略详解
  15. 零基础如何学习视频制作?超全干货!手把手教你好上手的视频制作技巧
  16. Java:pdf文件中添加图片
  17. K8S资源quota配置引起的问题
  18. r230服务器装系统教程,DELL r230 安装centos7.4记录
  19. 利用计算机本地文档重装系统,电脑如何用本地模式重装win10
  20. 计算机开机最快,教你如何让你的电脑快速开机

热门文章

  1. 新浪微博SDK抛出异常-[__NSDictionaryM weibosdk_WBSDKJSONString]:
  2. Linux过时了(2)(Linus vs. Tanenbaum的中文翻译)
  3. 前后端分离下微信登录高并发问题
  4. 弘辽科技:这些大商家退出中国了
  5. MATLAB BPSK调制与解调
  6. 变频器按启动没反应_变频器无法启动?原因竟然是干扰
  7. 步进式解读RT-Thread所遵循的Apache许可证
  8. 计算机组成原理考研辅导讲义,计算机组成原理考研辅导
  9. 1056 Mice and Rice
  10. git 使用——git从远程仓库下载项目