Machine learning 如何使用节点嵌入进行链接预测?

Machine learning 如何使用节点嵌入进行链接预测?,machine-learning,graph,recommendation-engine,word-embedding,Machine Learning,Graph,Recommendation Engine,Word Embedding,我目前正在推荐系统中做一个项目嵌入任务,我想评估新嵌入算法和旧嵌入算法的性能。我读过一些关于图嵌入的文章,几乎每一篇文章都提到一种评估嵌入的常规方法,即链接预测。但这些报纸都没有确切描述你是如何做到这一点的。所以我的问题是如何使用链接预测来评估嵌入 我尝试应用的算法是: 首先,在用户单击序列上构建一个有向图,图中的每个节点表示一个项目,如果用户单击了项目a,然后单击了B,则应该有两个节点a和B以及一个权重为1的边a-B。当另一个用户单击A然后单击B时,边A-B的权重加1。 然后,使用出站权重作为

我目前正在推荐系统中做一个项目嵌入任务,我想评估新嵌入算法和旧嵌入算法的性能。我读过一些关于图嵌入的文章,几乎每一篇文章都提到一种评估嵌入的常规方法,即链接预测。但这些报纸都没有确切描述你是如何做到这一点的。所以我的问题是如何使用链接预测来评估嵌入

我尝试应用的算法是: 首先,在用户单击序列上构建一个有向图,图中的每个节点表示一个项目,如果用户单击了项目a,然后单击了B,则应该有两个节点a和B以及一个权重为1的边a-B。当另一个用户单击A然后单击B时,边A-B的权重加1。 然后,使用出站权重作为远程传输概率,通过随机遍历图生成一个新的序列数据集。 最后,对新序列执行SkipGram以生成节点嵌入

正如许多论文提到的,我删除了图中一定比例的边作为测试集的阳性样本(例如0.25),并随机生成了一些伪边作为阴性边。那么接下来呢?我是否应该简单地为训练集中的真实边生成假边,在每条边上连接两个节点的嵌入,并构建一个公共分类器(如logistic回归)并在测试集上进行测试?或者我应该用两个节点的余弦相似性和一个0/1的标签计算测试集上的AUC,该标签指示两个节点是否真的连接?或者我应该用两个节点嵌入的Sigmoid点积和0/1的标签来计算AUC,表明两个节点是否真的连接,因为这是计算最后一层概率的方法

#以下是描述上述三种方法的示例
item_emb=np.random.random(400).重塑(100,4)#假设我们有100个项,并将它们嵌入到一个四维向量空间中。
test_node=np.random.randint(0,100,size=200)。重塑(100,2)#假设我们有100对节点
test_label=np.random.randint(0,2,size=100)。重塑(100,1)#假设这是指示这对节点是否真正连接的标签
def测试_A():
#使用逻辑回归
列车节点=…#以类似的方式生成真节点对和假节点对
列车标签=…#以类似的方式生成真节点对和假节点对
训练专长=np.hstack(
项目emb[列车节点[:,0]],
项目_emb[列车_节点[:,1]]#连接嵌入件
测试功能=np.hstack(
项目emb[测试节点[:,0]],
项目_emb[测试_节点[:,1]]#连接嵌入
lr=sklearn.linear\u models.logistic回归().fit(训练专长,训练标签)
auc=roc\U auc\U分数(测试标签,lr.预测概率(测试专长)[:,1])
返回auc
def测试_B():
#使用余弦相似性
emb1=项目\u emb[测试节点[:,0]]
emb2=项目\u emb[测试节点[:,1]]
余弦sim=emb1*emb2/(np.linalg.norm(emb1,轴=1)*np.linalg.norm(emb2,轴=1)
auc=roc\U auc\U分数(测试标签,余弦sim)
返回auc
def测试_C():
#使用点积
#这里,我们从训练网络中提取softmax权重和偏差
softmax_weights=…#与项目_emb形状相同
softmax_偏差=…#的形状(项目形状[0],1)
嵌入的_项=项_emb[测试_节点[:,0]]#目标项嵌入
softmaxed_上下文=softmax_权重[测试节点[:,1]]+softmax_偏差
点生产=np.sum(嵌入项目*软最大化上下文,轴=1)
auc=roc\U auc\U分数(测试标签、点产品)
返回auc

我已经在几个测试中尝试了这三种方法,但它们并不总是告诉我们相同的事情其他指标不好,有些则相反……等等。遗憾的是,没有这样一个参数组合在所有三个指标中的表现都超过其他指标……问题是我应该使用哪一个指标?

您应该研究一些实现:

  • 星图:
  • 放大仪:
  • 简单地说,我们应该从原始图中采样边(而不是节点!),删除它们,然后学习截断图上的嵌入。然后对删除的边执行计算

    此外,还有两种可能的情况:

    • 在这种情况下,当我们学习分类器来区分正边缘和负边缘时,评估指标是ROC AUC
    • 只观察到正(真实)边。我们不知道在真实世界中是否连接了rest对。在这里,我们为每个正边生成负(假)节点。该任务被视为具有下一个评估指标的实体排序:

    在第5.1-5.3节中可以找到一个例子。

    我面临着同样的问题。你找到解决方案了吗?我的主要问题是:我们应该在什么时候提取节点嵌入?在列车/测试拆分之前还是之后?如果我们在拆分之前提取节点嵌入,那么嵌入会保留网络的拓扑结构,因此它们会影响链路预测。另一方面,如果我们在xtract嵌入拆分后,同一节点在训练集和测试集中可能有不同的表示形式。对于您的问题,我的建议是,您应该始终从训练集中提取嵌入,并在测试集中测试嵌入,并且没有要从测试集中提取的嵌入。提取嵌入是正确的因此,拆分会导致数据泄漏。