Deep walk模型 详细解释

1 数据解释
数据集:wiki数据集(2405个网页,17981条网页间的关系)
输入样本:node1 node2 <edge_weight>
输出:每个node的embedding

在这里插入图片描述

根据随机游走的序列,输入到word2vec的模型当中,然后就能训练后表示出该节点的embedding

2 代码思想

步骤① 构建一个有向图 ② 进行deepwalk取样本 ③ 输入到word2vec当中训练 ④ 得到了训练好的word2vec,进行evaluate
⑤ 数据分为x_train,x_test, 使用logistics函数,训练embedding后x_train对应的label,然后通过logstics函数预测x_test的标签(标签是0-16所属分类)
⑥画图

① 构建一个有向图

G = nx.read_edgelist('../data/wiki/Wiki_edgelist.txt',
                     create_using=nx.DiGraph(), nodetype=None, data=[('weight', int)])

② 进行deepwalk取样本 其中 deepwalk就是根据步长,进行深度优先遍历,如果该节点没有邻居节点了,就break出来
在这里插入图片描述

def deepwalk_walk(self, walk_length, start_node):
    walk = [start_node]
    while len(walk) < walk_length:
        cur = walk[-1]
        cur_nbrs = list(self.G.neighbors(cur))
        if len(cur_nbrs) > 0:
            walk.append(random.choice(cur_nbrs))
        else:
            break
    return walk

③ 输入到word2vec当中训练,得到该点的embedding表示

④ 得到了训练好的word2vec,得到了2405X128的embedding,然后进行模型的评价

class Classifier(object):

    def __init__(self, embeddings, clf):
        self.embeddings = embeddings
        self.clf = TopKRanker(clf)
        self.binarizer = MultiLabelBinarizer(sparse_output=True)   # multi one-hot


    def train(self, X, Y, Y_all):
        self.binarizer.fit(Y_all)
        X_train = [self.embeddings[x] for x in X]
        Y = self.binarizer.transform(Y)
        self.clf.fit(X_train, Y)

    def evaluate(self, X, Y):
        top_k_list = [len(l) for l in Y]
        Y_ = self.predict(X, top_k_list)
        Y = self.binarizer.transform(Y)
        averages = ["micro", "macro", "samples", "weighted"]
        results = {}
        for average in averages:
            results[average] = f1_score(Y, Y_, average=average)
        results['acc'] = accuracy_score(Y,Y_)
        print('-------------------')
        print(results)
        return results
        print('-------------------')

    def predict(self, X, top_k_list):
        X_ = numpy.asarray([self.embeddings[x] for x in X])
        Y = self.clf.predict(X_, top_k_list=top_k_list)
        return Y

    def split_train_evaluate(self, X, Y, train_precent, seed=0):
        state = numpy.random.get_state() # 使随机生成器保持相同状态

        training_size = int(train_precent * len(X))
        numpy.random.seed(seed)
        shuffle_indices = numpy.random.permutation(numpy.arange(len(X))) # 随机打乱顺序
        X_train = [X[shuffle_indices[i]] for i in range(training_size)]
        Y_train = [Y[shuffle_indices[i]] for i in range(training_size)]
        X_test = [X[shuffle_indices[i]] for i in range(training_size, len(X))]
        Y_test = [Y[shuffle_indices[i]] for i in range(training_size, len(X))]
        '''前面部分都是为了打乱顺序'''
        self.train(X_train, Y_train, Y)  # 把label转成Multi hot 形式,把x_train转成embedding形式
        numpy.random.set_state(state)
        return self.evaluate(X_test, Y_test)

⑤ 先使用split_train_evaluate 函数,
(1)打乱数据 (2)把embedding后的x_train与 转换为mulit-hot的 Y 通过logistics 模型进行训练
(3) 把测试数据x_test 传入 logistics模型,得到评估的F1 score

首先测试数据放进logistics模型,并选择topk的目标值,打上标签1
然后转换回label标签,通过f1 score进行计算

class TopKRanker(OneVsRestClassifier):
    def predict(self, X, top_k_list):
        probs = numpy.asarray(super(TopKRanker, self).predict_proba(X)) # 预测出来NX17,一共有17个label
        all_labels = []
        for i, k in enumerate(top_k_list):
            probs_ = probs[i, :]
            labels = self.classes_[probs_.argsort()[-k:]].tolist()
            probs_[:] = 0
            probs_[labels] = 1
            all_labels.append(probs_)
        return numpy.asarray(all_labels)

def evaluate(self, X, Y):
    top_k_list = [len(l) for l in Y]
    Y_ = self.predict(X, top_k_list)
    Y = self.binarizer.transform(Y)  # 转换为label值
    averages = ["micro", "macro", "samples", "weighted"]
    results = {}
    for average in averages:
        results[average] = f1_score(Y, Y_, average=average)
    results['acc'] = accuracy_score(Y,Y_)
    print('-------------------')
    print(results)
    return results
    print('-------------------')

⑥画图
通过TSNE进行降维,然后根据 embedding降维后与 wiki_labels的值对应上,画出二维效果图
在这里插入图片描述

参考文章:
https://zhuanlan.zhihu.com/p/56380812

DeepWalk是一种基于随机游走的图嵌入方法,可以将图中的节点映射到低维向量空间中,以便进行下游任务,如节点分类和社区发现。TensorFlow是一个流行的深度学习框架,可以用于训练DeepWalk模型。 下面是使用TensorFlow训练DeepWalk模型的简要步骤: 1. 准备数据集:将图数据集转换为网络邻接矩阵的形式,并将其传递给DeepWalk算法。 2. 定义模型DeepWalk模型由两个部分组成:随机游走和嵌入学习。随机游走生成节点序列,嵌入学习将节点序列映射到低维空间。可以使用TensorFlow定义这两个部分的模型。 3. 训练模型:使用TensorFlow的优化器和损失函数来训练DeepWalk模型。优化器的作用是最小化损失函数,以便将节点嵌入到低维空间中。 4. 评估模型:使用评估指标来评估DeepWalk模型的性能,例如节点分类和社区发现。 下面是一个使用TensorFlow训练DeepWalk模型的示例代码: ```python import tensorflow as tf import numpy as np # 定义模型超参数 num_nodes = 100 embedding_size = 50 num_walks = 10 walk_length = 80 window_size = 10 num_neg_samples = 5 learning_rate = 0.001 # 定义输入数据 adj_matrix = np.random.rand(num_nodes, num_nodes) input_data = tf.placeholder(tf.float32, shape=[num_nodes, num_nodes]) # 定义随机游走模型 walks = [] for i in range(num_walks): for j in range(num_nodes): curr_node = j walk = [curr_node] for k in range(walk_length - 1): neighbors = np.where(adj_matrix[curr_node,:] > 0)[0] if len(neighbors) == 0: break curr_node = np.random.choice(neighbors) walk.append(curr_node) walks.append(walk) walks = np.array(walks, dtype=np.int32) # 定义嵌入学习模型 embeddings = tf.Variable(tf.random_uniform([num_nodes, embedding_size], -1.0, 1.0)) embed = tf.nn.embedding_lookup(embeddings, walks) embed = tf.reshape(embed, [-1, embedding_size]) # 定义损失函数和优化器 targets = tf.placeholder(tf.int32, shape=[None, num_neg_samples + 1]) weights = tf.Variable(tf.truncated_normal([num_nodes, embedding_size], stddev=1.0 / np.sqrt(embedding_size))) biases = tf.Variable(tf.zeros([num_nodes])) loss = tf.reduce_mean(tf.nn.nce_loss(weights, biases, inputs=embed, labels=targets, num_sampled=num_neg_samples, num_classes=num_nodes)) optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss) # 训练模型 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(1000): _, curr_loss = sess.run([optimizer, loss], feed_dict={input_data: adj_matrix, targets: np.random.randint(num_nodes, size=[walks.shape[0], num_neg_samples + 1])}) print("Iteration: {}, Loss: {}".format(i, curr_loss)) # 评估模型 embeddings = sess.run(embeddings) # ... ``` 在此示例中,我们首先定义了DeepWalk模型的超参数,包括节点数量,嵌入维度,随机游走参数和优化器参数。接下来,我们使用numpy生成随机邻接矩阵,并定义输入数据。然后,我们定义随机游走模型,生成节点序列。最后,我们定义嵌入学习模型,并使用TensorFlow的优化器和损失函数来训练模型。最终,我们可以使用评估指标来评估模型的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值