如何在图形(NetworkX/Python)中查找两个节点之间的相似性

如何在图形(NetworkX/Python)中查找两个节点之间的相似性,python,graph,nodes,networkx,similarity,Python,Graph,Nodes,Networkx,Similarity,我已经检查了之前关于NetworkX的SO问题,大多数问题都是关于图形相似性的,但不是关于节点相似性的。 我希望评估图中两个节点的相似性,但我不能转换为属性的向量空间并这样做,因为有些属性没有内在的顺序。举例说明: 在这里,人类观察者很清楚,巧克力甜甜圈更类似于环形甜甜圈,而不是庞德蛋糕,但如何从图表中提取这些信息呢?通过比较每个节点的输入和输出弧与其他节点的输入和输出弧,我大致可以猜到一个人是如何以蛮力的方式做到这一点的,但“正确”的方法是什么呢 此外,我还需要能够设置约束(例如,“在图形中

我已经检查了之前关于NetworkX的SO问题,大多数问题都是关于图形相似性的,但不是关于节点相似性的。 我希望评估图中两个节点的相似性,但我不能转换为属性的向量空间并这样做,因为有些属性没有内在的顺序。举例说明:

在这里,人类观察者很清楚,巧克力甜甜圈更类似于环形甜甜圈,而不是庞德蛋糕,但如何从图表中提取这些信息呢?通过比较每个节点的输入和输出弧与其他节点的输入和输出弧,我大致可以猜到一个人是如何以蛮力的方式做到这一点的,但“正确”的方法是什么呢

此外,我还需要能够设置约束(例如,“在图形中获取最类似于巧克力甜甜圈的对象,该对象没有洒点”,等等)。因此,如果该方法只在约束范围内搜索,这是一个额外的好处,这样我就不必在之后过滤结果


使用的库不一定是NetworkX,任何在Python中工作的库都可以。

当前通过递归获取所有后继对象来获取子图,如下所示:

def get_all_successors(G, node):
    succs = {node}; nxt={node}
    #Get all successors recursively
    while len(nxt)>0:
        nxt = nxt.union(set(G.successors(nxt.pop())))
        succs = succs.union(nxt)

    return succs

def get_subgraph(G, node):
    return nx.subgraph(G,get_all_successors(G, node))
因为在我的网络中,属性在层次上比对象低,这给了我每个对象的子图,然后我可以使用拉普拉斯谱将它与另一个对象进行比较


我很想听到关于这种方法的反馈,因为这对我来说似乎是特别的。

这是一个相当广泛的问题。关于为“相似”定义函数,首先需要考虑的是。所以您需要定义一个相似性度量,可以是您提到的输入和输出节点的共享id的数量。在这样做之后,我会先用蛮力试一下。只是为了证明康泽普。(因为《蛮力》写得很快)看看潘多拉寻找类似歌曲的方法。谢谢你的建议,但我觉得把属性转换成向量是行不通的。对于潘多拉来说,它们的系统发育有着有限的层次,但我的目标是用它们自己的属性等扩展到属性的多个递归深度——因此使用了图形。我觉得创建一个组件及其属性的子图,然后将该子图与另一个组件及其属性的子图进行比较是正确的做法,但不确定如何在networkx中做到这一点。测试了此实现,但它没有达到预期效果。依赖于使用拉普拉斯谱的“图形”比较使得它过于关注输入/输出弧的数量,因此实际上忽略了每个特定节点的“属性”。我尝试为节点和边添加权重,但这并不能解决这个基本问题。有人有更好的方法来比较子图吗?编辑距离似乎很有希望,但尚未找到Python实现。。。。