python:在networkX中查找输入到输出路径
编辑:现在了解如何计算每个节点的“循环路径”的# 正如标题所说,我正在尝试创建一个函数,用于计算网络中任何节点的“信号路径”数。节点的信号路径是从多个输入之一到该节点所属的多个输出之一的路径。我使用的是一个已经有人提出的算法,它是一个生成器,返回从输入到输出的每条路径 然而,即使我的代码看起来是正确的,我也得到了错误的结果。下面是函数:python:在networkX中查找输入到输出路径,python,path,network-programming,bioinformatics,networkx,Python,Path,Network Programming,Bioinformatics,Networkx,编辑:现在了解如何计算每个节点的“循环路径”的# 正如标题所说,我正在尝试创建一个函数,用于计算网络中任何节点的“信号路径”数。节点的信号路径是从多个输入之一到该节点所属的多个输出之一的路径。我使用的是一个已经有人提出的算法,它是一个生成器,返回从输入到输出的每条路径 然而,即使我的代码看起来是正确的,我也得到了错误的结果。下面是函数: def signal_path_counter(G, inputs, outputs, node): c = 0 paths = []
def signal_path_counter(G, inputs, outputs, node):
c = 0
paths = []
for out in outputs:
for i in inputs:
for path in all_simple_paths(G, i, out):
paths.append(path)
for path in paths:
for n in path:
if(node == n):
c += 1
return c
以下是输入数据:
import networkx as nx
import matplotlib.pyplot as plt
G=nx.DiGraph()
molecules = ["CD40L", "CD40", "NF-kB", "XBP1", "Pax5", "Bach2", "Irf4", "IL-4", "IL-4R", "STAT6", "AID", "Blimp1", "Bcl6", "ERK", "BCR", "STAT3", "Ag", "STAT5", "IL-21R", "IL-21", "IL-2", "IL-2R"]
Bcl6 = [("Bcl6", "Bcl6"), ("Bcl6", "Blimp1"), ("Bcl6", "Irf4")]
STAT5 = [("STAT5", "Bcl6")]
IL_2R = [("IL-2R", "STAT5")]
IL_2 = [("IL-22", "IL-2R")]
BCR = [("BCR", "ERK")]
Ag = [("Ag", "BCR")]
CD40L = [("CD40L", "CD40")]
CD40 = [("CD40", "NF-B")]
NF_B = [("NF-B", "Irf4"), ("NF-B", "AID")]
Irf4 = [("Irf4", "Bcl6"), ("Irf4", "Pax5"), ("Irf4", "Irf4"), ("Irf4", "Blimp1")]
ERK = [("ERK", "Bcl6"), ("ERK", "Blimp1"), ("ERK", "Pax5")]
STAT3 = [("STAT3", "Blimp1")]
IL_21 = [("IL-21", "IL-21R")]
IL_21R = [("IL-21R", "STAT3")]
IL_4R = [("IL-4R", "STAT6")]
STAT6 = [("STAT6", "AID"), ("STAT6", "Bcl6")]
Bach2 = [("Bach2", "Blimp1")]
IL_4 = [("IL-4", "IL-4R")]
Blimp1 = [("Blimp1", "Bcl6"), ("Blimp1", "Bach2"), ("Blimp1", "Pax5"), ("Blimp1", "AID"), ("Blimp1", "Irf4")]
Pax5 = [("Pax5", "Pax5"), ("Pax5", "AID"), ("Pax5", "Bcl6"), ("Pax5", "Bach2"), ("Pax5", "XBP1"), ("Pax5", "ERK"), ("Pax5", "Blimp1")]
edges = Bcl6 + STAT5 + IL_2R + IL_2 + BCR + Ag + CD40L + CD40 + NF_B + Irf4 +
ERK + STAT3 + IL_21 + IL_21R + IL_4R + STAT6 + Bach2 + IL_4 + Blimp1 + Pax5
G.add_nodes_from(molecules)
G.add_edges_from(edges)
sources = ["Ag", "CD40L", "IL-2", "IL-21", "IL-4"]
targets = ["XBP1", "AID"]
输入网络的可视化表示
给出错误结果0的函数调用:
print(signal_path_counter(G, sources, targets, "IL-2R"))
您的打字错误在这一行:
IL_2 = [("IL-22", "IL-2R")]
应该是
IL_2 = [("IL-2", "IL-2R")]
您的代码可以做一些事情,使其更“pythonic”。通过使用,可以更干净地对多个组合进行迭代,这将替换
out
和i
上的循环
for input, output in itertools.product(inputs, outputs):
for path in all_simple_paths(G, input, output):
paths.append(...)
另外,不要先建立路径,然后通过路径循环来测试节点是否在其中,而是直接进行测试,而不是附加到路径上:
for input, output in itertools.product(inputs, outputs):
for path in all_simple_paths(G, input, output):
if node in path:
c += 1
即使对于这段代码,我认为也可以使用计数器
使其更干净。基本上,如果您正在执行variable+=1
,或者在迭代时将元素添加到列表中,通常会有一种“更具python风格”的方法来执行此操作
我关心的是这个算法在更大的网络中的可扩展性。找到所有的路径是昂贵的。最好从节点
开始,构建从节点
到输出
的所有路径,以及从输入
到节点
的所有路径。然后将每条路径转换为一个集合[将其转换为集合会加快下一步的速度]。然后穿过进出通道,看看它们是否有交叉点。如果没有,那么就有一个通过节点的路径
这将大大减少你必须考虑的路径数(也可能是路径的长度)。
所以,不,如果你看图表的视觉表示,源和目标只是输入和输出节点,我们用来计算从任何输入到任何输出的X路径数。IL-2R是一个正在进行的节点,我想得到一个计数器,它显示IL-2R在这些输入到输出路径中出现的次数。这是我在函数中返回的计数。感谢您提出如何优化此计数的想法。现在,我正在写一篇论文,将只使用2个这样大小的网络,所以幸运的是,对我来说效率不是一个大问题。接下来的问题,我需要为每个节点计算的另一个值是“反馈循环”,这意味着节点在循环路径中出现了多少次。有没有内置的算法?我需要知道更多的“循环路径”到底是什么。我可以想出几个可能的定义…这是一条可以重复的路径,也就是导致循环的路径。就像节点A->节点B->节点Z->节点A一样,如果这些路径存在,这将被视为一个循环。这里显然不考虑输入/输出,因为没有任何东西导致输入,也没有任何东西从输出输出。循环路径中可以有多个循环,还是只能重复节点A?