LINE实现(python

LINE实现(python

标签(空格分隔): 假装科研 代码


2021314
今天的日期还挺美好,只是人各为己,哪来什么天长地久

LINE实现代码,上次在B站看了一个UP的视频,学到一手检索github的方法,甚是不错。

今天遇到一个十分奇怪的问题,其实好几天前就有了,就是pycharm里面建好了虚拟环境,也安装好了包,进入虚拟环境后pip list里面也是可以列出来的,但是代码里面导入包的时候还是会爆红,暂时还未解决。。。


啊~ 晓得是什么问题了。当我把文件夹名从毕业设计改为gugu的时候,就不会爆红了。gugu不好大家别学。主要原因还是路径中出现了中文命名的缘故。啥时候中文跟计算机的交流也能够跟英文一样顺畅就好咯

首先是能将LINE跑通,安装了许许多多的包之后,终于跑通了~
应该是包的版本问题,LINE里面ge/models/line.py中tf.reduce_sum里的参数keep_dims删除下划线。


LINE代码实现过程以及结果评价指标

变量:
idx2node # 数组 存储图的结点
node2idx #字典 结点->编号(0,1,2…
negative_ratio # 整数 设置为5
samples_per_epoch = edge_size*(1+negative_ratio)

函数:
图构建:networkx.read_edgelist 代码中所用txt文件只有两节点,未给出权重

create sampling table for vertex

_gen_sampling_table()
power = 0.75 # 3/4
numNodes # 图结点数
node_degree # 图结点出度 结点编号->结点出边权重之和,图中边权为1
total_sum # ∑ i = 1 ∣ V ∣ d i 3 / 4 \sum_{i=1}^{|V|}d_i^{3/4} i=1Vdi3/4
norm_prob # 列表 [ d i 3 / 4 / t o t a l s u m ] [d_i^{3/4}/total_sum] [di3/4/totalsum]
self.node_accept, self.node_alias = create_alias_table(norm_prob)

实现别名表 代码

area_ratio_ # np数组 [norm_prob[i]*numNodes] 存储结点出度
accept # 数组 存储别名表中每个组成单位中较小概率的结点编号->概率
alias # 数组 存储别名表中每个组成单位的结点编号对应关系
reset_model(self, opt='adam')
create_model(node_size, rep_size, order)
node_size # 图的结点数
rep_size = embedding_size # 默认8,测试为128
order # first second all 默认为second
图嵌入利用了tensorflow.python.keras.layers中的Embedding,Input,Lambda
关于tensorflow的词嵌入部分

03.16大体上通了一遍LINE的实现,不过里面的核心还是用了深度学习框架的API做的,另外代码具体在完成什么工作还不太清楚,明天除了搞懂代码中用到的tf库之外,还要弄懂代码测试数据的理论输出是什么,以及整个代码究竟在干啥。

03.17 7:50 头铁小🐏来了~
今天搞完就现在了。。。难顶
我有亿点点疲倦,但不大想回宿舍。。。还是乖乖啃代码叭~
啃到最后,才发现其核心实现竟然是用tensorflow做的

03.18 忙了点工作,找了个深度学习的课程,跟着做了一个词嵌入的实现,mooc的实训平台真不戳~

03.19 继续看LINE的python实现代码,希望今天能彻底了解清楚它在干啥。。

继续啃模型建立
v_i # 实例化keras张量
v_j # 实例化keras张量
first_emb # Embedding(numNodes, embedding_size, name=‘first_emb’)
second_emb # Embedding(numNodes, embedding_size, name=‘second_emb’)
context_emb # Embedding(numNodes, embedding_size, name=‘context_emb’)
Q:这里的name是任意字符串均可吗?
A:可以,只是一个命名而已,但不能重复
v_i_emb # first_emb(v_i)
v_j_emb # first_emb(v_j)
v_i_emb_second # second_emb(v_i)
v_j_context_emb # context_emb(v_j)

first #
model建立整体看起来,像是只是限制好输入输出数据的格式,里面的原理貌似在机器学习那本书里有一些,明天记得看一下子

model.compile # 模型编译
batch_iter(node2idx)
edges # 将图的边设计的结点转化为对应的编号
data_size # 图的边数
shuffle_indices # 长为data_size的数组,里面为[0,data_size-1]的不重复随机数
mod # 0
mode_size # 1+negative_ratio 初始6
h # 数组
count # 初始0
主要完成:根据别名表选取边
--------------------------LINE模型构建部分完成------------------------
train(batch_size=1024, epochs=1, initial_epoch=0, verbose=1, times=1)
reset_training_config(batch_size, times)
step_per_epoch # ((samples_per_epoch - 1) // batch_size + 1)*times
model.fit_generator # 使用python生成器逐批训练数据
generator # 生成器 batch_it
epoch # 训练轮数
initial_epoch # 开始训练的轮次(有助于恢复之前的训练)???
steps_per_epoch # 整数,当生成器返回steps_per_epoch次数据时计一个epoch结束,执行下一个epoch
verbose # 日志显示 1为输出进度条记录 2为每个epoch输出一条记录
--------------------------LINE模型训练部分完成-----------------------
evaluate_embedding # 多标签分类
split_train_evaluate(X, Y, train_precent, seed=0)
X # 结点
Y # 标签
train_precent # 训练样本比例
首先将样本分解为训练样本和测试样本,接下来进行训练(分类)
train
binarizer = MultiLabelBinarizer(sparse_output=True)
clf = TopKRanker(clf)
TopKRanker(clf) # 这个函数没有init函数。。咋个执行法呢???
X_train # 训练数据结点的向量表示
Y = binarizer.transform(Y) # 训练标签预处理
clf.fit(X_train, Y)
---------------------------embedding分类训练完成---------------------
evaluate(X_test, Y_test)
averages = [“micro”, “macro”, “samples”, “weighted”] # 这是几种不同的评估模型准确性的方法

到此,也算是整体梳理了一遍LINE的python实现,接下来就是要开始对其中的训练步骤作详细的原理性学习了~主要是框架封装的太好(雾
灵魂三问:
嵌入所用的损失函数以及优化器是什么?
结果评估时的分类算法数学原理是啥?
预测完成后的四个average算法原理是啥?

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值