微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

networkx:如何设置自定义费用功能?

如何解决networkx:如何设置自定义费用功能?

我正在遵循networkx文档(1),并且我想对成本函数设置不同的罚款(例如node_del_costnode_ins_cost)。可以说,我想对节点的删除/插入进行三点惩罚。

到目前为止,我已经创建了两个无向图,它们通过标记节点C(更新代码)而有所不同。

import networkx as nx

G=nx.Graph()
G.add_nodes_from([("A",{'label':'CDKN1A'}),("B",{'label':'CUL4A'}),("C",{'label':'RB1'})])

G.add_edges_from([("A","B"),("A","C")])

H=nx.Graph()
H.add_nodes_from([("A",{'label':'AKT'})])
H.add_edges_from([("A","C")])

# arguments
# node_match – a function that returns True if node n1 in G1 and n2 in G2 should be considered equal during matching.
# ignored if node_subst_cost is specified
def node_match(node1,node2):
    return node1['label']==node2['label']

# node_subst_cost - a function that returns the costs of node substitution
# overrides node_match if specified.
def node_subst_cost(node1,node2): 
    return node1['label']==node2['label']

# node_del_cost - a function that returns the costs of node deletion
# if node_del_cost is not specified then default node deletion cost of 1 is used.
def node_del_cost(node1):
    return node1['label']==3    

# node_ins_cost - a function that returns the costs of node insertion
# if node_ins_cost is not specified then default node insertion cost of 1 is used.
def node_ins_cost(node2):
    return node2['label']==3    

paths,cost = nx.optimal_edit_paths(G,H,node_match=None,edge_match=None,node_subst_cost=node_subst_cost,node_del_cost=node_del_cost,node_ins_cost=node_ins_cost,edge_subst_cost=None,edge_del_cost=None,edge_ins_cost=None,upper_bound=None)

# length of the path
print(len(paths))

# optimal edit path cost (graph edit distance).
print(cost)

这给了我2.0作为最佳路径成本,给了7.0作为路径长度。但是,我不完全理解为什么,因为我将惩罚设为3.0,所以编辑距离预计为3。

谢谢您的建议!

Olha

解决方法

如文档中所述,当您传递node_subst_cost函数作为参数时,即使节点相等,它也会忽略node_match函数并为任何替换操作应用成本。因此,我建议您首先在node_subst_cost函数中评估节点的相等性,然后相应地应用成本:

def node_subst_cost(node1,node2):
    # check if the nodes are equal,if yes then apply no cost,else apply 3
    if node1['label'] == node2['label']:
        return 0
    return 3


def node_del_cost(node):
    return 3  # here you apply the cost for node deletion


def node_ins_cost(node):
    return 3  # here you apply the cost for node insertion


paths,cost = nx.optimal_edit_paths(
    G,H,node_subst_cost=node_subst_cost,node_del_cost=node_del_cost,node_ins_cost=node_ins_cost
)

print(cost)  # which will return 3.0

您也可以对边缘操作执行相同的操作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。