2015-03-15 5 views
4

У меня есть ориентированный взвешенный график, который я создал с помощью networkx.Networkx Статистический вывод

Я пытаюсь создать статистические выводы в этой сети, но у меня проблемы. Вот они:

(i) Средняя степень сети. (Единственное, что я мог найти, это average_degree_connectivity, который возвращает словарь, а не один поплавок со средней степенью всей сети).

(ii) Средневзвешенная степень сети. (такие же, как указано выше)

(iii) Средний коэффициент кластеризации сети. (Я знаю, что мне нужно использовать nx.average_clustering (g), однако как я могу принять во внимание тот факт, что это взвешенный ориентированный граф? Я продолжаю получать ошибку: NetworkXError: («Алгоритмы кластеризации не определены», для ориентированных графов. '))

Спасибо!

ответ

5

(i) The Average degree of the network. (The only one I could find was average_degree_connectivity, which returns a dictionary and not a single float with the average degree of the whole network)

Предполагая, что ваш объект Graph является G.

degrees = G.degree() 
sum_of_edges = sum(degrees.values()) 

Расчет среднего значения - это вопрос деления на количество узлов.

(ii) The Average weighted degree of the network. (same as above)

Получить список всех узлов, для каждого из них получить список всех ребер, для каждого из них сумму до собственность вес:

edgesdict = G.edge 
total = 0 
for node_adjacency_dict in edgesdict.valuess(): 
    total += sum([adjacency.get("weight",0) for adjacency in node_adjacency_dict.values()]) 

(iii) The Average clustering coefficient of the network. (I know that I have to use nx.average_clustering(g), however how do I take the fact that it is weighted directed graph into consideration? I keep getting the error: NetworkXError: ('Clustering algorithms are not defined ', 'for directed graphs.'))

Дело в том, что это не определен, пока вы его не определите. По-моему, это немного важно сделать для ответа StackOverflow, поэтому я оставляю вам проблему с определением алгоритма для вашей конкретной проблемы.

(iv) The maximum shortest path length in the giant component of the network. (i know you find the giant component as such: giant = max(nx.connected_component_subgraphs(G), key=len) but how do we get the max shortest path length in it?)

запустить ipython или что-то в этом роде. Введите giant.; вы получите список вещей, которые вы можете сделать с giant.

+0

Спасибо! он работает для первой части, и я уверен, что теперь смогу понять вторую, чтобы понять логику. Но для точки (iii) я не совсем понимаю, что это означает, когда он говорит, что алгоритм кластеризации не определен. Все, что я сделал, это создать DiGraph, называемый g, и добавить к нему узлы и взвешенные ребра. Затем я назвал nx.average_clustering (g). Не могли бы вы уточнить больше PLZ? – BKS

1

Вот еще несколько идей, которые можно добавить к тому, что написал @ marcus-müller.

Для средней степени (примечание для вашего орграфа это сумма в и градусах)

In [1]: import networkx as nx 
G 
In [2]: G = nx.DiGraph() 

In [3]: G.add_edge(1,2,weight=7) 

In [4]: G.add_edge(3,4,weight=17) 

In [5]: sum(G.degree().values())/float(len(G)) 
Out[5]: 1.0 

In [6]: sum(G.degree(weight='weight').values())/float(len(G)) 
Out[6]: 12.0 

Там нет определения для взвешенного направленного кластеризация в NetworkX. Были предложения https://github.com/networkx/networkx/issues/859, но никто еще не закончил реализацию.

Для ориентированных графов понятие наибольшего связного компонента разбивается на два определения. Слабосвязанными компонентами являются те, которые связаны, когда вы рассматриваете неориентированную версию графика (замените каждый направленный край на неориентированный). Сильно соединенные компоненты - это те компоненты, где каждая пара узлов достижима друг от друга (имеет путь).

+0

Вы можете создать неориентированный граф таким образом. Но сначала вы должны решить, что вы хотите измерить относительно своего графика. – Aric

0

Что касается точки (я): Средняя степень сети, для ориентированных графов, NetworkX внутренне вычисляет его следующим образом:

nnodes = G.number_of_nodes() 
deg = sum(d for n, d in G.in_degree())/float(nnodes) 
info += "Average in degree: %8.4f\n" % deg 
deg = sum(d for n, d in G.out_degree())/float(nnodes) 
info += "Average out degree: %8.4f" % deg 

Вы можете check it on github.

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