2013-12-18 2 views
5

У меня есть сеть, для которой я пытаюсь найти наилучшее возможное представление графика. Я не теоретик-график, а биолог, поэтому, пожалуйста, прошу прощения за мою техническую сущность.Возможно использование многострочного графика NetworkX?

В настоящее время сеть может быть представлена ​​следующим образом: «n» уровни сетей, каждый из которых содержит разные множества ребер между узлами. Каждое ребро направлено и имеет связанную с ним вероятность, но свойство вероятности не используется до конца. Каждый слой хранится в виде отдельного графика в виде файла CSV в представлении списка смежности.

Используя представление списка смежности, у меня есть «итоговый» слой, в котором я сжимаю все «n» слои, причем каждый уровень вносит значение «+1» в весовые коэффициенты между каждым узлом. В настоящее время он хранится в виде отдельного графика в виде файла CSV в представлении списка смежности.

Если между парой узлов было «n» ребер, то в суммарном слое там был бы край «n»; может быть только «n» или меньше ребер между любой парой узлов.

У меня также есть слой «только полный», который состоит только из краев с весом «n». Аналогично, в настоящее время хранится как файл CSV, в представлении списка смежности.

И наконец, у меня есть «наиболее вероятный полный». В этом слое вероятности набираются. Для каждого из краев «полного только» слоя я умножаю все вероятности, связанные с каждым из n ребер (напомним: «полный» слой представляет собой сумму «n» ребер , каждое ребро с вероятностью).

В моем анализе этой сети иногда удобно переключаться между любыми слоями «n» и «сводными» слоями. Тем не менее, наиболее удобный формат минимально хранение (т.е. без предварительного вычисления либо) для хранения отдельных краев в виде таблицы (показано ниже):

|Node 1 | Node 2 | Layer 1 Weight | Layer 2 Weight | ... | Layer n Weight | 
|-------|--------|----------------|----------------|-----|----------------| 
| x | y | 0.99   |  1.00  | ... |  1.00  | 
| x | z | 0.98   |  1.00  | ... |  0.97  | 
| y | z | 0 (no edge) |  1.00  | ... |  1.00  | 

я говорю, что этот формат удобен, потому что я могу создать такую ​​таблицу очень легко.

Итак, вот мой вопрос: возможно ли в NetworkX хранить такой график (многослойный, направленный на каждый слой)? Если бы это было возможно, я бы предположил, что умею писать функции для вычисления, на лету, «сводного» графика, графа «полный» и «наиболее вероятного полномасштабного» графика, поскольку они являются подмножествами друг друга. Я также могу представить себе функции, которые вычисляют другие графики, такие как график, который также включает в себя дополнительные множества кратных ребер в узлы, которые не имеют полных ребер, входящих в каждый узел.

Однако, проверяя документацию NetworkX, я не могу найти ничего похожего на то, что я ищу. Лучшее, что я мог найти, это «мультиграфик», который допускает множественные ребра между узлами, но каждое ребро должно быть неориентировано. Я что-то упустил?

Кроме того, есть ли лучшее представление о том, чего я пытаюсь достичь? Опять же, мне не хватает опыта теории графов здесь, поэтому я мог бы что-то упустить. Большое спасибо (заранее) всем, кто требует времени ответить!

+0

Что было бы проблемой при использовании N DiGraphs? – Back2Basics

+0

Это может сработать, но мне нужно будет удерживать графики N + 3 (от 1 до N для каждого слоя, а затем итоговые, полные и наиболее вероятные уровни) и получить доступ к интересующему графу. Я также должен обновить каждый из графиков, если базовые данные изменятся, что может увеличить время вычислений. – ericmjl

+0

Изменяется ли направление края между слоями? – Back2Basics

ответ

6

Существует MultiDiGraph() объект в NetworkX, которые могли бы работать в вашем случае. Вы можете хранить несколько направленных ребер, каждый из которых имеет произвольные атрибуты. Узлы также могут иметь произвольные атрибуты.

In [1]: import networkx as nx 

In [2]: G = nx.MultiDiGraph() 

In [3]: G.add_edge(1,2,color='green') 

In [4]: G.add_edge(1,2,color='red') 

In [5]: G.edges(data=True) 
Out[5]: [(1, 2, {'color': 'green'}), (1, 2, {'color': 'red'})] 

In [6]: G.node[1]['layer1']=17 

In [7]: G.node[1]['layer2']=42 

In [8]: G.nodes(data=True) 
Out[8]: [(1, {'layer1': 17, 'layer2': 42}), (2, {})] 

Есть некоторые вспомогательные функции для получения и установки атрибутов узла, которые могут быть полезными, например.

In [9]: nx.get_node_attributes(G,'layer1') 
Out[9]: {1: 17} 
+0

Ничего себе, Aric, как обычно, вы приходите на помощь. Спасибо за ответ, по какой-то причине я просто не смог найти объект MultiDiGraph() в документации NetworkX. Я предполагаю, что это займет определенную степень формального обучения, чтобы признать эти условия. – ericmjl

0

В сетиx есть атрибут «вес» по краям, и на самом деле вес может быть любым объектом. Таким образом, вы можете позволить весу быть списком, в котором хранятся все значения вероятности в каждом слое. i.e: weight = [.99, .57, .0, .89]

Вопрос в том, как определить границу между двумя узлами. просто имеет вероятность больше нуля или существует порог.Вы можете написать код, как sum([ 1 for i in weight if i > 0 ]) или sum([ 1 for i in weight if i > threshold ]) если вам нужна вероятность просто заменить 1 на г, как sum([ i for i in weight if i > ..])

Смежные вопросы